diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f81000f2ea..e523bd3298 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,7 +41,7 @@ jobs: - uses: pnpm/action-setup@v2 name: Install pnpm with: - version: 8 + version: 9 run_install: false - name: Get pnpm store directory diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 14f9daeed1..9366648a63 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -28,7 +28,7 @@ jobs: - uses: pnpm/action-setup@v2 name: Install pnpm with: - version: 8 + version: 9 run_install: false - name: Get pnpm store directory @@ -60,6 +60,5 @@ jobs: - name: Run tests env: - OP_E2E_DISABLE_PARALLEL: true - OP_E2E_USE_CANYON: true + OP_E2E_DISABLE_PARALLEL: false run: make test diff --git a/Makefile b/Makefile index e7c3ed71ee..b374368f90 100644 --- a/Makefile +++ b/Makefile @@ -30,7 +30,7 @@ test: go test ./kroma-bindings/... go test ./kroma-chain-ops/... go test ./kroma-validator/... - go test ./op-e2e/... -timeout 30m # requires a minimum of 30min in a CI + go test ./op-e2e/... -timeout 30m # a maximum of 30min in a CI pnpm test .PHONY: test diff --git a/funding.json b/funding.json new file mode 100644 index 0000000000..cd9176255f --- /dev/null +++ b/funding.json @@ -0,0 +1,5 @@ +{ + "opRetro": { + "projectId": "0x8c76c13d8d0e63a7de499d47b9da5a4495d1151c0b2003c92379f41f14e404c0" + } +} diff --git a/kroma-bindings/artifacts.json b/kroma-bindings/artifacts.json index ab8253db0f..b1363668a2 100644 --- a/kroma-bindings/artifacts.json +++ b/kroma-bindings/artifacts.json @@ -20,6 +20,7 @@ "L2OutputOracle", "L2StandardBridge", "L2ToL1MessagePasser", + "MintManager", "ProtocolVault", "Proxy", "ProxyAdmin", @@ -29,6 +30,8 @@ "SystemConfig", "TimeLock", "UpgradeGovernor", + "AssetManager", + "ValidatorManager", "ValidatorPool", "ValidatorRewardVault", "WETH9", diff --git a/kroma-bindings/bindings/assetmanager.go b/kroma-bindings/bindings/assetmanager.go new file mode 100644 index 0000000000..49ce218899 --- /dev/null +++ b/kroma-bindings/bindings/assetmanager.go @@ -0,0 +1,3071 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// AssetManagerMetaData contains all meta data concerning the AssetManager contract. +var AssetManagerMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_assetToken\",\"type\":\"address\",\"internalType\":\"contractIERC20\"},{\"name\":\"_kgh\",\"type\":\"address\",\"internalType\":\"contractIERC721\"},{\"name\":\"_securityCouncil\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_validatorRewardVault\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_validatorManager\",\"type\":\"address\",\"internalType\":\"contractIValidatorManager\"},{\"name\":\"_minDelegationPeriod\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_bondAmount\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ASSET_TOKEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BOND_AMOUNT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DECIMAL_OFFSET\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"KGH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIERC721\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_DELEGATION_PERIOD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"SECURITY_COUNCIL\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"TAX_DENOMINATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"TAX_NUMERATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIValidatorManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_REWARD_VAULT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bondValidatorKro\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"canUndelegateKghAt\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"canUndelegateKroAt\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"canWithdrawAt\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"claimKghReward\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"decreaseBalanceWithChallenge\",\"inputs\":[{\"name\":\"loser\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegate\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"assets\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateKgh\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateKghBatch\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[{\"name\":\"assets\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"depositToRegister\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"assets\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"withdrawAccount\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getKghNum\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getKghReward\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getKroAssets\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getKroTotalShareBalance\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWithdrawAccount\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBalanceWithChallenge\",\"inputs\":[{\"name\":\"winner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"challengeReward\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"increaseBalanceWithReward\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"baseReward\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"boostedReward\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"validatorReward\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"onERC721Received\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"previewDelegate\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"assets\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"previewUndelegate\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"shares\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"reflectiveWeight\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"revertDecreaseBalanceWithChallenge\",\"inputs\":[{\"name\":\"loser\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"totalKghNum\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalKroAssets\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalValidatorKro\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalValidatorKroBonded\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"totalValidatorKroNotBonded\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"unbondValidatorKro\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"undelegate\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"assets\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"undelegateKgh\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenId\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"undelegateKghBatch\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"assets\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"Deposited\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"KghBatchDelegated\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"KghBatchUndelegated\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"tokenIds\",\"type\":\"uint256[]\",\"indexed\":false,\"internalType\":\"uint256[]\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"KghDelegated\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"tokenId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"KghRewardClaimed\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"KghUndelegated\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"tokenId\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"KroDelegated\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"},{\"name\":\"shares\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"KroUndelegated\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"},{\"name\":\"shares\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorKroBonded\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"},{\"name\":\"remainder\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorKroUnbonded\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"},{\"name\":\"remainder\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Withdrawn\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ImproperValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientAsset\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientShare\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTokenIdsInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotAllowedCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotAllowedZeroInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotElapsedMinDelegationPeriod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ZeroAddress\",\"inputs\":[]}]", + Bin: "0x6101606040523480156200001257600080fd5b50604051620040e5380380620040e58339810160408190526200003591620000ac565b6001600160a01b0396871660805294861660a05292851660c05290841660e052909216610100526001600160801b039182166101205216610140526200014f565b6001600160a01b03811681146200008c57600080fd5b50565b80516001600160801b0381168114620000a757600080fd5b919050565b600080600080600080600060e0888a031215620000c857600080fd5b8751620000d58162000076565b6020890151909750620000e88162000076565b6040890151909650620000fb8162000076565b60608901519095506200010e8162000076565b6080890151909450620001218162000076565b92506200013160a089016200008f565b91506200014160c089016200008f565b905092959891949750929550565b60805160a05160c05160e051610100516101205161014051613dcf620003166000396000818161078b01528181611cd801528181611fc1015281816121ed0152818161226d015281816123cf0152612a4601526000818161085c015281816120dc015281816123200152612b5a01526000818161072b0152818161099b01528181610a9201528181610b98015281816110990152818161115401528181611532015281816115ed01528181611c4f01528181611da301528181611ed601528181611f4a0152818161215601528181612359015281816124ab01528181612566015281816127510152818161281001528181612d9701528181612e9401526132d10152600081816107b2015261286c01526000818161040b015281816128de0152818161291a01528181612f0a01528181612f5f0152612fdf0152600081816104df01528181610ee8015281816112d50152818161179e0152611b4701526000818161082b01528181610b0e01528181610fd8015281816112200152818161147a015281816116f401528181611bc701528181612658015281816128ab0152818161295801528181612e0001528181612f3d01528181612fbd015261321d0152613dcf6000f3fe608060405234801561001057600080fd5b50600436106102f45760003560e01c80638abf0af011610191578063b172597e116100e3578063c2d9b68411610097578063d706200511610071578063d706200514610826578063de7d4d6a1461084d578063fdbb3fd21461085757600080fd5b8063c2d9b684146107d4578063c42996d614610800578063c7ab2c071461081357600080fd5b8063b744d2f9116100c8578063b744d2f914610773578063bcacc70a14610786578063c0a63a79146107ad57600080fd5b8063b172597e1461074d578063b55cd78e1461076057600080fd5b8063a51c9ace11610145578063a85120e41161011f578063a85120e414610700578063ad42945114610713578063ae9483e01461072657600080fd5b8063a51c9ace146106d2578063a63b8d14146106da578063a8387172146106ed57600080fd5b8063913f1a9f11610176578063913f1a9f14610655578063960a08931461068a578063981cee531461069d57600080fd5b80638abf0af01461062f5780638c1516c71461064257600080fd5b806354469aea1161024a5780636b9ffeac116101fe578063833a333b116101d8578063833a333b146105c5578063842d0d3b146105d857806386d18a941461061c57600080fd5b80636b9ffeac1461053d5780637db41f971461057257806382dae3aa146105bd57600080fd5b80635636aabd1161022f5780635636aabd146104c757806356576b5b146104da5780635959b7651461050157600080fd5b806354469aea1461046b57806354fd4d501461047e57600080fd5b8063209a9694116102ac5780633608641711610286578063360864171461040657806340ce01f114610445578063536afae41461045857600080fd5b8063209a9694146103b5578063270a1644146103e057806331d8e007146103f357600080fd5b806319412a20116102dd57806319412a201461037c5780631e5d81781461038f5780631f86f4f1146103a257600080fd5b806308fab167146102f9578063150b7a021461030e575b600080fd5b61030c61030736600461382c565b61087e565b005b61034661031c366004613863565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b61030c61038a3660046138fe565b610b8d565b61030c61039d366004613943565b610cc7565b61030c6103b03660046139c9565b61105e565b6103c86103c336600461382c565b611407565b6040516001600160801b039091168152602001610373565b61030c6103ee3660046139f3565b61141c565b61030c610401366004613943565b6114f7565b61042d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610373565b61030c6104533660046139c9565b611989565b6103c86104663660046139f3565b611c42565b61030c610479366004613a0e565b611d30565b6104ba6040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516103739190613a5e565b6103c86104d53660046139f3565b611f3d565b61042d7f000000000000000000000000000000000000000000000000000000000000000081565b6103c861050f3660046139f3565b6001600160a01b0316600090815260208190526040902060020154600160801b90046001600160801b031690565b6103c861054b3660046139f3565b6001600160a01b03166000908152602081905260409020600301546001600160801b031690565b6103c8610580366004613aaf565b6001600160a01b0391821660009081526020818152604080832093909416825260069092019091522054600160801b90046001600160801b031690565b6103c8601481565b6103c86105d3366004613aaf565b612028565b6103c86105e6366004613aaf565b6001600160a01b03918216600090815260208181526040808320939094168252600590920190915220546001600160801b031690565b6103c861062a366004613ae2565b6120a1565b6103c861063d3660046139f3565b612112565b61030c6106503660046139f3565b61214b565b6103c86106633660046139f3565b6001600160a01b03166000908152602081905260409020600401546001600160801b031690565b6103c861069836600461382c565b6122f2565b6103c86106ab3660046139f3565b6001600160a01b03166000908152602081905260409020600201546001600160801b031690565b6103c8606481565b6103c86106e83660046139f3565b6122fe565b61030c6106fb3660046139f3565b61234e565b6103c861070e36600461382c565b61246e565b61030c610721366004613b1e565b612805565b61042d7f000000000000000000000000000000000000000000000000000000000000000081565b6103c861075b3660046139f3565b612af2565b6103c861076e366004613aaf565b612b2a565b61030c61078136600461382c565b612b8f565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b61042d7f000000000000000000000000000000000000000000000000000000000000000081565b61042d6107e23660046139f3565b6001600160a01b039081166000908152602081905260409020541690565b6103c861080e36600461382c565b612e87565b6103c8610821366004613aaf565b613040565b61042d7f000000000000000000000000000000000000000000000000000000000000000081565b6103c8620f424081565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b6001600160a01b0382811660009081526020819052604090205483911633146108d3576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816001600160801b0316600003610916576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42610920846122fe565b6001600160801b03161115610961576040517f285d5a9200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f970531c10000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015242917f00000000000000000000000000000000000000000000000000000000000000009091169063970531c190602401602060405180830381865afa1580156109e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a089190613b78565b6001600160801b03161115610a49576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a53838361307e565b6040517f5bab847f0000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152600160248301527f00000000000000000000000000000000000000000000000000000000000000001690635bab847f90604401600060405180830381600087803b158015610ad657600080fd5b505af1158015610aea573d6000803e3d6000fd5b5050506001600160a01b03808516600090815260208190526040902054610b4092507f0000000000000000000000000000000000000000000000000000000000000000821691166001600160801b038516613131565b6040516001600160801b03831681526001600160a01b038416907fab48b3d59a240196dc5bdd7f7a638fca310f8194c7d350c3dd7765861311ddf8906020015b60405180910390a2505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bef576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116610c2f576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03838116600090815260208190526040812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001692841692909217909155610c8390849084906131fd565b6040516001600160801b03831681526001600160a01b038416907fadb1a06aea2cd2ff20eac971640a5eb7d687df3e3a897be2f334836494958a4790602001610b80565b6000819003610d02576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383166000908152602081815260408083203384526006019091528120905b82811015610e5a57816001016000858584818110610d4857610d48613b95565b602090810292909201358352508101919091526040016000908120546001600160801b03169003610da5576040517fe77a0da400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42610dc98633878786818110610dbd57610dbd613b95565b905060200201356120a1565b6001600160801b03161115610e0a576040517f285d5a9200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816001016000858584818110610e2257610e22613b95565b6020908102929092013583525081019190915260400160002080546fffffffffffffffffffffffffffffffff19169055600101610d28565b506000610e678533613333565b6001600160a01b0386166000908152602081815260408083206004810180546fffffffffffffffffffffffffffffffff1981166001600160801b039182168b900382161790915533855260069091019092529091208054808316600160801b91829004841688900390931602919091179055905060005b83811015610fbb577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166342842e0e3033888886818110610f2957610f29613b95565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b158015610f9857600080fd5b505af1158015610fac573d6000803e3d6000fd5b50505050806001019050610ede565b506001600160801b03811615611008576110086001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016336001600160801b038416613131565b336001600160a01b0316856001600160a01b03167f6fcfb0c3a157955b6809f57bb114c142779ab9b7dd686a1b28ec0f2c9edfb94386868560405161104f93929190613c13565b60405180910390a35050505050565b8160026040517f30ccebb50000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f000000000000000000000000000000000000000000000000000000000000000016906330ccebb590602401602060405180830381865afa1580156110e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111049190613c6f565b600581111561111557611115613c40565b10806111bf57506040517f56b65e970000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000016906356b65e9790602401602060405180830381865afa15801561119b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111bf9190613c90565b156111f6576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112028433613333565b90506001600160801b0381161561129a576112506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016336001600160801b038416613131565b6040516001600160801b038216815233906001600160a01b038616907ff31a7084636b55317cfeed458343e6f580e12d52ba89be9f1faae91731fcce429060200160405180910390a35b6040517f42842e0e000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906342842e0e90606401600060405180830381600087803b15801561132157600080fd5b505af1158015611335573d6000803e3d6000fd5b505050506001600160a01b038416600090815260208181526040808320338452600681018352818420600490910180546001600160801b03808216600190810182166fffffffffffffffffffffffffffffffff19938416179093558354600160801b808204831685018316029082161784558987529190920190935292208054429092169190921617905560405183815233906001600160a01b038616907f7a9043ba5086cf56c416db64f7608d06eae96d08a7e35a101ad4f42aab23585d906020015b60405180910390a350505050565b600061141383836133d2565b90505b92915050565b60006114288233613333565b9050806001600160801b031660000361146d576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114aa6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016336001600160801b038416613131565b6040516001600160801b038216815233906001600160a01b038416907ff31a7084636b55317cfeed458343e6f580e12d52ba89be9f1faae91731fcce429060200160405180910390a35050565b8260026040517f30ccebb50000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f000000000000000000000000000000000000000000000000000000000000000016906330ccebb590602401602060405180830381865afa158015611579573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159d9190613c6f565b60058111156115ae576115ae613c40565b108061165857506040517f56b65e970000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000016906356b65e9790602401602060405180830381865afa158015611634573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116589190613c90565b1561168f576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008290036116ca576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006116d68533613333565b90506001600160801b0381161561176e576117246001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016336001600160801b038416613131565b6040516001600160801b038216815233906001600160a01b038716907ff31a7084636b55317cfeed458343e6f580e12d52ba89be9f1faae91731fcce429060200160405180910390a35b6001600160a01b0385166000908152602081815260408083203384526006019091528120905b848110156118c3577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166342842e0e33308989868181106117df576117df613b95565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b15801561184e57600080fd5b505af1158015611862573d6000803e3d6000fd5b505050504282600101600088888581811061187f5761187f613b95565b90506020020135815260200190815260200160002060006101000a8154816001600160801b0302191690836001600160801b03160217905550806001019050611794565b506001600160a01b0386166000908152602081815260408083206004810180546fffffffffffffffffffffffffffffffff1981166001600160801b039182168b0182161790915533855260069091019092529091208054808316600160801b918290048416880190931602919091179055336001600160a01b0316866001600160a01b03167fafdb227ea10128ee703397dbff24db1f7c90303e6fff8068a2712a1b10c935f18787604051611979929190613cb2565b60405180910390a3505050505050565b6001600160a01b03821660009081526020818152604080832033845260060182528083208484526001810190925282205490916001600160801b0390911690036119ff576040517fe77a0da400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42611a0b8433856120a1565b6001600160801b03161115611a4c576040517f285d5a9200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611a588433613333565b9050611b0c8433856001600160a01b03928316600090815260208181526040808320949095168252600684018152848220600490940180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001600160801b03808316820181166fffffffffffffffffffffffffffffffff19938416179093558654600160801b808204851690920184169091029216919091178555928252600190930190925291902080549091169055565b6040517f42842e0e000000000000000000000000000000000000000000000000000000008152306004820152336024820152604481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906342842e0e90606401600060405180830381600087803b158015611b9357600080fd5b505af1158015611ba7573d6000803e3d6000fd5b505050506001600160801b03811615611bf757611bf76001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016336001600160801b038416613131565b604080518481526001600160801b038316602082015233916001600160a01b038716917fd1343dccf52a899cdc8aaa99714d930d2871b21c218512c779ca3f7c7fddab4191016113f9565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611ca6576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b038116600090815260208190526040902060020180546fffffffffffffffffffffffffffffffff197f0000000000000000000000000000000000000000000000000000000000000000600160801b8084046001600160801b0390811683018116909102928316938116928116929092178101909116919091179091555b919050565b806001600160801b0316600003611d73576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040517f30ccebb50000000000000000000000000000000000000000000000000000000081523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906330ccebb590602401602060405180830381865afa158015611df2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e169190613c6f565b6005811115611e2757611e27613c40565b03611e5e576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e6a338260016131fd565b6040516001600160801b038216815233907fadb1a06aea2cd2ff20eac971640a5eb7d687df3e3a897be2f334836494958a479060200160405180910390a26040517fe428c2f40000000000000000000000000000000000000000000000000000000081523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e428c2f490602401600060405180830381600087803b158015611f2257600080fd5b505af1158015611f36573d6000803e3d6000fd5b5050505050565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611fa1576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b038116600090815260208190526040902060020180547f00000000000000000000000000000000000000000000000000000000000000006001600160801b03600160801b808404821683900382160280821693821693909317829003166fffffffffffffffffffffffffffffffff199290921691909117909155919050565b6001600160a01b038083166000908152602081815260408083209385168352600684019091528120600483015481549293926001600160801b03600160801b909204821691859161207a911683613cf5565b83546120969190600160801b90046001600160801b0316613d1d565b979650505050505050565b6001600160a01b0380841660009081526020818152604080832093861683526006909301815282822084835260010190529081205461210a907f0000000000000000000000000000000000000000000000000000000000000000906001600160801b0316613d4c565b949350505050565b6001600160a01b03811660009081526020819052604081206002810154600390910154611416916001600160801b039081169116613d4c565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146121ad576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600090815260208190526040812060020180549091906121e9906001600160801b03600160801b820481169116613cf5565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160801b0316816001600160801b03161015612257576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81546001600160801b03600160801b80830482167f00000000000000000000000000000000000000000000000000000000000000009081018316909102919092161783556001600160a01b038416907f7ad6f32675ff7ed77c34b45d23cd987ea6a62560f390baac683de0bc6b24fb7e906122d28185613cf5565b604080516001600160801b03938416815292909116602083015201610b80565b60006114138383613452565b6001600160a01b038116600090815260208190526040812060010154611416907f0000000000000000000000000000000000000000000000000000000000000000906001600160801b0316613d4c565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146123b0576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600081815260208190526040902060020180547f00000000000000000000000000000000000000000000000000000000000000006001600160801b03600160801b8084048216839003821681029382168481178087559596957fc8d4f2228d78be7d0ca97344025aae4f9bc2c87ece32295d72791a4d39f2a71a9561244794939091048316921617613cf5565b604080516001600160801b0393841681529290911660208301520160405180910390a25050565b60008260026040517f30ccebb50000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f000000000000000000000000000000000000000000000000000000000000000016906330ccebb590602401602060405180830381865afa1580156124f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125169190613c6f565b600581111561252757612527613c40565b10806125d157506040517f56b65e970000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000016906356b65e9790602401602060405180830381865afa1580156125ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125d19190613c90565b15612608576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826001600160801b031660000361264b576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126896001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633306001600160801b0387166134c1565b60006126958585613452565b6001600160a01b038616600090815260208181526040808320600381018054600160801b6fffffffffffffffffffffffffffffffff1982166001600160801b039283168d0183169081178290048316890183168202179092553386526005909201909352922080548316840183164290931690910291909117905590506040517f5bab847f0000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152600060248301527f00000000000000000000000000000000000000000000000000000000000000001690635bab847f90604401600060405180830381600087803b15801561279557600080fd5b505af11580156127a9573d6000803e3d6000fd5b5050604080516001600160801b038089168252851660208201523393506001600160a01b03891692507f334cabe84b7338f2bdd62070c02f24ffbcc7735e46f425fa401db349717e1328910160405180910390a3949350505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612867576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128dc7f000000000000000000000000000000000000000000000000000000000000000030836128978688613d4c565b6128a19190613d4c565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169291906001600160801b03166134c1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b03160361298d576129887f0000000000000000000000000000000000000000000000000000000000000000826129448587613d4c565b61294e9190613d4c565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906001600160801b0316613131565b612aec565b6001600160a01b03841660009081526020819052604090206003810180546001600160801b03808216870181166fffffffffffffffffffffffffffffffff19928316179092556002830180548084168601841692169190911781556004909201541615612a425760028101546001600160801b0390811690841681612a1457612a14613d77565b6002830180546001600160801b0380821694909304600160801b918290048416019092169091029190911790555b80547f00000000000000000000000000000000000000000000000000000000000000006001600160801b03600160801b8084048216839003821681029382168481178087556001600160a01b038b16957fc8d4f2228d78be7d0ca97344025aae4f9bc2c87ece32295d72791a4d39f2a71a9594612ac794909204821692911617613cf5565b604080516001600160801b0393841681529290911660208301520160405180910390a2505b50505050565b6001600160a01b038116600090815260208190526040812060020154611416906001600160801b03600160801b820481169116613cf5565b6001600160a01b0382811660009081526020818152604080832093851683526005909301905290812054611413907f000000000000000000000000000000000000000000000000000000000000000090600160801b90046001600160801b0316613d4c565b806001600160801b0316600003612bd2576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612bde8383613452565b9050806001600160801b0316600003612c23576040517fab32f25400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383166000908152602081815260408083203384526005019091529020546001600160801b039081169082161115612c8e576040517fab32f25400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42612c998433612b2a565b6001600160801b03161115612cda576040517f285d5a9200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383166000908152602081815260408083206003810180546001600160801b03600160801b80830482168990038216028082169282169290921789900381166fffffffffffffffffffffffffffffffff1992831617909255338652600590920190935292208054808316859003909216919092161790556040517f5bab847f0000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152600160248301527f00000000000000000000000000000000000000000000000000000000000000001690635bab847f90604401600060405180830381600087803b158015612ddb57600080fd5b505af1158015612def573d6000803e3d6000fd5b50612e329250506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169050336001600160801b038516613131565b604080516001600160801b0380851682528316602082015233916001600160a01b038616917f6acf5e34cb1562e3a0785bb4565e0761928cda3dd258168c73bca09621c669e9910160405180910390a3505050565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612eeb576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038084166000818152602081905260409020600201917f0000000000000000000000000000000000000000000000000000000000000000169003612f9657612f8d6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f00000000000000000000000000000000000000000000000000000000000000006001600160801b038616613131565b82915050611416565b6000612fae6001600160801b03851660146064613512565b905061300d6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f00000000000000000000000000000000000000000000000000000000000000006001600160801b038416613131565b81546fffffffffffffffffffffffffffffffff198116919094036001600160801b03948516810190941617905550919050565b6001600160a01b03808316600090815260208181526040808320938516835260059093019052908120546114139084906001600160801b03166133d2565b6001600160a01b038216600090815260208190526040902060020180546130b7906001600160801b03600160801b820481169116613cf5565b6001600160801b0316826001600160801b03161115613102576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80546fffffffffffffffffffffffffffffffff1981166001600160801b03918216939093031691909117905550565b6040516001600160a01b0383166024820152604481018290526131f89084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526135b4565b505050565b6001600160a01b0380841660009081526020819052604090209061324e907f00000000000000000000000000000000000000000000000000000000000000001685306001600160801b0387166134c1565b6002810180546fffffffffffffffffffffffffffffffff198082166001600160801b039283168701831617909255600183018054909216429091161790558115612aec576040517f5bab847f0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152600060248301527f00000000000000000000000000000000000000000000000000000000000000001690635bab847f90604401600060405180830381600087803b15801561331557600080fd5b505af1158015613329573d6000803e3d6000fd5b5050505050505050565b6001600160a01b038083166000908152602081815260408083209385168352600684019091528120600483015481549293926001600160801b03600160801b9092048216918591613385911683613cf5565b83546133a19190600160801b90046001600160801b0316613d1d565b83546fffffffffffffffffffffffffffffffff19166001600160801b03939093169290921790925595945050505050565b6001600160a01b038216600090815260208190526040812060030154611413906001600160801b0316613406906001613d4c565b6001600160a01b038516600090815260208190526040902060030154620f424090600160801b90046001600160801b03166134419190613d4c565b6001600160801b0385169190613512565b6001600160a01b03821660009081526020819052604081206003015461141390620f424090600160801b90046001600160801b03166134919190613d4c565b6001600160a01b0385166000908152602081905260409020600301546001600160801b0316613441906001613d4c565b6040516001600160a01b0380851660248301528316604482015260648101829052612aec9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613176565b6000838302608081901c6001600160801b03841611613592576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f55696e743132384d6174683a206d756c446976206f766572666c6f770000000060448201526064015b60405180910390fd5b826001600160801b031681816135aa576135aa613d77565b0495945050505050565b6000613609826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166136b69092919063ffffffff16565b905080516000148061362a57508080602001905181019061362a9190613c90565b6131f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401613589565b606061210a848460008585600080866001600160a01b031685876040516136dd9190613da6565b60006040518083038185875af1925050503d806000811461371a576040519150601f19603f3d011682016040523d82523d6000602084013e61371f565b606091505b509150915061209687838387606083156137b45782516000036137ad576001600160a01b0385163b6137ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401613589565b508161210a565b61210a83838151156137c95781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135899190613a5e565b80356001600160a01b0381168114611d2b57600080fd5b6001600160801b038116811461382957600080fd5b50565b6000806040838503121561383f57600080fd5b613848836137fd565b9150602083013561385881613814565b809150509250929050565b60008060008060006080868803121561387b57600080fd5b613884866137fd565b9450613892602087016137fd565b935060408601359250606086013567ffffffffffffffff808211156138b657600080fd5b818801915088601f8301126138ca57600080fd5b8135818111156138d957600080fd5b8960208285010111156138eb57600080fd5b9699959850939650602001949392505050565b60008060006060848603121561391357600080fd5b61391c846137fd565b9250602084013561392c81613814565b915061393a604085016137fd565b90509250925092565b60008060006040848603121561395857600080fd5b613961846137fd565b9250602084013567ffffffffffffffff8082111561397e57600080fd5b818601915086601f83011261399257600080fd5b8135818111156139a157600080fd5b8760208260051b85010111156139b657600080fd5b6020830194508093505050509250925092565b600080604083850312156139dc57600080fd5b6139e5836137fd565b946020939093013593505050565b600060208284031215613a0557600080fd5b611413826137fd565b600060208284031215613a2057600080fd5b8135613a2b81613814565b9392505050565b60005b83811015613a4d578181015183820152602001613a35565b83811115612aec5750506000910152565b6020815260008251806020840152613a7d816040850160208701613a32565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008060408385031215613ac257600080fd5b613acb836137fd565b9150613ad9602084016137fd565b90509250929050565b600080600060608486031215613af757600080fd5b613b00846137fd565b9250613b0e602085016137fd565b9150604084013590509250925092565b60008060008060808587031215613b3457600080fd5b613b3d856137fd565b93506020850135613b4d81613814565b92506040850135613b5d81613814565b91506060850135613b6d81613814565b939692955090935050565b600060208284031215613b8a57600080fd5b8151613a2b81613814565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115613bf657600080fd5b8260051b8083602087013760009401602001938452509192915050565b604081526000613c27604083018587613bc4565b90506001600160801b0383166020830152949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215613c8157600080fd5b815160068110613a2b57600080fd5b600060208284031215613ca257600080fd5b81518015158114613a2b57600080fd5b60208152600061210a602083018486613bc4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006001600160801b0383811690831681811015613d1557613d15613cc6565b039392505050565b60006001600160801b0380831681851681830481118215151615613d4357613d43613cc6565b02949350505050565b60006001600160801b03808316818516808303821115613d6e57613d6e613cc6565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008251613db8818460208701613a32565b919091019291505056fea164736f6c634300080f000a", +} + +// AssetManagerABI is the input ABI used to generate the binding from. +// Deprecated: Use AssetManagerMetaData.ABI instead. +var AssetManagerABI = AssetManagerMetaData.ABI + +// AssetManagerBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use AssetManagerMetaData.Bin instead. +var AssetManagerBin = AssetManagerMetaData.Bin + +// DeployAssetManager deploys a new Ethereum contract, binding an instance of AssetManager to it. +func DeployAssetManager(auth *bind.TransactOpts, backend bind.ContractBackend, _assetToken common.Address, _kgh common.Address, _securityCouncil common.Address, _validatorRewardVault common.Address, _validatorManager common.Address, _minDelegationPeriod *big.Int, _bondAmount *big.Int) (common.Address, *types.Transaction, *AssetManager, error) { + parsed, err := AssetManagerMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(AssetManagerBin), backend, _assetToken, _kgh, _securityCouncil, _validatorRewardVault, _validatorManager, _minDelegationPeriod, _bondAmount) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &AssetManager{AssetManagerCaller: AssetManagerCaller{contract: contract}, AssetManagerTransactor: AssetManagerTransactor{contract: contract}, AssetManagerFilterer: AssetManagerFilterer{contract: contract}}, nil +} + +// AssetManager is an auto generated Go binding around an Ethereum contract. +type AssetManager struct { + AssetManagerCaller // Read-only binding to the contract + AssetManagerTransactor // Write-only binding to the contract + AssetManagerFilterer // Log filterer for contract events +} + +// AssetManagerCaller is an auto generated read-only Go binding around an Ethereum contract. +type AssetManagerCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// AssetManagerTransactor is an auto generated write-only Go binding around an Ethereum contract. +type AssetManagerTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// AssetManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type AssetManagerFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// AssetManagerSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type AssetManagerSession struct { + Contract *AssetManager // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// AssetManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type AssetManagerCallerSession struct { + Contract *AssetManagerCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// AssetManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type AssetManagerTransactorSession struct { + Contract *AssetManagerTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// AssetManagerRaw is an auto generated low-level Go binding around an Ethereum contract. +type AssetManagerRaw struct { + Contract *AssetManager // Generic contract binding to access the raw methods on +} + +// AssetManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type AssetManagerCallerRaw struct { + Contract *AssetManagerCaller // Generic read-only contract binding to access the raw methods on +} + +// AssetManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type AssetManagerTransactorRaw struct { + Contract *AssetManagerTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewAssetManager creates a new instance of AssetManager, bound to a specific deployed contract. +func NewAssetManager(address common.Address, backend bind.ContractBackend) (*AssetManager, error) { + contract, err := bindAssetManager(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &AssetManager{AssetManagerCaller: AssetManagerCaller{contract: contract}, AssetManagerTransactor: AssetManagerTransactor{contract: contract}, AssetManagerFilterer: AssetManagerFilterer{contract: contract}}, nil +} + +// NewAssetManagerCaller creates a new read-only instance of AssetManager, bound to a specific deployed contract. +func NewAssetManagerCaller(address common.Address, caller bind.ContractCaller) (*AssetManagerCaller, error) { + contract, err := bindAssetManager(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &AssetManagerCaller{contract: contract}, nil +} + +// NewAssetManagerTransactor creates a new write-only instance of AssetManager, bound to a specific deployed contract. +func NewAssetManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*AssetManagerTransactor, error) { + contract, err := bindAssetManager(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &AssetManagerTransactor{contract: contract}, nil +} + +// NewAssetManagerFilterer creates a new log filterer instance of AssetManager, bound to a specific deployed contract. +func NewAssetManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*AssetManagerFilterer, error) { + contract, err := bindAssetManager(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &AssetManagerFilterer{contract: contract}, nil +} + +// bindAssetManager binds a generic wrapper to an already deployed contract. +func bindAssetManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := AssetManagerMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_AssetManager *AssetManagerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _AssetManager.Contract.AssetManagerCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_AssetManager *AssetManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _AssetManager.Contract.AssetManagerTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_AssetManager *AssetManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _AssetManager.Contract.AssetManagerTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_AssetManager *AssetManagerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _AssetManager.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_AssetManager *AssetManagerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _AssetManager.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_AssetManager *AssetManagerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _AssetManager.Contract.contract.Transact(opts, method, params...) +} + +// ASSETTOKEN is a free data retrieval call binding the contract method 0xd7062005. +// +// Solidity: function ASSET_TOKEN() view returns(address) +func (_AssetManager *AssetManagerCaller) ASSETTOKEN(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _AssetManager.contract.Call(opts, &out, "ASSET_TOKEN") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// ASSETTOKEN is a free data retrieval call binding the contract method 0xd7062005. +// +// Solidity: function ASSET_TOKEN() view returns(address) +func (_AssetManager *AssetManagerSession) ASSETTOKEN() (common.Address, error) { + return _AssetManager.Contract.ASSETTOKEN(&_AssetManager.CallOpts) +} + +// ASSETTOKEN is a free data retrieval call binding the contract method 0xd7062005. +// +// Solidity: function ASSET_TOKEN() view returns(address) +func (_AssetManager *AssetManagerCallerSession) ASSETTOKEN() (common.Address, error) { + return _AssetManager.Contract.ASSETTOKEN(&_AssetManager.CallOpts) +} + +// BONDAMOUNT is a free data retrieval call binding the contract method 0xbcacc70a. +// +// Solidity: function BOND_AMOUNT() view returns(uint128) +func (_AssetManager *AssetManagerCaller) BONDAMOUNT(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _AssetManager.contract.Call(opts, &out, "BOND_AMOUNT") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// BONDAMOUNT is a free data retrieval call binding the contract method 0xbcacc70a. +// +// Solidity: function BOND_AMOUNT() view returns(uint128) +func (_AssetManager *AssetManagerSession) BONDAMOUNT() (*big.Int, error) { + return _AssetManager.Contract.BONDAMOUNT(&_AssetManager.CallOpts) +} + +// BONDAMOUNT is a free data retrieval call binding the contract method 0xbcacc70a. +// +// Solidity: function BOND_AMOUNT() view returns(uint128) +func (_AssetManager *AssetManagerCallerSession) BONDAMOUNT() (*big.Int, error) { + return _AssetManager.Contract.BONDAMOUNT(&_AssetManager.CallOpts) +} + +// DECIMALOFFSET is a free data retrieval call binding the contract method 0xde7d4d6a. +// +// Solidity: function DECIMAL_OFFSET() view returns(uint128) +func (_AssetManager *AssetManagerCaller) DECIMALOFFSET(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _AssetManager.contract.Call(opts, &out, "DECIMAL_OFFSET") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// DECIMALOFFSET is a free data retrieval call binding the contract method 0xde7d4d6a. +// +// Solidity: function DECIMAL_OFFSET() view returns(uint128) +func (_AssetManager *AssetManagerSession) DECIMALOFFSET() (*big.Int, error) { + return _AssetManager.Contract.DECIMALOFFSET(&_AssetManager.CallOpts) +} + +// DECIMALOFFSET is a free data retrieval call binding the contract method 0xde7d4d6a. +// +// Solidity: function DECIMAL_OFFSET() view returns(uint128) +func (_AssetManager *AssetManagerCallerSession) DECIMALOFFSET() (*big.Int, error) { + return _AssetManager.Contract.DECIMALOFFSET(&_AssetManager.CallOpts) +} + +// KGH is a free data retrieval call binding the contract method 0x56576b5b. +// +// Solidity: function KGH() view returns(address) +func (_AssetManager *AssetManagerCaller) KGH(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _AssetManager.contract.Call(opts, &out, "KGH") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// KGH is a free data retrieval call binding the contract method 0x56576b5b. +// +// Solidity: function KGH() view returns(address) +func (_AssetManager *AssetManagerSession) KGH() (common.Address, error) { + return _AssetManager.Contract.KGH(&_AssetManager.CallOpts) +} + +// KGH is a free data retrieval call binding the contract method 0x56576b5b. +// +// Solidity: function KGH() view returns(address) +func (_AssetManager *AssetManagerCallerSession) KGH() (common.Address, error) { + return _AssetManager.Contract.KGH(&_AssetManager.CallOpts) +} + +// MINDELEGATIONPERIOD is a free data retrieval call binding the contract method 0xfdbb3fd2. +// +// Solidity: function MIN_DELEGATION_PERIOD() view returns(uint128) +func (_AssetManager *AssetManagerCaller) MINDELEGATIONPERIOD(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _AssetManager.contract.Call(opts, &out, "MIN_DELEGATION_PERIOD") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// MINDELEGATIONPERIOD is a free data retrieval call binding the contract method 0xfdbb3fd2. +// +// Solidity: function MIN_DELEGATION_PERIOD() view returns(uint128) +func (_AssetManager *AssetManagerSession) MINDELEGATIONPERIOD() (*big.Int, error) { + return _AssetManager.Contract.MINDELEGATIONPERIOD(&_AssetManager.CallOpts) +} + +// MINDELEGATIONPERIOD is a free data retrieval call binding the contract method 0xfdbb3fd2. +// +// Solidity: function MIN_DELEGATION_PERIOD() view returns(uint128) +func (_AssetManager *AssetManagerCallerSession) MINDELEGATIONPERIOD() (*big.Int, error) { + return _AssetManager.Contract.MINDELEGATIONPERIOD(&_AssetManager.CallOpts) +} + +// SECURITYCOUNCIL is a free data retrieval call binding the contract method 0x36086417. +// +// Solidity: function SECURITY_COUNCIL() view returns(address) +func (_AssetManager *AssetManagerCaller) SECURITYCOUNCIL(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _AssetManager.contract.Call(opts, &out, "SECURITY_COUNCIL") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// SECURITYCOUNCIL is a free data retrieval call binding the contract method 0x36086417. +// +// Solidity: function SECURITY_COUNCIL() view returns(address) +func (_AssetManager *AssetManagerSession) SECURITYCOUNCIL() (common.Address, error) { + return _AssetManager.Contract.SECURITYCOUNCIL(&_AssetManager.CallOpts) +} + +// SECURITYCOUNCIL is a free data retrieval call binding the contract method 0x36086417. +// +// Solidity: function SECURITY_COUNCIL() view returns(address) +func (_AssetManager *AssetManagerCallerSession) SECURITYCOUNCIL() (common.Address, error) { + return _AssetManager.Contract.SECURITYCOUNCIL(&_AssetManager.CallOpts) +} + +// TAXDENOMINATOR is a free data retrieval call binding the contract method 0xa51c9ace. +// +// Solidity: function TAX_DENOMINATOR() view returns(uint128) +func (_AssetManager *AssetManagerCaller) TAXDENOMINATOR(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _AssetManager.contract.Call(opts, &out, "TAX_DENOMINATOR") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// TAXDENOMINATOR is a free data retrieval call binding the contract method 0xa51c9ace. +// +// Solidity: function TAX_DENOMINATOR() view returns(uint128) +func (_AssetManager *AssetManagerSession) TAXDENOMINATOR() (*big.Int, error) { + return _AssetManager.Contract.TAXDENOMINATOR(&_AssetManager.CallOpts) +} + +// TAXDENOMINATOR is a free data retrieval call binding the contract method 0xa51c9ace. +// +// Solidity: function TAX_DENOMINATOR() view returns(uint128) +func (_AssetManager *AssetManagerCallerSession) TAXDENOMINATOR() (*big.Int, error) { + return _AssetManager.Contract.TAXDENOMINATOR(&_AssetManager.CallOpts) +} + +// TAXNUMERATOR is a free data retrieval call binding the contract method 0x82dae3aa. +// +// Solidity: function TAX_NUMERATOR() view returns(uint128) +func (_AssetManager *AssetManagerCaller) TAXNUMERATOR(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _AssetManager.contract.Call(opts, &out, "TAX_NUMERATOR") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// TAXNUMERATOR is a free data retrieval call binding the contract method 0x82dae3aa. +// +// Solidity: function TAX_NUMERATOR() view returns(uint128) +func (_AssetManager *AssetManagerSession) TAXNUMERATOR() (*big.Int, error) { + return _AssetManager.Contract.TAXNUMERATOR(&_AssetManager.CallOpts) +} + +// TAXNUMERATOR is a free data retrieval call binding the contract method 0x82dae3aa. +// +// Solidity: function TAX_NUMERATOR() view returns(uint128) +func (_AssetManager *AssetManagerCallerSession) TAXNUMERATOR() (*big.Int, error) { + return _AssetManager.Contract.TAXNUMERATOR(&_AssetManager.CallOpts) +} + +// VALIDATORMANAGER is a free data retrieval call binding the contract method 0xae9483e0. +// +// Solidity: function VALIDATOR_MANAGER() view returns(address) +func (_AssetManager *AssetManagerCaller) VALIDATORMANAGER(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _AssetManager.contract.Call(opts, &out, "VALIDATOR_MANAGER") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// VALIDATORMANAGER is a free data retrieval call binding the contract method 0xae9483e0. +// +// Solidity: function VALIDATOR_MANAGER() view returns(address) +func (_AssetManager *AssetManagerSession) VALIDATORMANAGER() (common.Address, error) { + return _AssetManager.Contract.VALIDATORMANAGER(&_AssetManager.CallOpts) +} + +// VALIDATORMANAGER is a free data retrieval call binding the contract method 0xae9483e0. +// +// Solidity: function VALIDATOR_MANAGER() view returns(address) +func (_AssetManager *AssetManagerCallerSession) VALIDATORMANAGER() (common.Address, error) { + return _AssetManager.Contract.VALIDATORMANAGER(&_AssetManager.CallOpts) +} + +// VALIDATORREWARDVAULT is a free data retrieval call binding the contract method 0xc0a63a79. +// +// Solidity: function VALIDATOR_REWARD_VAULT() view returns(address) +func (_AssetManager *AssetManagerCaller) VALIDATORREWARDVAULT(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _AssetManager.contract.Call(opts, &out, "VALIDATOR_REWARD_VAULT") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// VALIDATORREWARDVAULT is a free data retrieval call binding the contract method 0xc0a63a79. +// +// Solidity: function VALIDATOR_REWARD_VAULT() view returns(address) +func (_AssetManager *AssetManagerSession) VALIDATORREWARDVAULT() (common.Address, error) { + return _AssetManager.Contract.VALIDATORREWARDVAULT(&_AssetManager.CallOpts) +} + +// VALIDATORREWARDVAULT is a free data retrieval call binding the contract method 0xc0a63a79. +// +// Solidity: function VALIDATOR_REWARD_VAULT() view returns(address) +func (_AssetManager *AssetManagerCallerSession) VALIDATORREWARDVAULT() (common.Address, error) { + return _AssetManager.Contract.VALIDATORREWARDVAULT(&_AssetManager.CallOpts) +} + +// CanUndelegateKghAt is a free data retrieval call binding the contract method 0x86d18a94. +// +// Solidity: function canUndelegateKghAt(address validator, address delegator, uint256 tokenId) view returns(uint128) +func (_AssetManager *AssetManagerCaller) CanUndelegateKghAt(opts *bind.CallOpts, validator common.Address, delegator common.Address, tokenId *big.Int) (*big.Int, error) { + var out []interface{} + err := _AssetManager.contract.Call(opts, &out, "canUndelegateKghAt", validator, delegator, tokenId) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// CanUndelegateKghAt is a free data retrieval call binding the contract method 0x86d18a94. +// +// Solidity: function canUndelegateKghAt(address validator, address delegator, uint256 tokenId) view returns(uint128) +func (_AssetManager *AssetManagerSession) CanUndelegateKghAt(validator common.Address, delegator common.Address, tokenId *big.Int) (*big.Int, error) { + return _AssetManager.Contract.CanUndelegateKghAt(&_AssetManager.CallOpts, validator, delegator, tokenId) +} + +// CanUndelegateKghAt is a free data retrieval call binding the contract method 0x86d18a94. +// +// Solidity: function canUndelegateKghAt(address validator, address delegator, uint256 tokenId) view returns(uint128) +func (_AssetManager *AssetManagerCallerSession) CanUndelegateKghAt(validator common.Address, delegator common.Address, tokenId *big.Int) (*big.Int, error) { + return _AssetManager.Contract.CanUndelegateKghAt(&_AssetManager.CallOpts, validator, delegator, tokenId) +} + +// CanUndelegateKroAt is a free data retrieval call binding the contract method 0xb55cd78e. +// +// Solidity: function canUndelegateKroAt(address validator, address delegator) view returns(uint128) +func (_AssetManager *AssetManagerCaller) CanUndelegateKroAt(opts *bind.CallOpts, validator common.Address, delegator common.Address) (*big.Int, error) { + var out []interface{} + err := _AssetManager.contract.Call(opts, &out, "canUndelegateKroAt", validator, delegator) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// CanUndelegateKroAt is a free data retrieval call binding the contract method 0xb55cd78e. +// +// Solidity: function canUndelegateKroAt(address validator, address delegator) view returns(uint128) +func (_AssetManager *AssetManagerSession) CanUndelegateKroAt(validator common.Address, delegator common.Address) (*big.Int, error) { + return _AssetManager.Contract.CanUndelegateKroAt(&_AssetManager.CallOpts, validator, delegator) +} + +// CanUndelegateKroAt is a free data retrieval call binding the contract method 0xb55cd78e. +// +// Solidity: function canUndelegateKroAt(address validator, address delegator) view returns(uint128) +func (_AssetManager *AssetManagerCallerSession) CanUndelegateKroAt(validator common.Address, delegator common.Address) (*big.Int, error) { + return _AssetManager.Contract.CanUndelegateKroAt(&_AssetManager.CallOpts, validator, delegator) +} + +// CanWithdrawAt is a free data retrieval call binding the contract method 0xa63b8d14. +// +// Solidity: function canWithdrawAt(address validator) view returns(uint128) +func (_AssetManager *AssetManagerCaller) CanWithdrawAt(opts *bind.CallOpts, validator common.Address) (*big.Int, error) { + var out []interface{} + err := _AssetManager.contract.Call(opts, &out, "canWithdrawAt", validator) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// CanWithdrawAt is a free data retrieval call binding the contract method 0xa63b8d14. +// +// Solidity: function canWithdrawAt(address validator) view returns(uint128) +func (_AssetManager *AssetManagerSession) CanWithdrawAt(validator common.Address) (*big.Int, error) { + return _AssetManager.Contract.CanWithdrawAt(&_AssetManager.CallOpts, validator) +} + +// CanWithdrawAt is a free data retrieval call binding the contract method 0xa63b8d14. +// +// Solidity: function canWithdrawAt(address validator) view returns(uint128) +func (_AssetManager *AssetManagerCallerSession) CanWithdrawAt(validator common.Address) (*big.Int, error) { + return _AssetManager.Contract.CanWithdrawAt(&_AssetManager.CallOpts, validator) +} + +// GetKghNum is a free data retrieval call binding the contract method 0x7db41f97. +// +// Solidity: function getKghNum(address validator, address delegator) view returns(uint128) +func (_AssetManager *AssetManagerCaller) GetKghNum(opts *bind.CallOpts, validator common.Address, delegator common.Address) (*big.Int, error) { + var out []interface{} + err := _AssetManager.contract.Call(opts, &out, "getKghNum", validator, delegator) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetKghNum is a free data retrieval call binding the contract method 0x7db41f97. +// +// Solidity: function getKghNum(address validator, address delegator) view returns(uint128) +func (_AssetManager *AssetManagerSession) GetKghNum(validator common.Address, delegator common.Address) (*big.Int, error) { + return _AssetManager.Contract.GetKghNum(&_AssetManager.CallOpts, validator, delegator) +} + +// GetKghNum is a free data retrieval call binding the contract method 0x7db41f97. +// +// Solidity: function getKghNum(address validator, address delegator) view returns(uint128) +func (_AssetManager *AssetManagerCallerSession) GetKghNum(validator common.Address, delegator common.Address) (*big.Int, error) { + return _AssetManager.Contract.GetKghNum(&_AssetManager.CallOpts, validator, delegator) +} + +// GetKghReward is a free data retrieval call binding the contract method 0x833a333b. +// +// Solidity: function getKghReward(address validator, address delegator) view returns(uint128) +func (_AssetManager *AssetManagerCaller) GetKghReward(opts *bind.CallOpts, validator common.Address, delegator common.Address) (*big.Int, error) { + var out []interface{} + err := _AssetManager.contract.Call(opts, &out, "getKghReward", validator, delegator) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetKghReward is a free data retrieval call binding the contract method 0x833a333b. +// +// Solidity: function getKghReward(address validator, address delegator) view returns(uint128) +func (_AssetManager *AssetManagerSession) GetKghReward(validator common.Address, delegator common.Address) (*big.Int, error) { + return _AssetManager.Contract.GetKghReward(&_AssetManager.CallOpts, validator, delegator) +} + +// GetKghReward is a free data retrieval call binding the contract method 0x833a333b. +// +// Solidity: function getKghReward(address validator, address delegator) view returns(uint128) +func (_AssetManager *AssetManagerCallerSession) GetKghReward(validator common.Address, delegator common.Address) (*big.Int, error) { + return _AssetManager.Contract.GetKghReward(&_AssetManager.CallOpts, validator, delegator) +} + +// GetKroAssets is a free data retrieval call binding the contract method 0xc7ab2c07. +// +// Solidity: function getKroAssets(address validator, address delegator) view returns(uint128) +func (_AssetManager *AssetManagerCaller) GetKroAssets(opts *bind.CallOpts, validator common.Address, delegator common.Address) (*big.Int, error) { + var out []interface{} + err := _AssetManager.contract.Call(opts, &out, "getKroAssets", validator, delegator) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetKroAssets is a free data retrieval call binding the contract method 0xc7ab2c07. +// +// Solidity: function getKroAssets(address validator, address delegator) view returns(uint128) +func (_AssetManager *AssetManagerSession) GetKroAssets(validator common.Address, delegator common.Address) (*big.Int, error) { + return _AssetManager.Contract.GetKroAssets(&_AssetManager.CallOpts, validator, delegator) +} + +// GetKroAssets is a free data retrieval call binding the contract method 0xc7ab2c07. +// +// Solidity: function getKroAssets(address validator, address delegator) view returns(uint128) +func (_AssetManager *AssetManagerCallerSession) GetKroAssets(validator common.Address, delegator common.Address) (*big.Int, error) { + return _AssetManager.Contract.GetKroAssets(&_AssetManager.CallOpts, validator, delegator) +} + +// GetKroTotalShareBalance is a free data retrieval call binding the contract method 0x842d0d3b. +// +// Solidity: function getKroTotalShareBalance(address validator, address delegator) view returns(uint128) +func (_AssetManager *AssetManagerCaller) GetKroTotalShareBalance(opts *bind.CallOpts, validator common.Address, delegator common.Address) (*big.Int, error) { + var out []interface{} + err := _AssetManager.contract.Call(opts, &out, "getKroTotalShareBalance", validator, delegator) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetKroTotalShareBalance is a free data retrieval call binding the contract method 0x842d0d3b. +// +// Solidity: function getKroTotalShareBalance(address validator, address delegator) view returns(uint128) +func (_AssetManager *AssetManagerSession) GetKroTotalShareBalance(validator common.Address, delegator common.Address) (*big.Int, error) { + return _AssetManager.Contract.GetKroTotalShareBalance(&_AssetManager.CallOpts, validator, delegator) +} + +// GetKroTotalShareBalance is a free data retrieval call binding the contract method 0x842d0d3b. +// +// Solidity: function getKroTotalShareBalance(address validator, address delegator) view returns(uint128) +func (_AssetManager *AssetManagerCallerSession) GetKroTotalShareBalance(validator common.Address, delegator common.Address) (*big.Int, error) { + return _AssetManager.Contract.GetKroTotalShareBalance(&_AssetManager.CallOpts, validator, delegator) +} + +// GetWithdrawAccount is a free data retrieval call binding the contract method 0xc2d9b684. +// +// Solidity: function getWithdrawAccount(address validator) view returns(address) +func (_AssetManager *AssetManagerCaller) GetWithdrawAccount(opts *bind.CallOpts, validator common.Address) (common.Address, error) { + var out []interface{} + err := _AssetManager.contract.Call(opts, &out, "getWithdrawAccount", validator) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetWithdrawAccount is a free data retrieval call binding the contract method 0xc2d9b684. +// +// Solidity: function getWithdrawAccount(address validator) view returns(address) +func (_AssetManager *AssetManagerSession) GetWithdrawAccount(validator common.Address) (common.Address, error) { + return _AssetManager.Contract.GetWithdrawAccount(&_AssetManager.CallOpts, validator) +} + +// GetWithdrawAccount is a free data retrieval call binding the contract method 0xc2d9b684. +// +// Solidity: function getWithdrawAccount(address validator) view returns(address) +func (_AssetManager *AssetManagerCallerSession) GetWithdrawAccount(validator common.Address) (common.Address, error) { + return _AssetManager.Contract.GetWithdrawAccount(&_AssetManager.CallOpts, validator) +} + +// OnERC721Received is a free data retrieval call binding the contract method 0x150b7a02. +// +// Solidity: function onERC721Received(address , address , uint256 , bytes ) pure returns(bytes4) +func (_AssetManager *AssetManagerCaller) OnERC721Received(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address, arg2 *big.Int, arg3 []byte) ([4]byte, error) { + var out []interface{} + err := _AssetManager.contract.Call(opts, &out, "onERC721Received", arg0, arg1, arg2, arg3) + + if err != nil { + return *new([4]byte), err + } + + out0 := *abi.ConvertType(out[0], new([4]byte)).(*[4]byte) + + return out0, err + +} + +// OnERC721Received is a free data retrieval call binding the contract method 0x150b7a02. +// +// Solidity: function onERC721Received(address , address , uint256 , bytes ) pure returns(bytes4) +func (_AssetManager *AssetManagerSession) OnERC721Received(arg0 common.Address, arg1 common.Address, arg2 *big.Int, arg3 []byte) ([4]byte, error) { + return _AssetManager.Contract.OnERC721Received(&_AssetManager.CallOpts, arg0, arg1, arg2, arg3) +} + +// OnERC721Received is a free data retrieval call binding the contract method 0x150b7a02. +// +// Solidity: function onERC721Received(address , address , uint256 , bytes ) pure returns(bytes4) +func (_AssetManager *AssetManagerCallerSession) OnERC721Received(arg0 common.Address, arg1 common.Address, arg2 *big.Int, arg3 []byte) ([4]byte, error) { + return _AssetManager.Contract.OnERC721Received(&_AssetManager.CallOpts, arg0, arg1, arg2, arg3) +} + +// PreviewDelegate is a free data retrieval call binding the contract method 0x960a0893. +// +// Solidity: function previewDelegate(address validator, uint128 assets) view returns(uint128) +func (_AssetManager *AssetManagerCaller) PreviewDelegate(opts *bind.CallOpts, validator common.Address, assets *big.Int) (*big.Int, error) { + var out []interface{} + err := _AssetManager.contract.Call(opts, &out, "previewDelegate", validator, assets) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// PreviewDelegate is a free data retrieval call binding the contract method 0x960a0893. +// +// Solidity: function previewDelegate(address validator, uint128 assets) view returns(uint128) +func (_AssetManager *AssetManagerSession) PreviewDelegate(validator common.Address, assets *big.Int) (*big.Int, error) { + return _AssetManager.Contract.PreviewDelegate(&_AssetManager.CallOpts, validator, assets) +} + +// PreviewDelegate is a free data retrieval call binding the contract method 0x960a0893. +// +// Solidity: function previewDelegate(address validator, uint128 assets) view returns(uint128) +func (_AssetManager *AssetManagerCallerSession) PreviewDelegate(validator common.Address, assets *big.Int) (*big.Int, error) { + return _AssetManager.Contract.PreviewDelegate(&_AssetManager.CallOpts, validator, assets) +} + +// PreviewUndelegate is a free data retrieval call binding the contract method 0x209a9694. +// +// Solidity: function previewUndelegate(address validator, uint128 shares) view returns(uint128) +func (_AssetManager *AssetManagerCaller) PreviewUndelegate(opts *bind.CallOpts, validator common.Address, shares *big.Int) (*big.Int, error) { + var out []interface{} + err := _AssetManager.contract.Call(opts, &out, "previewUndelegate", validator, shares) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// PreviewUndelegate is a free data retrieval call binding the contract method 0x209a9694. +// +// Solidity: function previewUndelegate(address validator, uint128 shares) view returns(uint128) +func (_AssetManager *AssetManagerSession) PreviewUndelegate(validator common.Address, shares *big.Int) (*big.Int, error) { + return _AssetManager.Contract.PreviewUndelegate(&_AssetManager.CallOpts, validator, shares) +} + +// PreviewUndelegate is a free data retrieval call binding the contract method 0x209a9694. +// +// Solidity: function previewUndelegate(address validator, uint128 shares) view returns(uint128) +func (_AssetManager *AssetManagerCallerSession) PreviewUndelegate(validator common.Address, shares *big.Int) (*big.Int, error) { + return _AssetManager.Contract.PreviewUndelegate(&_AssetManager.CallOpts, validator, shares) +} + +// ReflectiveWeight is a free data retrieval call binding the contract method 0x8abf0af0. +// +// Solidity: function reflectiveWeight(address validator) view returns(uint128) +func (_AssetManager *AssetManagerCaller) ReflectiveWeight(opts *bind.CallOpts, validator common.Address) (*big.Int, error) { + var out []interface{} + err := _AssetManager.contract.Call(opts, &out, "reflectiveWeight", validator) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ReflectiveWeight is a free data retrieval call binding the contract method 0x8abf0af0. +// +// Solidity: function reflectiveWeight(address validator) view returns(uint128) +func (_AssetManager *AssetManagerSession) ReflectiveWeight(validator common.Address) (*big.Int, error) { + return _AssetManager.Contract.ReflectiveWeight(&_AssetManager.CallOpts, validator) +} + +// ReflectiveWeight is a free data retrieval call binding the contract method 0x8abf0af0. +// +// Solidity: function reflectiveWeight(address validator) view returns(uint128) +func (_AssetManager *AssetManagerCallerSession) ReflectiveWeight(validator common.Address) (*big.Int, error) { + return _AssetManager.Contract.ReflectiveWeight(&_AssetManager.CallOpts, validator) +} + +// TotalKghNum is a free data retrieval call binding the contract method 0x913f1a9f. +// +// Solidity: function totalKghNum(address validator) view returns(uint128) +func (_AssetManager *AssetManagerCaller) TotalKghNum(opts *bind.CallOpts, validator common.Address) (*big.Int, error) { + var out []interface{} + err := _AssetManager.contract.Call(opts, &out, "totalKghNum", validator) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// TotalKghNum is a free data retrieval call binding the contract method 0x913f1a9f. +// +// Solidity: function totalKghNum(address validator) view returns(uint128) +func (_AssetManager *AssetManagerSession) TotalKghNum(validator common.Address) (*big.Int, error) { + return _AssetManager.Contract.TotalKghNum(&_AssetManager.CallOpts, validator) +} + +// TotalKghNum is a free data retrieval call binding the contract method 0x913f1a9f. +// +// Solidity: function totalKghNum(address validator) view returns(uint128) +func (_AssetManager *AssetManagerCallerSession) TotalKghNum(validator common.Address) (*big.Int, error) { + return _AssetManager.Contract.TotalKghNum(&_AssetManager.CallOpts, validator) +} + +// TotalKroAssets is a free data retrieval call binding the contract method 0x6b9ffeac. +// +// Solidity: function totalKroAssets(address validator) view returns(uint128) +func (_AssetManager *AssetManagerCaller) TotalKroAssets(opts *bind.CallOpts, validator common.Address) (*big.Int, error) { + var out []interface{} + err := _AssetManager.contract.Call(opts, &out, "totalKroAssets", validator) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// TotalKroAssets is a free data retrieval call binding the contract method 0x6b9ffeac. +// +// Solidity: function totalKroAssets(address validator) view returns(uint128) +func (_AssetManager *AssetManagerSession) TotalKroAssets(validator common.Address) (*big.Int, error) { + return _AssetManager.Contract.TotalKroAssets(&_AssetManager.CallOpts, validator) +} + +// TotalKroAssets is a free data retrieval call binding the contract method 0x6b9ffeac. +// +// Solidity: function totalKroAssets(address validator) view returns(uint128) +func (_AssetManager *AssetManagerCallerSession) TotalKroAssets(validator common.Address) (*big.Int, error) { + return _AssetManager.Contract.TotalKroAssets(&_AssetManager.CallOpts, validator) +} + +// TotalValidatorKro is a free data retrieval call binding the contract method 0x981cee53. +// +// Solidity: function totalValidatorKro(address validator) view returns(uint128) +func (_AssetManager *AssetManagerCaller) TotalValidatorKro(opts *bind.CallOpts, validator common.Address) (*big.Int, error) { + var out []interface{} + err := _AssetManager.contract.Call(opts, &out, "totalValidatorKro", validator) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// TotalValidatorKro is a free data retrieval call binding the contract method 0x981cee53. +// +// Solidity: function totalValidatorKro(address validator) view returns(uint128) +func (_AssetManager *AssetManagerSession) TotalValidatorKro(validator common.Address) (*big.Int, error) { + return _AssetManager.Contract.TotalValidatorKro(&_AssetManager.CallOpts, validator) +} + +// TotalValidatorKro is a free data retrieval call binding the contract method 0x981cee53. +// +// Solidity: function totalValidatorKro(address validator) view returns(uint128) +func (_AssetManager *AssetManagerCallerSession) TotalValidatorKro(validator common.Address) (*big.Int, error) { + return _AssetManager.Contract.TotalValidatorKro(&_AssetManager.CallOpts, validator) +} + +// TotalValidatorKroBonded is a free data retrieval call binding the contract method 0x5959b765. +// +// Solidity: function totalValidatorKroBonded(address validator) view returns(uint128) +func (_AssetManager *AssetManagerCaller) TotalValidatorKroBonded(opts *bind.CallOpts, validator common.Address) (*big.Int, error) { + var out []interface{} + err := _AssetManager.contract.Call(opts, &out, "totalValidatorKroBonded", validator) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// TotalValidatorKroBonded is a free data retrieval call binding the contract method 0x5959b765. +// +// Solidity: function totalValidatorKroBonded(address validator) view returns(uint128) +func (_AssetManager *AssetManagerSession) TotalValidatorKroBonded(validator common.Address) (*big.Int, error) { + return _AssetManager.Contract.TotalValidatorKroBonded(&_AssetManager.CallOpts, validator) +} + +// TotalValidatorKroBonded is a free data retrieval call binding the contract method 0x5959b765. +// +// Solidity: function totalValidatorKroBonded(address validator) view returns(uint128) +func (_AssetManager *AssetManagerCallerSession) TotalValidatorKroBonded(validator common.Address) (*big.Int, error) { + return _AssetManager.Contract.TotalValidatorKroBonded(&_AssetManager.CallOpts, validator) +} + +// TotalValidatorKroNotBonded is a free data retrieval call binding the contract method 0xb172597e. +// +// Solidity: function totalValidatorKroNotBonded(address validator) view returns(uint128) +func (_AssetManager *AssetManagerCaller) TotalValidatorKroNotBonded(opts *bind.CallOpts, validator common.Address) (*big.Int, error) { + var out []interface{} + err := _AssetManager.contract.Call(opts, &out, "totalValidatorKroNotBonded", validator) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// TotalValidatorKroNotBonded is a free data retrieval call binding the contract method 0xb172597e. +// +// Solidity: function totalValidatorKroNotBonded(address validator) view returns(uint128) +func (_AssetManager *AssetManagerSession) TotalValidatorKroNotBonded(validator common.Address) (*big.Int, error) { + return _AssetManager.Contract.TotalValidatorKroNotBonded(&_AssetManager.CallOpts, validator) +} + +// TotalValidatorKroNotBonded is a free data retrieval call binding the contract method 0xb172597e. +// +// Solidity: function totalValidatorKroNotBonded(address validator) view returns(uint128) +func (_AssetManager *AssetManagerCallerSession) TotalValidatorKroNotBonded(validator common.Address) (*big.Int, error) { + return _AssetManager.Contract.TotalValidatorKroNotBonded(&_AssetManager.CallOpts, validator) +} + +// Version is a free data retrieval call binding the contract method 0x54fd4d50. +// +// Solidity: function version() view returns(string) +func (_AssetManager *AssetManagerCaller) Version(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _AssetManager.contract.Call(opts, &out, "version") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Version is a free data retrieval call binding the contract method 0x54fd4d50. +// +// Solidity: function version() view returns(string) +func (_AssetManager *AssetManagerSession) Version() (string, error) { + return _AssetManager.Contract.Version(&_AssetManager.CallOpts) +} + +// Version is a free data retrieval call binding the contract method 0x54fd4d50. +// +// Solidity: function version() view returns(string) +func (_AssetManager *AssetManagerCallerSession) Version() (string, error) { + return _AssetManager.Contract.Version(&_AssetManager.CallOpts) +} + +// BondValidatorKro is a paid mutator transaction binding the contract method 0x8c1516c7. +// +// Solidity: function bondValidatorKro(address validator) returns() +func (_AssetManager *AssetManagerTransactor) BondValidatorKro(opts *bind.TransactOpts, validator common.Address) (*types.Transaction, error) { + return _AssetManager.contract.Transact(opts, "bondValidatorKro", validator) +} + +// BondValidatorKro is a paid mutator transaction binding the contract method 0x8c1516c7. +// +// Solidity: function bondValidatorKro(address validator) returns() +func (_AssetManager *AssetManagerSession) BondValidatorKro(validator common.Address) (*types.Transaction, error) { + return _AssetManager.Contract.BondValidatorKro(&_AssetManager.TransactOpts, validator) +} + +// BondValidatorKro is a paid mutator transaction binding the contract method 0x8c1516c7. +// +// Solidity: function bondValidatorKro(address validator) returns() +func (_AssetManager *AssetManagerTransactorSession) BondValidatorKro(validator common.Address) (*types.Transaction, error) { + return _AssetManager.Contract.BondValidatorKro(&_AssetManager.TransactOpts, validator) +} + +// ClaimKghReward is a paid mutator transaction binding the contract method 0x270a1644. +// +// Solidity: function claimKghReward(address validator) returns() +func (_AssetManager *AssetManagerTransactor) ClaimKghReward(opts *bind.TransactOpts, validator common.Address) (*types.Transaction, error) { + return _AssetManager.contract.Transact(opts, "claimKghReward", validator) +} + +// ClaimKghReward is a paid mutator transaction binding the contract method 0x270a1644. +// +// Solidity: function claimKghReward(address validator) returns() +func (_AssetManager *AssetManagerSession) ClaimKghReward(validator common.Address) (*types.Transaction, error) { + return _AssetManager.Contract.ClaimKghReward(&_AssetManager.TransactOpts, validator) +} + +// ClaimKghReward is a paid mutator transaction binding the contract method 0x270a1644. +// +// Solidity: function claimKghReward(address validator) returns() +func (_AssetManager *AssetManagerTransactorSession) ClaimKghReward(validator common.Address) (*types.Transaction, error) { + return _AssetManager.Contract.ClaimKghReward(&_AssetManager.TransactOpts, validator) +} + +// DecreaseBalanceWithChallenge is a paid mutator transaction binding the contract method 0x5636aabd. +// +// Solidity: function decreaseBalanceWithChallenge(address loser) returns(uint128) +func (_AssetManager *AssetManagerTransactor) DecreaseBalanceWithChallenge(opts *bind.TransactOpts, loser common.Address) (*types.Transaction, error) { + return _AssetManager.contract.Transact(opts, "decreaseBalanceWithChallenge", loser) +} + +// DecreaseBalanceWithChallenge is a paid mutator transaction binding the contract method 0x5636aabd. +// +// Solidity: function decreaseBalanceWithChallenge(address loser) returns(uint128) +func (_AssetManager *AssetManagerSession) DecreaseBalanceWithChallenge(loser common.Address) (*types.Transaction, error) { + return _AssetManager.Contract.DecreaseBalanceWithChallenge(&_AssetManager.TransactOpts, loser) +} + +// DecreaseBalanceWithChallenge is a paid mutator transaction binding the contract method 0x5636aabd. +// +// Solidity: function decreaseBalanceWithChallenge(address loser) returns(uint128) +func (_AssetManager *AssetManagerTransactorSession) DecreaseBalanceWithChallenge(loser common.Address) (*types.Transaction, error) { + return _AssetManager.Contract.DecreaseBalanceWithChallenge(&_AssetManager.TransactOpts, loser) +} + +// Delegate is a paid mutator transaction binding the contract method 0xa85120e4. +// +// Solidity: function delegate(address validator, uint128 assets) returns(uint128) +func (_AssetManager *AssetManagerTransactor) Delegate(opts *bind.TransactOpts, validator common.Address, assets *big.Int) (*types.Transaction, error) { + return _AssetManager.contract.Transact(opts, "delegate", validator, assets) +} + +// Delegate is a paid mutator transaction binding the contract method 0xa85120e4. +// +// Solidity: function delegate(address validator, uint128 assets) returns(uint128) +func (_AssetManager *AssetManagerSession) Delegate(validator common.Address, assets *big.Int) (*types.Transaction, error) { + return _AssetManager.Contract.Delegate(&_AssetManager.TransactOpts, validator, assets) +} + +// Delegate is a paid mutator transaction binding the contract method 0xa85120e4. +// +// Solidity: function delegate(address validator, uint128 assets) returns(uint128) +func (_AssetManager *AssetManagerTransactorSession) Delegate(validator common.Address, assets *big.Int) (*types.Transaction, error) { + return _AssetManager.Contract.Delegate(&_AssetManager.TransactOpts, validator, assets) +} + +// DelegateKgh is a paid mutator transaction binding the contract method 0x1f86f4f1. +// +// Solidity: function delegateKgh(address validator, uint256 tokenId) returns() +func (_AssetManager *AssetManagerTransactor) DelegateKgh(opts *bind.TransactOpts, validator common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _AssetManager.contract.Transact(opts, "delegateKgh", validator, tokenId) +} + +// DelegateKgh is a paid mutator transaction binding the contract method 0x1f86f4f1. +// +// Solidity: function delegateKgh(address validator, uint256 tokenId) returns() +func (_AssetManager *AssetManagerSession) DelegateKgh(validator common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _AssetManager.Contract.DelegateKgh(&_AssetManager.TransactOpts, validator, tokenId) +} + +// DelegateKgh is a paid mutator transaction binding the contract method 0x1f86f4f1. +// +// Solidity: function delegateKgh(address validator, uint256 tokenId) returns() +func (_AssetManager *AssetManagerTransactorSession) DelegateKgh(validator common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _AssetManager.Contract.DelegateKgh(&_AssetManager.TransactOpts, validator, tokenId) +} + +// DelegateKghBatch is a paid mutator transaction binding the contract method 0x31d8e007. +// +// Solidity: function delegateKghBatch(address validator, uint256[] tokenIds) returns() +func (_AssetManager *AssetManagerTransactor) DelegateKghBatch(opts *bind.TransactOpts, validator common.Address, tokenIds []*big.Int) (*types.Transaction, error) { + return _AssetManager.contract.Transact(opts, "delegateKghBatch", validator, tokenIds) +} + +// DelegateKghBatch is a paid mutator transaction binding the contract method 0x31d8e007. +// +// Solidity: function delegateKghBatch(address validator, uint256[] tokenIds) returns() +func (_AssetManager *AssetManagerSession) DelegateKghBatch(validator common.Address, tokenIds []*big.Int) (*types.Transaction, error) { + return _AssetManager.Contract.DelegateKghBatch(&_AssetManager.TransactOpts, validator, tokenIds) +} + +// DelegateKghBatch is a paid mutator transaction binding the contract method 0x31d8e007. +// +// Solidity: function delegateKghBatch(address validator, uint256[] tokenIds) returns() +func (_AssetManager *AssetManagerTransactorSession) DelegateKghBatch(validator common.Address, tokenIds []*big.Int) (*types.Transaction, error) { + return _AssetManager.Contract.DelegateKghBatch(&_AssetManager.TransactOpts, validator, tokenIds) +} + +// Deposit is a paid mutator transaction binding the contract method 0x54469aea. +// +// Solidity: function deposit(uint128 assets) returns() +func (_AssetManager *AssetManagerTransactor) Deposit(opts *bind.TransactOpts, assets *big.Int) (*types.Transaction, error) { + return _AssetManager.contract.Transact(opts, "deposit", assets) +} + +// Deposit is a paid mutator transaction binding the contract method 0x54469aea. +// +// Solidity: function deposit(uint128 assets) returns() +func (_AssetManager *AssetManagerSession) Deposit(assets *big.Int) (*types.Transaction, error) { + return _AssetManager.Contract.Deposit(&_AssetManager.TransactOpts, assets) +} + +// Deposit is a paid mutator transaction binding the contract method 0x54469aea. +// +// Solidity: function deposit(uint128 assets) returns() +func (_AssetManager *AssetManagerTransactorSession) Deposit(assets *big.Int) (*types.Transaction, error) { + return _AssetManager.Contract.Deposit(&_AssetManager.TransactOpts, assets) +} + +// DepositToRegister is a paid mutator transaction binding the contract method 0x19412a20. +// +// Solidity: function depositToRegister(address validator, uint128 assets, address withdrawAccount) returns() +func (_AssetManager *AssetManagerTransactor) DepositToRegister(opts *bind.TransactOpts, validator common.Address, assets *big.Int, withdrawAccount common.Address) (*types.Transaction, error) { + return _AssetManager.contract.Transact(opts, "depositToRegister", validator, assets, withdrawAccount) +} + +// DepositToRegister is a paid mutator transaction binding the contract method 0x19412a20. +// +// Solidity: function depositToRegister(address validator, uint128 assets, address withdrawAccount) returns() +func (_AssetManager *AssetManagerSession) DepositToRegister(validator common.Address, assets *big.Int, withdrawAccount common.Address) (*types.Transaction, error) { + return _AssetManager.Contract.DepositToRegister(&_AssetManager.TransactOpts, validator, assets, withdrawAccount) +} + +// DepositToRegister is a paid mutator transaction binding the contract method 0x19412a20. +// +// Solidity: function depositToRegister(address validator, uint128 assets, address withdrawAccount) returns() +func (_AssetManager *AssetManagerTransactorSession) DepositToRegister(validator common.Address, assets *big.Int, withdrawAccount common.Address) (*types.Transaction, error) { + return _AssetManager.Contract.DepositToRegister(&_AssetManager.TransactOpts, validator, assets, withdrawAccount) +} + +// IncreaseBalanceWithChallenge is a paid mutator transaction binding the contract method 0xc42996d6. +// +// Solidity: function increaseBalanceWithChallenge(address winner, uint128 challengeReward) returns(uint128) +func (_AssetManager *AssetManagerTransactor) IncreaseBalanceWithChallenge(opts *bind.TransactOpts, winner common.Address, challengeReward *big.Int) (*types.Transaction, error) { + return _AssetManager.contract.Transact(opts, "increaseBalanceWithChallenge", winner, challengeReward) +} + +// IncreaseBalanceWithChallenge is a paid mutator transaction binding the contract method 0xc42996d6. +// +// Solidity: function increaseBalanceWithChallenge(address winner, uint128 challengeReward) returns(uint128) +func (_AssetManager *AssetManagerSession) IncreaseBalanceWithChallenge(winner common.Address, challengeReward *big.Int) (*types.Transaction, error) { + return _AssetManager.Contract.IncreaseBalanceWithChallenge(&_AssetManager.TransactOpts, winner, challengeReward) +} + +// IncreaseBalanceWithChallenge is a paid mutator transaction binding the contract method 0xc42996d6. +// +// Solidity: function increaseBalanceWithChallenge(address winner, uint128 challengeReward) returns(uint128) +func (_AssetManager *AssetManagerTransactorSession) IncreaseBalanceWithChallenge(winner common.Address, challengeReward *big.Int) (*types.Transaction, error) { + return _AssetManager.Contract.IncreaseBalanceWithChallenge(&_AssetManager.TransactOpts, winner, challengeReward) +} + +// IncreaseBalanceWithReward is a paid mutator transaction binding the contract method 0xad429451. +// +// Solidity: function increaseBalanceWithReward(address validator, uint128 baseReward, uint128 boostedReward, uint128 validatorReward) returns() +func (_AssetManager *AssetManagerTransactor) IncreaseBalanceWithReward(opts *bind.TransactOpts, validator common.Address, baseReward *big.Int, boostedReward *big.Int, validatorReward *big.Int) (*types.Transaction, error) { + return _AssetManager.contract.Transact(opts, "increaseBalanceWithReward", validator, baseReward, boostedReward, validatorReward) +} + +// IncreaseBalanceWithReward is a paid mutator transaction binding the contract method 0xad429451. +// +// Solidity: function increaseBalanceWithReward(address validator, uint128 baseReward, uint128 boostedReward, uint128 validatorReward) returns() +func (_AssetManager *AssetManagerSession) IncreaseBalanceWithReward(validator common.Address, baseReward *big.Int, boostedReward *big.Int, validatorReward *big.Int) (*types.Transaction, error) { + return _AssetManager.Contract.IncreaseBalanceWithReward(&_AssetManager.TransactOpts, validator, baseReward, boostedReward, validatorReward) +} + +// IncreaseBalanceWithReward is a paid mutator transaction binding the contract method 0xad429451. +// +// Solidity: function increaseBalanceWithReward(address validator, uint128 baseReward, uint128 boostedReward, uint128 validatorReward) returns() +func (_AssetManager *AssetManagerTransactorSession) IncreaseBalanceWithReward(validator common.Address, baseReward *big.Int, boostedReward *big.Int, validatorReward *big.Int) (*types.Transaction, error) { + return _AssetManager.Contract.IncreaseBalanceWithReward(&_AssetManager.TransactOpts, validator, baseReward, boostedReward, validatorReward) +} + +// RevertDecreaseBalanceWithChallenge is a paid mutator transaction binding the contract method 0x536afae4. +// +// Solidity: function revertDecreaseBalanceWithChallenge(address loser) returns(uint128) +func (_AssetManager *AssetManagerTransactor) RevertDecreaseBalanceWithChallenge(opts *bind.TransactOpts, loser common.Address) (*types.Transaction, error) { + return _AssetManager.contract.Transact(opts, "revertDecreaseBalanceWithChallenge", loser) +} + +// RevertDecreaseBalanceWithChallenge is a paid mutator transaction binding the contract method 0x536afae4. +// +// Solidity: function revertDecreaseBalanceWithChallenge(address loser) returns(uint128) +func (_AssetManager *AssetManagerSession) RevertDecreaseBalanceWithChallenge(loser common.Address) (*types.Transaction, error) { + return _AssetManager.Contract.RevertDecreaseBalanceWithChallenge(&_AssetManager.TransactOpts, loser) +} + +// RevertDecreaseBalanceWithChallenge is a paid mutator transaction binding the contract method 0x536afae4. +// +// Solidity: function revertDecreaseBalanceWithChallenge(address loser) returns(uint128) +func (_AssetManager *AssetManagerTransactorSession) RevertDecreaseBalanceWithChallenge(loser common.Address) (*types.Transaction, error) { + return _AssetManager.Contract.RevertDecreaseBalanceWithChallenge(&_AssetManager.TransactOpts, loser) +} + +// UnbondValidatorKro is a paid mutator transaction binding the contract method 0xa8387172. +// +// Solidity: function unbondValidatorKro(address validator) returns() +func (_AssetManager *AssetManagerTransactor) UnbondValidatorKro(opts *bind.TransactOpts, validator common.Address) (*types.Transaction, error) { + return _AssetManager.contract.Transact(opts, "unbondValidatorKro", validator) +} + +// UnbondValidatorKro is a paid mutator transaction binding the contract method 0xa8387172. +// +// Solidity: function unbondValidatorKro(address validator) returns() +func (_AssetManager *AssetManagerSession) UnbondValidatorKro(validator common.Address) (*types.Transaction, error) { + return _AssetManager.Contract.UnbondValidatorKro(&_AssetManager.TransactOpts, validator) +} + +// UnbondValidatorKro is a paid mutator transaction binding the contract method 0xa8387172. +// +// Solidity: function unbondValidatorKro(address validator) returns() +func (_AssetManager *AssetManagerTransactorSession) UnbondValidatorKro(validator common.Address) (*types.Transaction, error) { + return _AssetManager.Contract.UnbondValidatorKro(&_AssetManager.TransactOpts, validator) +} + +// Undelegate is a paid mutator transaction binding the contract method 0xb744d2f9. +// +// Solidity: function undelegate(address validator, uint128 assets) returns() +func (_AssetManager *AssetManagerTransactor) Undelegate(opts *bind.TransactOpts, validator common.Address, assets *big.Int) (*types.Transaction, error) { + return _AssetManager.contract.Transact(opts, "undelegate", validator, assets) +} + +// Undelegate is a paid mutator transaction binding the contract method 0xb744d2f9. +// +// Solidity: function undelegate(address validator, uint128 assets) returns() +func (_AssetManager *AssetManagerSession) Undelegate(validator common.Address, assets *big.Int) (*types.Transaction, error) { + return _AssetManager.Contract.Undelegate(&_AssetManager.TransactOpts, validator, assets) +} + +// Undelegate is a paid mutator transaction binding the contract method 0xb744d2f9. +// +// Solidity: function undelegate(address validator, uint128 assets) returns() +func (_AssetManager *AssetManagerTransactorSession) Undelegate(validator common.Address, assets *big.Int) (*types.Transaction, error) { + return _AssetManager.Contract.Undelegate(&_AssetManager.TransactOpts, validator, assets) +} + +// UndelegateKgh is a paid mutator transaction binding the contract method 0x40ce01f1. +// +// Solidity: function undelegateKgh(address validator, uint256 tokenId) returns() +func (_AssetManager *AssetManagerTransactor) UndelegateKgh(opts *bind.TransactOpts, validator common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _AssetManager.contract.Transact(opts, "undelegateKgh", validator, tokenId) +} + +// UndelegateKgh is a paid mutator transaction binding the contract method 0x40ce01f1. +// +// Solidity: function undelegateKgh(address validator, uint256 tokenId) returns() +func (_AssetManager *AssetManagerSession) UndelegateKgh(validator common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _AssetManager.Contract.UndelegateKgh(&_AssetManager.TransactOpts, validator, tokenId) +} + +// UndelegateKgh is a paid mutator transaction binding the contract method 0x40ce01f1. +// +// Solidity: function undelegateKgh(address validator, uint256 tokenId) returns() +func (_AssetManager *AssetManagerTransactorSession) UndelegateKgh(validator common.Address, tokenId *big.Int) (*types.Transaction, error) { + return _AssetManager.Contract.UndelegateKgh(&_AssetManager.TransactOpts, validator, tokenId) +} + +// UndelegateKghBatch is a paid mutator transaction binding the contract method 0x1e5d8178. +// +// Solidity: function undelegateKghBatch(address validator, uint256[] tokenIds) returns() +func (_AssetManager *AssetManagerTransactor) UndelegateKghBatch(opts *bind.TransactOpts, validator common.Address, tokenIds []*big.Int) (*types.Transaction, error) { + return _AssetManager.contract.Transact(opts, "undelegateKghBatch", validator, tokenIds) +} + +// UndelegateKghBatch is a paid mutator transaction binding the contract method 0x1e5d8178. +// +// Solidity: function undelegateKghBatch(address validator, uint256[] tokenIds) returns() +func (_AssetManager *AssetManagerSession) UndelegateKghBatch(validator common.Address, tokenIds []*big.Int) (*types.Transaction, error) { + return _AssetManager.Contract.UndelegateKghBatch(&_AssetManager.TransactOpts, validator, tokenIds) +} + +// UndelegateKghBatch is a paid mutator transaction binding the contract method 0x1e5d8178. +// +// Solidity: function undelegateKghBatch(address validator, uint256[] tokenIds) returns() +func (_AssetManager *AssetManagerTransactorSession) UndelegateKghBatch(validator common.Address, tokenIds []*big.Int) (*types.Transaction, error) { + return _AssetManager.Contract.UndelegateKghBatch(&_AssetManager.TransactOpts, validator, tokenIds) +} + +// Withdraw is a paid mutator transaction binding the contract method 0x08fab167. +// +// Solidity: function withdraw(address validator, uint128 assets) returns() +func (_AssetManager *AssetManagerTransactor) Withdraw(opts *bind.TransactOpts, validator common.Address, assets *big.Int) (*types.Transaction, error) { + return _AssetManager.contract.Transact(opts, "withdraw", validator, assets) +} + +// Withdraw is a paid mutator transaction binding the contract method 0x08fab167. +// +// Solidity: function withdraw(address validator, uint128 assets) returns() +func (_AssetManager *AssetManagerSession) Withdraw(validator common.Address, assets *big.Int) (*types.Transaction, error) { + return _AssetManager.Contract.Withdraw(&_AssetManager.TransactOpts, validator, assets) +} + +// Withdraw is a paid mutator transaction binding the contract method 0x08fab167. +// +// Solidity: function withdraw(address validator, uint128 assets) returns() +func (_AssetManager *AssetManagerTransactorSession) Withdraw(validator common.Address, assets *big.Int) (*types.Transaction, error) { + return _AssetManager.Contract.Withdraw(&_AssetManager.TransactOpts, validator, assets) +} + +// AssetManagerDepositedIterator is returned from FilterDeposited and is used to iterate over the raw logs and unpacked data for Deposited events raised by the AssetManager contract. +type AssetManagerDepositedIterator struct { + Event *AssetManagerDeposited // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *AssetManagerDepositedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(AssetManagerDeposited) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(AssetManagerDeposited) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *AssetManagerDepositedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *AssetManagerDepositedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// AssetManagerDeposited represents a Deposited event raised by the AssetManager contract. +type AssetManagerDeposited struct { + Validator common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDeposited is a free log retrieval operation binding the contract event 0xadb1a06aea2cd2ff20eac971640a5eb7d687df3e3a897be2f334836494958a47. +// +// Solidity: event Deposited(address indexed validator, uint128 amount) +func (_AssetManager *AssetManagerFilterer) FilterDeposited(opts *bind.FilterOpts, validator []common.Address) (*AssetManagerDepositedIterator, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _AssetManager.contract.FilterLogs(opts, "Deposited", validatorRule) + if err != nil { + return nil, err + } + return &AssetManagerDepositedIterator{contract: _AssetManager.contract, event: "Deposited", logs: logs, sub: sub}, nil +} + +// WatchDeposited is a free log subscription operation binding the contract event 0xadb1a06aea2cd2ff20eac971640a5eb7d687df3e3a897be2f334836494958a47. +// +// Solidity: event Deposited(address indexed validator, uint128 amount) +func (_AssetManager *AssetManagerFilterer) WatchDeposited(opts *bind.WatchOpts, sink chan<- *AssetManagerDeposited, validator []common.Address) (event.Subscription, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _AssetManager.contract.WatchLogs(opts, "Deposited", validatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(AssetManagerDeposited) + if err := _AssetManager.contract.UnpackLog(event, "Deposited", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDeposited is a log parse operation binding the contract event 0xadb1a06aea2cd2ff20eac971640a5eb7d687df3e3a897be2f334836494958a47. +// +// Solidity: event Deposited(address indexed validator, uint128 amount) +func (_AssetManager *AssetManagerFilterer) ParseDeposited(log types.Log) (*AssetManagerDeposited, error) { + event := new(AssetManagerDeposited) + if err := _AssetManager.contract.UnpackLog(event, "Deposited", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// AssetManagerKghBatchDelegatedIterator is returned from FilterKghBatchDelegated and is used to iterate over the raw logs and unpacked data for KghBatchDelegated events raised by the AssetManager contract. +type AssetManagerKghBatchDelegatedIterator struct { + Event *AssetManagerKghBatchDelegated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *AssetManagerKghBatchDelegatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(AssetManagerKghBatchDelegated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(AssetManagerKghBatchDelegated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *AssetManagerKghBatchDelegatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *AssetManagerKghBatchDelegatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// AssetManagerKghBatchDelegated represents a KghBatchDelegated event raised by the AssetManager contract. +type AssetManagerKghBatchDelegated struct { + Validator common.Address + Delegator common.Address + TokenIds []*big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterKghBatchDelegated is a free log retrieval operation binding the contract event 0xafdb227ea10128ee703397dbff24db1f7c90303e6fff8068a2712a1b10c935f1. +// +// Solidity: event KghBatchDelegated(address indexed validator, address indexed delegator, uint256[] tokenIds) +func (_AssetManager *AssetManagerFilterer) FilterKghBatchDelegated(opts *bind.FilterOpts, validator []common.Address, delegator []common.Address) (*AssetManagerKghBatchDelegatedIterator, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _AssetManager.contract.FilterLogs(opts, "KghBatchDelegated", validatorRule, delegatorRule) + if err != nil { + return nil, err + } + return &AssetManagerKghBatchDelegatedIterator{contract: _AssetManager.contract, event: "KghBatchDelegated", logs: logs, sub: sub}, nil +} + +// WatchKghBatchDelegated is a free log subscription operation binding the contract event 0xafdb227ea10128ee703397dbff24db1f7c90303e6fff8068a2712a1b10c935f1. +// +// Solidity: event KghBatchDelegated(address indexed validator, address indexed delegator, uint256[] tokenIds) +func (_AssetManager *AssetManagerFilterer) WatchKghBatchDelegated(opts *bind.WatchOpts, sink chan<- *AssetManagerKghBatchDelegated, validator []common.Address, delegator []common.Address) (event.Subscription, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _AssetManager.contract.WatchLogs(opts, "KghBatchDelegated", validatorRule, delegatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(AssetManagerKghBatchDelegated) + if err := _AssetManager.contract.UnpackLog(event, "KghBatchDelegated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseKghBatchDelegated is a log parse operation binding the contract event 0xafdb227ea10128ee703397dbff24db1f7c90303e6fff8068a2712a1b10c935f1. +// +// Solidity: event KghBatchDelegated(address indexed validator, address indexed delegator, uint256[] tokenIds) +func (_AssetManager *AssetManagerFilterer) ParseKghBatchDelegated(log types.Log) (*AssetManagerKghBatchDelegated, error) { + event := new(AssetManagerKghBatchDelegated) + if err := _AssetManager.contract.UnpackLog(event, "KghBatchDelegated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// AssetManagerKghBatchUndelegatedIterator is returned from FilterKghBatchUndelegated and is used to iterate over the raw logs and unpacked data for KghBatchUndelegated events raised by the AssetManager contract. +type AssetManagerKghBatchUndelegatedIterator struct { + Event *AssetManagerKghBatchUndelegated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *AssetManagerKghBatchUndelegatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(AssetManagerKghBatchUndelegated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(AssetManagerKghBatchUndelegated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *AssetManagerKghBatchUndelegatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *AssetManagerKghBatchUndelegatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// AssetManagerKghBatchUndelegated represents a KghBatchUndelegated event raised by the AssetManager contract. +type AssetManagerKghBatchUndelegated struct { + Validator common.Address + Delegator common.Address + TokenIds []*big.Int + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterKghBatchUndelegated is a free log retrieval operation binding the contract event 0x6fcfb0c3a157955b6809f57bb114c142779ab9b7dd686a1b28ec0f2c9edfb943. +// +// Solidity: event KghBatchUndelegated(address indexed validator, address indexed delegator, uint256[] tokenIds, uint128 amount) +func (_AssetManager *AssetManagerFilterer) FilterKghBatchUndelegated(opts *bind.FilterOpts, validator []common.Address, delegator []common.Address) (*AssetManagerKghBatchUndelegatedIterator, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _AssetManager.contract.FilterLogs(opts, "KghBatchUndelegated", validatorRule, delegatorRule) + if err != nil { + return nil, err + } + return &AssetManagerKghBatchUndelegatedIterator{contract: _AssetManager.contract, event: "KghBatchUndelegated", logs: logs, sub: sub}, nil +} + +// WatchKghBatchUndelegated is a free log subscription operation binding the contract event 0x6fcfb0c3a157955b6809f57bb114c142779ab9b7dd686a1b28ec0f2c9edfb943. +// +// Solidity: event KghBatchUndelegated(address indexed validator, address indexed delegator, uint256[] tokenIds, uint128 amount) +func (_AssetManager *AssetManagerFilterer) WatchKghBatchUndelegated(opts *bind.WatchOpts, sink chan<- *AssetManagerKghBatchUndelegated, validator []common.Address, delegator []common.Address) (event.Subscription, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _AssetManager.contract.WatchLogs(opts, "KghBatchUndelegated", validatorRule, delegatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(AssetManagerKghBatchUndelegated) + if err := _AssetManager.contract.UnpackLog(event, "KghBatchUndelegated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseKghBatchUndelegated is a log parse operation binding the contract event 0x6fcfb0c3a157955b6809f57bb114c142779ab9b7dd686a1b28ec0f2c9edfb943. +// +// Solidity: event KghBatchUndelegated(address indexed validator, address indexed delegator, uint256[] tokenIds, uint128 amount) +func (_AssetManager *AssetManagerFilterer) ParseKghBatchUndelegated(log types.Log) (*AssetManagerKghBatchUndelegated, error) { + event := new(AssetManagerKghBatchUndelegated) + if err := _AssetManager.contract.UnpackLog(event, "KghBatchUndelegated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// AssetManagerKghDelegatedIterator is returned from FilterKghDelegated and is used to iterate over the raw logs and unpacked data for KghDelegated events raised by the AssetManager contract. +type AssetManagerKghDelegatedIterator struct { + Event *AssetManagerKghDelegated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *AssetManagerKghDelegatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(AssetManagerKghDelegated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(AssetManagerKghDelegated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *AssetManagerKghDelegatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *AssetManagerKghDelegatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// AssetManagerKghDelegated represents a KghDelegated event raised by the AssetManager contract. +type AssetManagerKghDelegated struct { + Validator common.Address + Delegator common.Address + TokenId *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterKghDelegated is a free log retrieval operation binding the contract event 0x7a9043ba5086cf56c416db64f7608d06eae96d08a7e35a101ad4f42aab23585d. +// +// Solidity: event KghDelegated(address indexed validator, address indexed delegator, uint256 tokenId) +func (_AssetManager *AssetManagerFilterer) FilterKghDelegated(opts *bind.FilterOpts, validator []common.Address, delegator []common.Address) (*AssetManagerKghDelegatedIterator, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _AssetManager.contract.FilterLogs(opts, "KghDelegated", validatorRule, delegatorRule) + if err != nil { + return nil, err + } + return &AssetManagerKghDelegatedIterator{contract: _AssetManager.contract, event: "KghDelegated", logs: logs, sub: sub}, nil +} + +// WatchKghDelegated is a free log subscription operation binding the contract event 0x7a9043ba5086cf56c416db64f7608d06eae96d08a7e35a101ad4f42aab23585d. +// +// Solidity: event KghDelegated(address indexed validator, address indexed delegator, uint256 tokenId) +func (_AssetManager *AssetManagerFilterer) WatchKghDelegated(opts *bind.WatchOpts, sink chan<- *AssetManagerKghDelegated, validator []common.Address, delegator []common.Address) (event.Subscription, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _AssetManager.contract.WatchLogs(opts, "KghDelegated", validatorRule, delegatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(AssetManagerKghDelegated) + if err := _AssetManager.contract.UnpackLog(event, "KghDelegated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseKghDelegated is a log parse operation binding the contract event 0x7a9043ba5086cf56c416db64f7608d06eae96d08a7e35a101ad4f42aab23585d. +// +// Solidity: event KghDelegated(address indexed validator, address indexed delegator, uint256 tokenId) +func (_AssetManager *AssetManagerFilterer) ParseKghDelegated(log types.Log) (*AssetManagerKghDelegated, error) { + event := new(AssetManagerKghDelegated) + if err := _AssetManager.contract.UnpackLog(event, "KghDelegated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// AssetManagerKghRewardClaimedIterator is returned from FilterKghRewardClaimed and is used to iterate over the raw logs and unpacked data for KghRewardClaimed events raised by the AssetManager contract. +type AssetManagerKghRewardClaimedIterator struct { + Event *AssetManagerKghRewardClaimed // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *AssetManagerKghRewardClaimedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(AssetManagerKghRewardClaimed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(AssetManagerKghRewardClaimed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *AssetManagerKghRewardClaimedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *AssetManagerKghRewardClaimedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// AssetManagerKghRewardClaimed represents a KghRewardClaimed event raised by the AssetManager contract. +type AssetManagerKghRewardClaimed struct { + Validator common.Address + Delegator common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterKghRewardClaimed is a free log retrieval operation binding the contract event 0xf31a7084636b55317cfeed458343e6f580e12d52ba89be9f1faae91731fcce42. +// +// Solidity: event KghRewardClaimed(address indexed validator, address indexed delegator, uint128 amount) +func (_AssetManager *AssetManagerFilterer) FilterKghRewardClaimed(opts *bind.FilterOpts, validator []common.Address, delegator []common.Address) (*AssetManagerKghRewardClaimedIterator, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _AssetManager.contract.FilterLogs(opts, "KghRewardClaimed", validatorRule, delegatorRule) + if err != nil { + return nil, err + } + return &AssetManagerKghRewardClaimedIterator{contract: _AssetManager.contract, event: "KghRewardClaimed", logs: logs, sub: sub}, nil +} + +// WatchKghRewardClaimed is a free log subscription operation binding the contract event 0xf31a7084636b55317cfeed458343e6f580e12d52ba89be9f1faae91731fcce42. +// +// Solidity: event KghRewardClaimed(address indexed validator, address indexed delegator, uint128 amount) +func (_AssetManager *AssetManagerFilterer) WatchKghRewardClaimed(opts *bind.WatchOpts, sink chan<- *AssetManagerKghRewardClaimed, validator []common.Address, delegator []common.Address) (event.Subscription, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _AssetManager.contract.WatchLogs(opts, "KghRewardClaimed", validatorRule, delegatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(AssetManagerKghRewardClaimed) + if err := _AssetManager.contract.UnpackLog(event, "KghRewardClaimed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseKghRewardClaimed is a log parse operation binding the contract event 0xf31a7084636b55317cfeed458343e6f580e12d52ba89be9f1faae91731fcce42. +// +// Solidity: event KghRewardClaimed(address indexed validator, address indexed delegator, uint128 amount) +func (_AssetManager *AssetManagerFilterer) ParseKghRewardClaimed(log types.Log) (*AssetManagerKghRewardClaimed, error) { + event := new(AssetManagerKghRewardClaimed) + if err := _AssetManager.contract.UnpackLog(event, "KghRewardClaimed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// AssetManagerKghUndelegatedIterator is returned from FilterKghUndelegated and is used to iterate over the raw logs and unpacked data for KghUndelegated events raised by the AssetManager contract. +type AssetManagerKghUndelegatedIterator struct { + Event *AssetManagerKghUndelegated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *AssetManagerKghUndelegatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(AssetManagerKghUndelegated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(AssetManagerKghUndelegated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *AssetManagerKghUndelegatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *AssetManagerKghUndelegatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// AssetManagerKghUndelegated represents a KghUndelegated event raised by the AssetManager contract. +type AssetManagerKghUndelegated struct { + Validator common.Address + Delegator common.Address + TokenId *big.Int + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterKghUndelegated is a free log retrieval operation binding the contract event 0xd1343dccf52a899cdc8aaa99714d930d2871b21c218512c779ca3f7c7fddab41. +// +// Solidity: event KghUndelegated(address indexed validator, address indexed delegator, uint256 tokenId, uint128 amount) +func (_AssetManager *AssetManagerFilterer) FilterKghUndelegated(opts *bind.FilterOpts, validator []common.Address, delegator []common.Address) (*AssetManagerKghUndelegatedIterator, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _AssetManager.contract.FilterLogs(opts, "KghUndelegated", validatorRule, delegatorRule) + if err != nil { + return nil, err + } + return &AssetManagerKghUndelegatedIterator{contract: _AssetManager.contract, event: "KghUndelegated", logs: logs, sub: sub}, nil +} + +// WatchKghUndelegated is a free log subscription operation binding the contract event 0xd1343dccf52a899cdc8aaa99714d930d2871b21c218512c779ca3f7c7fddab41. +// +// Solidity: event KghUndelegated(address indexed validator, address indexed delegator, uint256 tokenId, uint128 amount) +func (_AssetManager *AssetManagerFilterer) WatchKghUndelegated(opts *bind.WatchOpts, sink chan<- *AssetManagerKghUndelegated, validator []common.Address, delegator []common.Address) (event.Subscription, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _AssetManager.contract.WatchLogs(opts, "KghUndelegated", validatorRule, delegatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(AssetManagerKghUndelegated) + if err := _AssetManager.contract.UnpackLog(event, "KghUndelegated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseKghUndelegated is a log parse operation binding the contract event 0xd1343dccf52a899cdc8aaa99714d930d2871b21c218512c779ca3f7c7fddab41. +// +// Solidity: event KghUndelegated(address indexed validator, address indexed delegator, uint256 tokenId, uint128 amount) +func (_AssetManager *AssetManagerFilterer) ParseKghUndelegated(log types.Log) (*AssetManagerKghUndelegated, error) { + event := new(AssetManagerKghUndelegated) + if err := _AssetManager.contract.UnpackLog(event, "KghUndelegated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// AssetManagerKroDelegatedIterator is returned from FilterKroDelegated and is used to iterate over the raw logs and unpacked data for KroDelegated events raised by the AssetManager contract. +type AssetManagerKroDelegatedIterator struct { + Event *AssetManagerKroDelegated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *AssetManagerKroDelegatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(AssetManagerKroDelegated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(AssetManagerKroDelegated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *AssetManagerKroDelegatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *AssetManagerKroDelegatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// AssetManagerKroDelegated represents a KroDelegated event raised by the AssetManager contract. +type AssetManagerKroDelegated struct { + Validator common.Address + Delegator common.Address + Amount *big.Int + Shares *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterKroDelegated is a free log retrieval operation binding the contract event 0x334cabe84b7338f2bdd62070c02f24ffbcc7735e46f425fa401db349717e1328. +// +// Solidity: event KroDelegated(address indexed validator, address indexed delegator, uint128 amount, uint128 shares) +func (_AssetManager *AssetManagerFilterer) FilterKroDelegated(opts *bind.FilterOpts, validator []common.Address, delegator []common.Address) (*AssetManagerKroDelegatedIterator, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _AssetManager.contract.FilterLogs(opts, "KroDelegated", validatorRule, delegatorRule) + if err != nil { + return nil, err + } + return &AssetManagerKroDelegatedIterator{contract: _AssetManager.contract, event: "KroDelegated", logs: logs, sub: sub}, nil +} + +// WatchKroDelegated is a free log subscription operation binding the contract event 0x334cabe84b7338f2bdd62070c02f24ffbcc7735e46f425fa401db349717e1328. +// +// Solidity: event KroDelegated(address indexed validator, address indexed delegator, uint128 amount, uint128 shares) +func (_AssetManager *AssetManagerFilterer) WatchKroDelegated(opts *bind.WatchOpts, sink chan<- *AssetManagerKroDelegated, validator []common.Address, delegator []common.Address) (event.Subscription, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _AssetManager.contract.WatchLogs(opts, "KroDelegated", validatorRule, delegatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(AssetManagerKroDelegated) + if err := _AssetManager.contract.UnpackLog(event, "KroDelegated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseKroDelegated is a log parse operation binding the contract event 0x334cabe84b7338f2bdd62070c02f24ffbcc7735e46f425fa401db349717e1328. +// +// Solidity: event KroDelegated(address indexed validator, address indexed delegator, uint128 amount, uint128 shares) +func (_AssetManager *AssetManagerFilterer) ParseKroDelegated(log types.Log) (*AssetManagerKroDelegated, error) { + event := new(AssetManagerKroDelegated) + if err := _AssetManager.contract.UnpackLog(event, "KroDelegated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// AssetManagerKroUndelegatedIterator is returned from FilterKroUndelegated and is used to iterate over the raw logs and unpacked data for KroUndelegated events raised by the AssetManager contract. +type AssetManagerKroUndelegatedIterator struct { + Event *AssetManagerKroUndelegated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *AssetManagerKroUndelegatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(AssetManagerKroUndelegated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(AssetManagerKroUndelegated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *AssetManagerKroUndelegatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *AssetManagerKroUndelegatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// AssetManagerKroUndelegated represents a KroUndelegated event raised by the AssetManager contract. +type AssetManagerKroUndelegated struct { + Validator common.Address + Delegator common.Address + Amount *big.Int + Shares *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterKroUndelegated is a free log retrieval operation binding the contract event 0x6acf5e34cb1562e3a0785bb4565e0761928cda3dd258168c73bca09621c669e9. +// +// Solidity: event KroUndelegated(address indexed validator, address indexed delegator, uint128 amount, uint128 shares) +func (_AssetManager *AssetManagerFilterer) FilterKroUndelegated(opts *bind.FilterOpts, validator []common.Address, delegator []common.Address) (*AssetManagerKroUndelegatedIterator, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _AssetManager.contract.FilterLogs(opts, "KroUndelegated", validatorRule, delegatorRule) + if err != nil { + return nil, err + } + return &AssetManagerKroUndelegatedIterator{contract: _AssetManager.contract, event: "KroUndelegated", logs: logs, sub: sub}, nil +} + +// WatchKroUndelegated is a free log subscription operation binding the contract event 0x6acf5e34cb1562e3a0785bb4565e0761928cda3dd258168c73bca09621c669e9. +// +// Solidity: event KroUndelegated(address indexed validator, address indexed delegator, uint128 amount, uint128 shares) +func (_AssetManager *AssetManagerFilterer) WatchKroUndelegated(opts *bind.WatchOpts, sink chan<- *AssetManagerKroUndelegated, validator []common.Address, delegator []common.Address) (event.Subscription, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _AssetManager.contract.WatchLogs(opts, "KroUndelegated", validatorRule, delegatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(AssetManagerKroUndelegated) + if err := _AssetManager.contract.UnpackLog(event, "KroUndelegated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseKroUndelegated is a log parse operation binding the contract event 0x6acf5e34cb1562e3a0785bb4565e0761928cda3dd258168c73bca09621c669e9. +// +// Solidity: event KroUndelegated(address indexed validator, address indexed delegator, uint128 amount, uint128 shares) +func (_AssetManager *AssetManagerFilterer) ParseKroUndelegated(log types.Log) (*AssetManagerKroUndelegated, error) { + event := new(AssetManagerKroUndelegated) + if err := _AssetManager.contract.UnpackLog(event, "KroUndelegated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// AssetManagerValidatorKroBondedIterator is returned from FilterValidatorKroBonded and is used to iterate over the raw logs and unpacked data for ValidatorKroBonded events raised by the AssetManager contract. +type AssetManagerValidatorKroBondedIterator struct { + Event *AssetManagerValidatorKroBonded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *AssetManagerValidatorKroBondedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(AssetManagerValidatorKroBonded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(AssetManagerValidatorKroBonded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *AssetManagerValidatorKroBondedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *AssetManagerValidatorKroBondedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// AssetManagerValidatorKroBonded represents a ValidatorKroBonded event raised by the AssetManager contract. +type AssetManagerValidatorKroBonded struct { + Validator common.Address + Amount *big.Int + Remainder *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorKroBonded is a free log retrieval operation binding the contract event 0x7ad6f32675ff7ed77c34b45d23cd987ea6a62560f390baac683de0bc6b24fb7e. +// +// Solidity: event ValidatorKroBonded(address indexed validator, uint128 amount, uint128 remainder) +func (_AssetManager *AssetManagerFilterer) FilterValidatorKroBonded(opts *bind.FilterOpts, validator []common.Address) (*AssetManagerValidatorKroBondedIterator, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _AssetManager.contract.FilterLogs(opts, "ValidatorKroBonded", validatorRule) + if err != nil { + return nil, err + } + return &AssetManagerValidatorKroBondedIterator{contract: _AssetManager.contract, event: "ValidatorKroBonded", logs: logs, sub: sub}, nil +} + +// WatchValidatorKroBonded is a free log subscription operation binding the contract event 0x7ad6f32675ff7ed77c34b45d23cd987ea6a62560f390baac683de0bc6b24fb7e. +// +// Solidity: event ValidatorKroBonded(address indexed validator, uint128 amount, uint128 remainder) +func (_AssetManager *AssetManagerFilterer) WatchValidatorKroBonded(opts *bind.WatchOpts, sink chan<- *AssetManagerValidatorKroBonded, validator []common.Address) (event.Subscription, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _AssetManager.contract.WatchLogs(opts, "ValidatorKroBonded", validatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(AssetManagerValidatorKroBonded) + if err := _AssetManager.contract.UnpackLog(event, "ValidatorKroBonded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorKroBonded is a log parse operation binding the contract event 0x7ad6f32675ff7ed77c34b45d23cd987ea6a62560f390baac683de0bc6b24fb7e. +// +// Solidity: event ValidatorKroBonded(address indexed validator, uint128 amount, uint128 remainder) +func (_AssetManager *AssetManagerFilterer) ParseValidatorKroBonded(log types.Log) (*AssetManagerValidatorKroBonded, error) { + event := new(AssetManagerValidatorKroBonded) + if err := _AssetManager.contract.UnpackLog(event, "ValidatorKroBonded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// AssetManagerValidatorKroUnbondedIterator is returned from FilterValidatorKroUnbonded and is used to iterate over the raw logs and unpacked data for ValidatorKroUnbonded events raised by the AssetManager contract. +type AssetManagerValidatorKroUnbondedIterator struct { + Event *AssetManagerValidatorKroUnbonded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *AssetManagerValidatorKroUnbondedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(AssetManagerValidatorKroUnbonded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(AssetManagerValidatorKroUnbonded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *AssetManagerValidatorKroUnbondedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *AssetManagerValidatorKroUnbondedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// AssetManagerValidatorKroUnbonded represents a ValidatorKroUnbonded event raised by the AssetManager contract. +type AssetManagerValidatorKroUnbonded struct { + Validator common.Address + Amount *big.Int + Remainder *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorKroUnbonded is a free log retrieval operation binding the contract event 0xc8d4f2228d78be7d0ca97344025aae4f9bc2c87ece32295d72791a4d39f2a71a. +// +// Solidity: event ValidatorKroUnbonded(address indexed validator, uint128 amount, uint128 remainder) +func (_AssetManager *AssetManagerFilterer) FilterValidatorKroUnbonded(opts *bind.FilterOpts, validator []common.Address) (*AssetManagerValidatorKroUnbondedIterator, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _AssetManager.contract.FilterLogs(opts, "ValidatorKroUnbonded", validatorRule) + if err != nil { + return nil, err + } + return &AssetManagerValidatorKroUnbondedIterator{contract: _AssetManager.contract, event: "ValidatorKroUnbonded", logs: logs, sub: sub}, nil +} + +// WatchValidatorKroUnbonded is a free log subscription operation binding the contract event 0xc8d4f2228d78be7d0ca97344025aae4f9bc2c87ece32295d72791a4d39f2a71a. +// +// Solidity: event ValidatorKroUnbonded(address indexed validator, uint128 amount, uint128 remainder) +func (_AssetManager *AssetManagerFilterer) WatchValidatorKroUnbonded(opts *bind.WatchOpts, sink chan<- *AssetManagerValidatorKroUnbonded, validator []common.Address) (event.Subscription, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _AssetManager.contract.WatchLogs(opts, "ValidatorKroUnbonded", validatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(AssetManagerValidatorKroUnbonded) + if err := _AssetManager.contract.UnpackLog(event, "ValidatorKroUnbonded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorKroUnbonded is a log parse operation binding the contract event 0xc8d4f2228d78be7d0ca97344025aae4f9bc2c87ece32295d72791a4d39f2a71a. +// +// Solidity: event ValidatorKroUnbonded(address indexed validator, uint128 amount, uint128 remainder) +func (_AssetManager *AssetManagerFilterer) ParseValidatorKroUnbonded(log types.Log) (*AssetManagerValidatorKroUnbonded, error) { + event := new(AssetManagerValidatorKroUnbonded) + if err := _AssetManager.contract.UnpackLog(event, "ValidatorKroUnbonded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// AssetManagerWithdrawnIterator is returned from FilterWithdrawn and is used to iterate over the raw logs and unpacked data for Withdrawn events raised by the AssetManager contract. +type AssetManagerWithdrawnIterator struct { + Event *AssetManagerWithdrawn // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *AssetManagerWithdrawnIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(AssetManagerWithdrawn) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(AssetManagerWithdrawn) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *AssetManagerWithdrawnIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *AssetManagerWithdrawnIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// AssetManagerWithdrawn represents a Withdrawn event raised by the AssetManager contract. +type AssetManagerWithdrawn struct { + Validator common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterWithdrawn is a free log retrieval operation binding the contract event 0xab48b3d59a240196dc5bdd7f7a638fca310f8194c7d350c3dd7765861311ddf8. +// +// Solidity: event Withdrawn(address indexed validator, uint128 amount) +func (_AssetManager *AssetManagerFilterer) FilterWithdrawn(opts *bind.FilterOpts, validator []common.Address) (*AssetManagerWithdrawnIterator, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _AssetManager.contract.FilterLogs(opts, "Withdrawn", validatorRule) + if err != nil { + return nil, err + } + return &AssetManagerWithdrawnIterator{contract: _AssetManager.contract, event: "Withdrawn", logs: logs, sub: sub}, nil +} + +// WatchWithdrawn is a free log subscription operation binding the contract event 0xab48b3d59a240196dc5bdd7f7a638fca310f8194c7d350c3dd7765861311ddf8. +// +// Solidity: event Withdrawn(address indexed validator, uint128 amount) +func (_AssetManager *AssetManagerFilterer) WatchWithdrawn(opts *bind.WatchOpts, sink chan<- *AssetManagerWithdrawn, validator []common.Address) (event.Subscription, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _AssetManager.contract.WatchLogs(opts, "Withdrawn", validatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(AssetManagerWithdrawn) + if err := _AssetManager.contract.UnpackLog(event, "Withdrawn", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseWithdrawn is a log parse operation binding the contract event 0xab48b3d59a240196dc5bdd7f7a638fca310f8194c7d350c3dd7765861311ddf8. +// +// Solidity: event Withdrawn(address indexed validator, uint128 amount) +func (_AssetManager *AssetManagerFilterer) ParseWithdrawn(log types.Log) (*AssetManagerWithdrawn, error) { + event := new(AssetManagerWithdrawn) + if err := _AssetManager.contract.UnpackLog(event, "Withdrawn", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/kroma-bindings/bindings/assetmanager_more.go b/kroma-bindings/bindings/assetmanager_more.go new file mode 100644 index 0000000000..2773866525 --- /dev/null +++ b/kroma-bindings/bindings/assetmanager_more.go @@ -0,0 +1,27 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "encoding/json" + + "github.com/ethereum-optimism/optimism/op-bindings/solc" +) + +const AssetManagerStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/L1/AssetManager.sol:AssetManager\",\"label\":\"_vaults\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_mapping(t_address,t_struct(Vault)1004_storage)\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_mapping(t_address,t_struct(KghDelegator)1002_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e struct IAssetManager.KghDelegator)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_struct(KghDelegator)1002_storage\"},\"t_mapping(t_address,t_struct(KroDelegator)1003_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e struct IAssetManager.KroDelegator)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_struct(KroDelegator)1003_storage\"},\"t_mapping(t_address,t_struct(Vault)1004_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e struct IAssetManager.Vault)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_struct(Vault)1004_storage\"},\"t_mapping(t_uint256,t_uint128)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e uint128)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_uint128\"},\"t_struct(Asset)1001_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IAssetManager.Asset\",\"numberOfBytes\":\"96\"},\"t_struct(KghDelegator)1002_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IAssetManager.KghDelegator\",\"numberOfBytes\":\"64\"},\"t_struct(KroDelegator)1003_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IAssetManager.KroDelegator\",\"numberOfBytes\":\"32\"},\"t_struct(Vault)1004_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IAssetManager.Vault\",\"numberOfBytes\":\"224\"},\"t_uint128\":{\"encoding\":\"inplace\",\"label\":\"uint128\",\"numberOfBytes\":\"16\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"}}}" + +var AssetManagerStorageLayout = new(solc.StorageLayout) + +var AssetManagerDeployedBin = "0x608060405234801561001057600080fd5b50600436106102f45760003560e01c80638abf0af011610191578063b172597e116100e3578063c2d9b68411610097578063d706200511610071578063d706200514610826578063de7d4d6a1461084d578063fdbb3fd21461085757600080fd5b8063c2d9b684146107d4578063c42996d614610800578063c7ab2c071461081357600080fd5b8063b744d2f9116100c8578063b744d2f914610773578063bcacc70a14610786578063c0a63a79146107ad57600080fd5b8063b172597e1461074d578063b55cd78e1461076057600080fd5b8063a51c9ace11610145578063a85120e41161011f578063a85120e414610700578063ad42945114610713578063ae9483e01461072657600080fd5b8063a51c9ace146106d2578063a63b8d14146106da578063a8387172146106ed57600080fd5b8063913f1a9f11610176578063913f1a9f14610655578063960a08931461068a578063981cee531461069d57600080fd5b80638abf0af01461062f5780638c1516c71461064257600080fd5b806354469aea1161024a5780636b9ffeac116101fe578063833a333b116101d8578063833a333b146105c5578063842d0d3b146105d857806386d18a941461061c57600080fd5b80636b9ffeac1461053d5780637db41f971461057257806382dae3aa146105bd57600080fd5b80635636aabd1161022f5780635636aabd146104c757806356576b5b146104da5780635959b7651461050157600080fd5b806354469aea1461046b57806354fd4d501461047e57600080fd5b8063209a9694116102ac5780633608641711610286578063360864171461040657806340ce01f114610445578063536afae41461045857600080fd5b8063209a9694146103b5578063270a1644146103e057806331d8e007146103f357600080fd5b806319412a20116102dd57806319412a201461037c5780631e5d81781461038f5780631f86f4f1146103a257600080fd5b806308fab167146102f9578063150b7a021461030e575b600080fd5b61030c61030736600461382c565b61087e565b005b61034661031c366004613863565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b61030c61038a3660046138fe565b610b8d565b61030c61039d366004613943565b610cc7565b61030c6103b03660046139c9565b61105e565b6103c86103c336600461382c565b611407565b6040516001600160801b039091168152602001610373565b61030c6103ee3660046139f3565b61141c565b61030c610401366004613943565b6114f7565b61042d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610373565b61030c6104533660046139c9565b611989565b6103c86104663660046139f3565b611c42565b61030c610479366004613a0e565b611d30565b6104ba6040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516103739190613a5e565b6103c86104d53660046139f3565b611f3d565b61042d7f000000000000000000000000000000000000000000000000000000000000000081565b6103c861050f3660046139f3565b6001600160a01b0316600090815260208190526040902060020154600160801b90046001600160801b031690565b6103c861054b3660046139f3565b6001600160a01b03166000908152602081905260409020600301546001600160801b031690565b6103c8610580366004613aaf565b6001600160a01b0391821660009081526020818152604080832093909416825260069092019091522054600160801b90046001600160801b031690565b6103c8601481565b6103c86105d3366004613aaf565b612028565b6103c86105e6366004613aaf565b6001600160a01b03918216600090815260208181526040808320939094168252600590920190915220546001600160801b031690565b6103c861062a366004613ae2565b6120a1565b6103c861063d3660046139f3565b612112565b61030c6106503660046139f3565b61214b565b6103c86106633660046139f3565b6001600160a01b03166000908152602081905260409020600401546001600160801b031690565b6103c861069836600461382c565b6122f2565b6103c86106ab3660046139f3565b6001600160a01b03166000908152602081905260409020600201546001600160801b031690565b6103c8606481565b6103c86106e83660046139f3565b6122fe565b61030c6106fb3660046139f3565b61234e565b6103c861070e36600461382c565b61246e565b61030c610721366004613b1e565b612805565b61042d7f000000000000000000000000000000000000000000000000000000000000000081565b6103c861075b3660046139f3565b612af2565b6103c861076e366004613aaf565b612b2a565b61030c61078136600461382c565b612b8f565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b61042d7f000000000000000000000000000000000000000000000000000000000000000081565b61042d6107e23660046139f3565b6001600160a01b039081166000908152602081905260409020541690565b6103c861080e36600461382c565b612e87565b6103c8610821366004613aaf565b613040565b61042d7f000000000000000000000000000000000000000000000000000000000000000081565b6103c8620f424081565b6103c87f000000000000000000000000000000000000000000000000000000000000000081565b6001600160a01b0382811660009081526020819052604090205483911633146108d3576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816001600160801b0316600003610916576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42610920846122fe565b6001600160801b03161115610961576040517f285d5a9200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f970531c10000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015242917f00000000000000000000000000000000000000000000000000000000000000009091169063970531c190602401602060405180830381865afa1580156109e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a089190613b78565b6001600160801b03161115610a49576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a53838361307e565b6040517f5bab847f0000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152600160248301527f00000000000000000000000000000000000000000000000000000000000000001690635bab847f90604401600060405180830381600087803b158015610ad657600080fd5b505af1158015610aea573d6000803e3d6000fd5b5050506001600160a01b03808516600090815260208190526040902054610b4092507f0000000000000000000000000000000000000000000000000000000000000000821691166001600160801b038516613131565b6040516001600160801b03831681526001600160a01b038416907fab48b3d59a240196dc5bdd7f7a638fca310f8194c7d350c3dd7765861311ddf8906020015b60405180910390a2505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bef576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116610c2f576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03838116600090815260208190526040812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001692841692909217909155610c8390849084906131fd565b6040516001600160801b03831681526001600160a01b038416907fadb1a06aea2cd2ff20eac971640a5eb7d687df3e3a897be2f334836494958a4790602001610b80565b6000819003610d02576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383166000908152602081815260408083203384526006019091528120905b82811015610e5a57816001016000858584818110610d4857610d48613b95565b602090810292909201358352508101919091526040016000908120546001600160801b03169003610da5576040517fe77a0da400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42610dc98633878786818110610dbd57610dbd613b95565b905060200201356120a1565b6001600160801b03161115610e0a576040517f285d5a9200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816001016000858584818110610e2257610e22613b95565b6020908102929092013583525081019190915260400160002080546fffffffffffffffffffffffffffffffff19169055600101610d28565b506000610e678533613333565b6001600160a01b0386166000908152602081815260408083206004810180546fffffffffffffffffffffffffffffffff1981166001600160801b039182168b900382161790915533855260069091019092529091208054808316600160801b91829004841688900390931602919091179055905060005b83811015610fbb577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166342842e0e3033888886818110610f2957610f29613b95565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b158015610f9857600080fd5b505af1158015610fac573d6000803e3d6000fd5b50505050806001019050610ede565b506001600160801b03811615611008576110086001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016336001600160801b038416613131565b336001600160a01b0316856001600160a01b03167f6fcfb0c3a157955b6809f57bb114c142779ab9b7dd686a1b28ec0f2c9edfb94386868560405161104f93929190613c13565b60405180910390a35050505050565b8160026040517f30ccebb50000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f000000000000000000000000000000000000000000000000000000000000000016906330ccebb590602401602060405180830381865afa1580156110e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111049190613c6f565b600581111561111557611115613c40565b10806111bf57506040517f56b65e970000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000016906356b65e9790602401602060405180830381865afa15801561119b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111bf9190613c90565b156111f6576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112028433613333565b90506001600160801b0381161561129a576112506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016336001600160801b038416613131565b6040516001600160801b038216815233906001600160a01b038616907ff31a7084636b55317cfeed458343e6f580e12d52ba89be9f1faae91731fcce429060200160405180910390a35b6040517f42842e0e000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906342842e0e90606401600060405180830381600087803b15801561132157600080fd5b505af1158015611335573d6000803e3d6000fd5b505050506001600160a01b038416600090815260208181526040808320338452600681018352818420600490910180546001600160801b03808216600190810182166fffffffffffffffffffffffffffffffff19938416179093558354600160801b808204831685018316029082161784558987529190920190935292208054429092169190921617905560405183815233906001600160a01b038616907f7a9043ba5086cf56c416db64f7608d06eae96d08a7e35a101ad4f42aab23585d906020015b60405180910390a350505050565b600061141383836133d2565b90505b92915050565b60006114288233613333565b9050806001600160801b031660000361146d576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114aa6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016336001600160801b038416613131565b6040516001600160801b038216815233906001600160a01b038416907ff31a7084636b55317cfeed458343e6f580e12d52ba89be9f1faae91731fcce429060200160405180910390a35050565b8260026040517f30ccebb50000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f000000000000000000000000000000000000000000000000000000000000000016906330ccebb590602401602060405180830381865afa158015611579573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159d9190613c6f565b60058111156115ae576115ae613c40565b108061165857506040517f56b65e970000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000016906356b65e9790602401602060405180830381865afa158015611634573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116589190613c90565b1561168f576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008290036116ca576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006116d68533613333565b90506001600160801b0381161561176e576117246001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016336001600160801b038416613131565b6040516001600160801b038216815233906001600160a01b038716907ff31a7084636b55317cfeed458343e6f580e12d52ba89be9f1faae91731fcce429060200160405180910390a35b6001600160a01b0385166000908152602081815260408083203384526006019091528120905b848110156118c3577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166342842e0e33308989868181106117df576117df613b95565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b15801561184e57600080fd5b505af1158015611862573d6000803e3d6000fd5b505050504282600101600088888581811061187f5761187f613b95565b90506020020135815260200190815260200160002060006101000a8154816001600160801b0302191690836001600160801b03160217905550806001019050611794565b506001600160a01b0386166000908152602081815260408083206004810180546fffffffffffffffffffffffffffffffff1981166001600160801b039182168b0182161790915533855260069091019092529091208054808316600160801b918290048416880190931602919091179055336001600160a01b0316866001600160a01b03167fafdb227ea10128ee703397dbff24db1f7c90303e6fff8068a2712a1b10c935f18787604051611979929190613cb2565b60405180910390a3505050505050565b6001600160a01b03821660009081526020818152604080832033845260060182528083208484526001810190925282205490916001600160801b0390911690036119ff576040517fe77a0da400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42611a0b8433856120a1565b6001600160801b03161115611a4c576040517f285d5a9200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611a588433613333565b9050611b0c8433856001600160a01b03928316600090815260208181526040808320949095168252600684018152848220600490940180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001600160801b03808316820181166fffffffffffffffffffffffffffffffff19938416179093558654600160801b808204851690920184169091029216919091178555928252600190930190925291902080549091169055565b6040517f42842e0e000000000000000000000000000000000000000000000000000000008152306004820152336024820152604481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906342842e0e90606401600060405180830381600087803b158015611b9357600080fd5b505af1158015611ba7573d6000803e3d6000fd5b505050506001600160801b03811615611bf757611bf76001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016336001600160801b038416613131565b604080518481526001600160801b038316602082015233916001600160a01b038716917fd1343dccf52a899cdc8aaa99714d930d2871b21c218512c779ca3f7c7fddab4191016113f9565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611ca6576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b038116600090815260208190526040902060020180546fffffffffffffffffffffffffffffffff197f0000000000000000000000000000000000000000000000000000000000000000600160801b8084046001600160801b0390811683018116909102928316938116928116929092178101909116919091179091555b919050565b806001600160801b0316600003611d73576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040517f30ccebb50000000000000000000000000000000000000000000000000000000081523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906330ccebb590602401602060405180830381865afa158015611df2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e169190613c6f565b6005811115611e2757611e27613c40565b03611e5e576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e6a338260016131fd565b6040516001600160801b038216815233907fadb1a06aea2cd2ff20eac971640a5eb7d687df3e3a897be2f334836494958a479060200160405180910390a26040517fe428c2f40000000000000000000000000000000000000000000000000000000081523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e428c2f490602401600060405180830381600087803b158015611f2257600080fd5b505af1158015611f36573d6000803e3d6000fd5b5050505050565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611fa1576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b038116600090815260208190526040902060020180547f00000000000000000000000000000000000000000000000000000000000000006001600160801b03600160801b808404821683900382160280821693821693909317829003166fffffffffffffffffffffffffffffffff199290921691909117909155919050565b6001600160a01b038083166000908152602081815260408083209385168352600684019091528120600483015481549293926001600160801b03600160801b909204821691859161207a911683613cf5565b83546120969190600160801b90046001600160801b0316613d1d565b979650505050505050565b6001600160a01b0380841660009081526020818152604080832093861683526006909301815282822084835260010190529081205461210a907f0000000000000000000000000000000000000000000000000000000000000000906001600160801b0316613d4c565b949350505050565b6001600160a01b03811660009081526020819052604081206002810154600390910154611416916001600160801b039081169116613d4c565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146121ad576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600090815260208190526040812060020180549091906121e9906001600160801b03600160801b820481169116613cf5565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160801b0316816001600160801b03161015612257576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81546001600160801b03600160801b80830482167f00000000000000000000000000000000000000000000000000000000000000009081018316909102919092161783556001600160a01b038416907f7ad6f32675ff7ed77c34b45d23cd987ea6a62560f390baac683de0bc6b24fb7e906122d28185613cf5565b604080516001600160801b03938416815292909116602083015201610b80565b60006114138383613452565b6001600160a01b038116600090815260208190526040812060010154611416907f0000000000000000000000000000000000000000000000000000000000000000906001600160801b0316613d4c565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146123b0576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600081815260208190526040902060020180547f00000000000000000000000000000000000000000000000000000000000000006001600160801b03600160801b8084048216839003821681029382168481178087559596957fc8d4f2228d78be7d0ca97344025aae4f9bc2c87ece32295d72791a4d39f2a71a9561244794939091048316921617613cf5565b604080516001600160801b0393841681529290911660208301520160405180910390a25050565b60008260026040517f30ccebb50000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f000000000000000000000000000000000000000000000000000000000000000016906330ccebb590602401602060405180830381865afa1580156124f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125169190613c6f565b600581111561252757612527613c40565b10806125d157506040517f56b65e970000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000016906356b65e9790602401602060405180830381865afa1580156125ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125d19190613c90565b15612608576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826001600160801b031660000361264b576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126896001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633306001600160801b0387166134c1565b60006126958585613452565b6001600160a01b038616600090815260208181526040808320600381018054600160801b6fffffffffffffffffffffffffffffffff1982166001600160801b039283168d0183169081178290048316890183168202179092553386526005909201909352922080548316840183164290931690910291909117905590506040517f5bab847f0000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152600060248301527f00000000000000000000000000000000000000000000000000000000000000001690635bab847f90604401600060405180830381600087803b15801561279557600080fd5b505af11580156127a9573d6000803e3d6000fd5b5050604080516001600160801b038089168252851660208201523393506001600160a01b03891692507f334cabe84b7338f2bdd62070c02f24ffbcc7735e46f425fa401db349717e1328910160405180910390a3949350505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612867576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128dc7f000000000000000000000000000000000000000000000000000000000000000030836128978688613d4c565b6128a19190613d4c565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169291906001600160801b03166134c1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b03160361298d576129887f0000000000000000000000000000000000000000000000000000000000000000826129448587613d4c565b61294e9190613d4c565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906001600160801b0316613131565b612aec565b6001600160a01b03841660009081526020819052604090206003810180546001600160801b03808216870181166fffffffffffffffffffffffffffffffff19928316179092556002830180548084168601841692169190911781556004909201541615612a425760028101546001600160801b0390811690841681612a1457612a14613d77565b6002830180546001600160801b0380821694909304600160801b918290048416019092169091029190911790555b80547f00000000000000000000000000000000000000000000000000000000000000006001600160801b03600160801b8084048216839003821681029382168481178087556001600160a01b038b16957fc8d4f2228d78be7d0ca97344025aae4f9bc2c87ece32295d72791a4d39f2a71a9594612ac794909204821692911617613cf5565b604080516001600160801b0393841681529290911660208301520160405180910390a2505b50505050565b6001600160a01b038116600090815260208190526040812060020154611416906001600160801b03600160801b820481169116613cf5565b6001600160a01b0382811660009081526020818152604080832093851683526005909301905290812054611413907f000000000000000000000000000000000000000000000000000000000000000090600160801b90046001600160801b0316613d4c565b806001600160801b0316600003612bd2576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612bde8383613452565b9050806001600160801b0316600003612c23576040517fab32f25400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383166000908152602081815260408083203384526005019091529020546001600160801b039081169082161115612c8e576040517fab32f25400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42612c998433612b2a565b6001600160801b03161115612cda576040517f285d5a9200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383166000908152602081815260408083206003810180546001600160801b03600160801b80830482168990038216028082169282169290921789900381166fffffffffffffffffffffffffffffffff1992831617909255338652600590920190935292208054808316859003909216919092161790556040517f5bab847f0000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152600160248301527f00000000000000000000000000000000000000000000000000000000000000001690635bab847f90604401600060405180830381600087803b158015612ddb57600080fd5b505af1158015612def573d6000803e3d6000fd5b50612e329250506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169050336001600160801b038516613131565b604080516001600160801b0380851682528316602082015233916001600160a01b038616917f6acf5e34cb1562e3a0785bb4565e0761928cda3dd258168c73bca09621c669e9910160405180910390a3505050565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614612eeb576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038084166000818152602081905260409020600201917f0000000000000000000000000000000000000000000000000000000000000000169003612f9657612f8d6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f00000000000000000000000000000000000000000000000000000000000000006001600160801b038616613131565b82915050611416565b6000612fae6001600160801b03851660146064613512565b905061300d6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000167f00000000000000000000000000000000000000000000000000000000000000006001600160801b038416613131565b81546fffffffffffffffffffffffffffffffff198116919094036001600160801b03948516810190941617905550919050565b6001600160a01b03808316600090815260208181526040808320938516835260059093019052908120546114139084906001600160801b03166133d2565b6001600160a01b038216600090815260208190526040902060020180546130b7906001600160801b03600160801b820481169116613cf5565b6001600160801b0316826001600160801b03161115613102576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80546fffffffffffffffffffffffffffffffff1981166001600160801b03918216939093031691909117905550565b6040516001600160a01b0383166024820152604481018290526131f89084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526135b4565b505050565b6001600160a01b0380841660009081526020819052604090209061324e907f00000000000000000000000000000000000000000000000000000000000000001685306001600160801b0387166134c1565b6002810180546fffffffffffffffffffffffffffffffff198082166001600160801b039283168701831617909255600183018054909216429091161790558115612aec576040517f5bab847f0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152600060248301527f00000000000000000000000000000000000000000000000000000000000000001690635bab847f90604401600060405180830381600087803b15801561331557600080fd5b505af1158015613329573d6000803e3d6000fd5b5050505050505050565b6001600160a01b038083166000908152602081815260408083209385168352600684019091528120600483015481549293926001600160801b03600160801b9092048216918591613385911683613cf5565b83546133a19190600160801b90046001600160801b0316613d1d565b83546fffffffffffffffffffffffffffffffff19166001600160801b03939093169290921790925595945050505050565b6001600160a01b038216600090815260208190526040812060030154611413906001600160801b0316613406906001613d4c565b6001600160a01b038516600090815260208190526040902060030154620f424090600160801b90046001600160801b03166134419190613d4c565b6001600160801b0385169190613512565b6001600160a01b03821660009081526020819052604081206003015461141390620f424090600160801b90046001600160801b03166134919190613d4c565b6001600160a01b0385166000908152602081905260409020600301546001600160801b0316613441906001613d4c565b6040516001600160a01b0380851660248301528316604482015260648101829052612aec9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613176565b6000838302608081901c6001600160801b03841611613592576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f55696e743132384d6174683a206d756c446976206f766572666c6f770000000060448201526064015b60405180910390fd5b826001600160801b031681816135aa576135aa613d77565b0495945050505050565b6000613609826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166136b69092919063ffffffff16565b905080516000148061362a57508080602001905181019061362a9190613c90565b6131f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401613589565b606061210a848460008585600080866001600160a01b031685876040516136dd9190613da6565b60006040518083038185875af1925050503d806000811461371a576040519150601f19603f3d011682016040523d82523d6000602084013e61371f565b606091505b509150915061209687838387606083156137b45782516000036137ad576001600160a01b0385163b6137ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401613589565b508161210a565b61210a83838151156137c95781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135899190613a5e565b80356001600160a01b0381168114611d2b57600080fd5b6001600160801b038116811461382957600080fd5b50565b6000806040838503121561383f57600080fd5b613848836137fd565b9150602083013561385881613814565b809150509250929050565b60008060008060006080868803121561387b57600080fd5b613884866137fd565b9450613892602087016137fd565b935060408601359250606086013567ffffffffffffffff808211156138b657600080fd5b818801915088601f8301126138ca57600080fd5b8135818111156138d957600080fd5b8960208285010111156138eb57600080fd5b9699959850939650602001949392505050565b60008060006060848603121561391357600080fd5b61391c846137fd565b9250602084013561392c81613814565b915061393a604085016137fd565b90509250925092565b60008060006040848603121561395857600080fd5b613961846137fd565b9250602084013567ffffffffffffffff8082111561397e57600080fd5b818601915086601f83011261399257600080fd5b8135818111156139a157600080fd5b8760208260051b85010111156139b657600080fd5b6020830194508093505050509250925092565b600080604083850312156139dc57600080fd5b6139e5836137fd565b946020939093013593505050565b600060208284031215613a0557600080fd5b611413826137fd565b600060208284031215613a2057600080fd5b8135613a2b81613814565b9392505050565b60005b83811015613a4d578181015183820152602001613a35565b83811115612aec5750506000910152565b6020815260008251806020840152613a7d816040850160208701613a32565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008060408385031215613ac257600080fd5b613acb836137fd565b9150613ad9602084016137fd565b90509250929050565b600080600060608486031215613af757600080fd5b613b00846137fd565b9250613b0e602085016137fd565b9150604084013590509250925092565b60008060008060808587031215613b3457600080fd5b613b3d856137fd565b93506020850135613b4d81613814565b92506040850135613b5d81613814565b91506060850135613b6d81613814565b939692955090935050565b600060208284031215613b8a57600080fd5b8151613a2b81613814565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115613bf657600080fd5b8260051b8083602087013760009401602001938452509192915050565b604081526000613c27604083018587613bc4565b90506001600160801b0383166020830152949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215613c8157600080fd5b815160068110613a2b57600080fd5b600060208284031215613ca257600080fd5b81518015158114613a2b57600080fd5b60208152600061210a602083018486613bc4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006001600160801b0383811690831681811015613d1557613d15613cc6565b039392505050565b60006001600160801b0380831681851681830481118215151615613d4357613d43613cc6565b02949350505050565b60006001600160801b03808316818516808303821115613d6e57613d6e613cc6565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008251613db8818460208701613a32565b919091019291505056fea164736f6c634300080f000a" + + +func init() { + if err := json.Unmarshal([]byte(AssetManagerStorageLayoutJSON), AssetManagerStorageLayout); err != nil { + panic(err) + } + + layouts["AssetManager"] = AssetManagerStorageLayout + deployedBytecodes["AssetManager"] = AssetManagerDeployedBin + immutableReferences["AssetManager"] = true +} diff --git a/kroma-bindings/bindings/colosseum.go b/kroma-bindings/bindings/colosseum.go index 39ed21acbc..b4b3f6f0af 100644 --- a/kroma-bindings/bindings/colosseum.go +++ b/kroma-bindings/bindings/colosseum.go @@ -31,8 +31,8 @@ var ( // ColosseumMetaData contains all meta data concerning the Colosseum contract. var ColosseumMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_l2Oracle\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"},{\"name\":\"_zkVerifier\",\"type\":\"address\",\"internalType\":\"contractZKVerifier\"},{\"name\":\"_submissionInterval\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_creationPeriodSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_bisectionTimeout\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_provingTimeout\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_dummyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_maxTxs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_segmentsLengths\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"_securityCouncil\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_zkMerkleTrie\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"BISECTION_TIMEOUT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"CREATION_PERIOD_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DUMMY_HASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"L2_ORACLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"L2_ORACLE_SUBMISSION_INTERVAL\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_TXS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PROVING_TIMEOUT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"SECURITY_COUNCIL\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ZK_MERKLE_TRIE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ZK_VERIFIER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractZKVerifier\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bisect\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pos\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_segments\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cancelChallenge\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"challengerTimeout\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"challenges\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"turn\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"timeoutAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"asserter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"challenger\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"segSize\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"segStart\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createChallenge\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_l1BlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_l1BlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_segments\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"dismissChallenge\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_asserter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_outputRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_publicInputHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceDeleteOutput\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getChallenge\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTypes.Challenge\",\"components\":[{\"name\":\"turn\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"timeoutAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"asserter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"challenger\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"segments\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"segSize\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"segStart\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSegmentsLength\",\"inputs\":[{\"name\":\"_turn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStatus\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumColosseum.ChallengeStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_segmentsLengths\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isAbleToBisect\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isInCreationPeriod\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proveFault\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_pos\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_proof\",\"type\":\"tuple\",\"internalType\":\"structTypes.PublicInputProof\",\"components\":[{\"name\":\"srcOutputRootProof\",\"type\":\"tuple\",\"internalType\":\"structTypes.OutputRootProof\",\"components\":[{\"name\":\"version\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messagePasserStorageRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"nextBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"dstOutputRootProof\",\"type\":\"tuple\",\"internalType\":\"structTypes.OutputRootProof\",\"components\":[{\"name\":\"version\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messagePasserStorageRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"nextBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"publicInput\",\"type\":\"tuple\",\"internalType\":\"structTypes.PublicInput\",\"components\":[{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"number\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"baseFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"transactionsRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"withdrawalsRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"txHashes\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"blobGasUsed\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"excessBlobGas\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"parentBeaconRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"rlps\",\"type\":\"tuple\",\"internalType\":\"structTypes.BlockHeaderRLP\",\"components\":[{\"name\":\"uncleHash\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"coinbase\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiptsRoot\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"logsBloom\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"difficulty\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"gasUsed\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"mixHash\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"l2ToL1MessagePasserBalance\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"l2ToL1MessagePasserCodeHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"merkleProof\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}]},{\"name\":\"_zkproof\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"_pair\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"verifiedPublicInputs\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Bisected\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"turn\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChallengeCanceled\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChallengeCreated\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"asserter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChallengeDismissed\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChallengerTimedOut\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Proven\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReadyToProve\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false}]", - Bin: "0x6101c06040523480156200001257600080fd5b506040516200603e3803806200603e833981016040819052620000359162000427565b6001600160a01b03808c166080528a811660a05260c089905260e08890526101008790526101208a90526101408690526101608590528281166101805281166101a052620000838362000094565b505050505050505050505062000580565b600054610100900460ff1615808015620000b55750600054600160ff909116105b80620000e55750620000d230620001c860201b62002a001760201c565b158015620000e5575060005460ff166001145b6200014e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000172576000805461ff0019166101001790555b6200017d82620001d7565b8015620001c4576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6001600160a01b03163b151590565b60028151620001e79190620004f5565b156200025c5760405162461bcd60e51b815260206004820152603a60248201527f436f6c6f737365756d3a206c656e677468206f66207365676d656e7473206c6560448201527f6e677468732063616e6e6f74206265206f6464206e756d626572000000000000606482015260840162000145565b600160005b8251811015620002e15782818151811062000280576200028062000518565b602002602001015160016000838152602001908152602001600020819055506001838281518110620002b657620002b662000518565b6020026020010151620002ca919062000544565b620002d690836200055e565b915060010162000261565b50610120518114620001c45760405162461bcd60e51b815260206004820152602360248201527f436f6c6f737365756d3a20696e76616c6964207365676d656e7473206c656e6760448201526274687360e81b606482015260840162000145565b6001600160a01b03811681146200035857600080fd5b50565b8051620003688162000342565b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200039557600080fd5b815160206001600160401b0380831115620003b457620003b46200036d565b8260051b604051601f19603f83011681018181108482111715620003dc57620003dc6200036d565b604052938452858101830193838101925087851115620003fb57600080fd5b83870191505b848210156200041c5781518352918301919083019062000401565b979650505050505050565b60008060008060008060008060008060006101608c8e0312156200044a57600080fd5b8b51620004578162000342565b60208d0151909b506200046a8162000342565b809a505060408c0151985060608c0151975060808c0151965060a08c0151955060c08c0151945060e08c015193506101008c015160018060401b03811115620004b257600080fd5b620004c08e828f0162000383565b935050620004d26101208d016200035b565b9150620004e36101408d016200035b565b90509295989b509295989b9093969950565b6000826200051357634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000828210156200055957620005596200052e565b500390565b60008160001904831182151516156200057b576200057b6200052e565b500290565b60805160a05160c05160e05161010051610120516101405161016051610180516101a05161593862000706600039600081816103d501526138330152600081816102f60152818161076f0152818161129e01528181611bb90152611ee60152600081816103650152818161395101526139bf01526000818161051d015261398b0152600081816104cf015281816128dd015281816129160152612fe20152600081816104f601528181612a700152613c2001526000818161031d0152613c870152600081816104480152818161071b01526123f201526000818161046f0152610ff30152600081816101b7015281816106ab015281816108a701528181610a0b01528181610c5d0152818161112e01528181611432015281816114900152818161173e01528181611c7d01528181611dbb01528181611f0e015281816120d90152818161237a01528181612659015281816127a001528181612bf101528181612c9b01528181612d1201528181612dec015281816130b101526132f901526159386000f3fe608060405234801561001057600080fd5b50600436106101ad5760003560e01c8063887c560f116100ee578063cfb4474d11610097578063e39a219c11610071578063e39a219c1461053f578063e58932b314610552578063e9371a2c14610572578063fc9d84df1461059257600080fd5b8063cfb4474d146104ca578063d2ee3075146104f1578063d5145ebc1461051857600080fd5b8063a41483e3116100c8578063a41483e314610491578063a6ade11f146104a4578063b8b1a27c146104b757600080fd5b8063887c560f146104305780638f3a6c88146104435780639ded39521461046a57600080fd5b8063461569b81161015b5780635865b607116101355780635865b607146103d057806362fc00db146103f75780636fe0e5591461040a57806380ab13131461041d57600080fd5b8063461569b81461034d5780635375b8911461036057806354fd4d501461038757600080fd5b80632df27fa51161018c5780632df27fa51461023e57806336086417146102f15780634394c5841461031857600080fd5b80621c2ff6146101b25780631be4e27e146101f65780631db1b67214610229575b600080fd5b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b610219610204366004614878565b60036020526000908152604090205460ff1681565b60405190151581526020016101ed565b61023c6102373660046148a6565b6105a5565b005b6102aa61024c3660046148a6565b6002602090815260009283526040808420909152908252902080546001820154600383015460049093015460ff83169367ffffffffffffffff610100850416936001600160a01b036901000000000000000000909104811693169186565b6040805160ff909716875267ffffffffffffffff90951660208701526001600160a01b039384169486019490945291166060840152608083015260a082015260c0016101ed565b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016101ed565b61021961035b366004614878565b61066f565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b6103c36040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516101ed919061492e565b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b61023c610405366004614941565b610764565b61023c610418366004614a65565b610ab2565b61023c61042b366004614b47565b610c2c565b61021961043e3660046148a6565b61159b565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b61023c61049f366004614878565b6115d0565b61023c6104b2366004614bf8565b61170d565b61033f6104c5366004614c62565b611b31565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b61023c61054d366004614878565b611bae565b6105656105603660046148a6565b611f70565b6040516101ed9190614c85565b6105856105803660046148a6565b61207d565b6040516101ed9190614d64565b61023c6105a0366004614da5565b6120a8565b60008281526002602090815260408083206001600160a01b03851684529091528120906105d182612a0f565b905060038160058111156105e7576105e7614d35565b1461065f5760405162461bcd60e51b815260206004820152603c60248201527f436f6c6f737365756d3a2063616e206f6e6c792062652063616c6c656420696660448201527f20746865206368616c6c656e67657220697320696e2074696d6f75740000000060648201526084015b60405180910390fd5b6106698484612aec565b50505050565b6040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810182905260009081906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a25ae55790602401608060405180830381865afa1580156106f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107169190614e09565b9050427f000000000000000000000000000000000000000000000000000000000000000082604001516fffffffffffffffffffffffffffffffff1661075b9190614eb0565b10159392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108025760405162461bcd60e51b815260206004820152602d60248201527f436f6c6f737365756d3a2073656e646572206973206e6f74207468652073656360448201527f757269747920636f756e63696c000000000000000000000000000000000000006064820152608401610656565b816108755760405162461bcd60e51b815260206004820152602e60248201527f436f6c6f737365756d3a2063616e6e6f7420726f6c6c6261636b206f7574707560448201527f7420746f207a65726f20686173680000000000000000000000000000000000006064820152608401610656565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018690526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa1580156108f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091a9190614e09565b60200151146109915760405162461bcd60e51b815260206004820152603b60248201527f436f6c6f737365756d3a206f6e6c792063616e20726f6c6c6261636b2069662060448201527f746865206f757470757420686173206265656e2064656c6574656400000000006064820152608401610656565b6000818152600360205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517fe664672300000000000000000000000000000000000000000000000000000000815260048101869052602481018390526001600160a01b0384811660448301527f0000000000000000000000000000000000000000000000000000000000000000169063e664672390606401600060405180830381600087803b158015610a4f57600080fd5b505af1158015610a63573d6000803e3d6000fd5b50505050836001600160a01b0316857fdca9fa9b51a5ba03938c6a0cd5489011630370fc481ef2b0cb771ad904a7305342604051610aa391815260200190565b60405180910390a35050505050565b600054610100900460ff1615808015610ad25750600054600160ff909116105b80610aec5750303b158015610aec575060005460ff166001145b610b5e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610656565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610bbc57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610bc582612ee5565b8015610c2857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6040517f33727c4d0000000000000000000000000000000000000000000000000000000081526004810188905287907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190614ec8565b15610d695760405162461bcd60e51b815260206004820152604b60248201527f436f6c6f737365756d3a2063616e6e6f742070726f6772657373206368616c6c60448201527f656e67652070726f636573732061626f757420616c72656164792066696e616c60648201527f697a6564206f7574707574000000000000000000000000000000000000000000608482015260a401610656565b6000888152600260209081526040808320338452909152812090610d8c82612a0f565b6001830154909150610da9908b906001600160a01b031683613075565b15610db5575050611591565b6005816005811115610dc957610dc9614d35565b1480610de657506004816005811115610de457610de4614d35565b145b610e585760405162461bcd60e51b815260206004820152603a60248201527f436f6c6f737365756d3a20696d706f737369626c6520746f2070726f7665207460448201527f6865206661756c7420696e2063757272656e74207374617475730000000000006064820152608401610656565b6000610e71610e6c368b90038b018b614eea565b613406565b90506000610e8a610e6c368c90038c0160a08d01614eea565b9050610e9d8b8584848e60a081016134db565b610ec68a60a08101610eb3610140830183614f5a565b610ec16101608f018f614f98565b613697565b610ef8610ed76101c08c018c614fcc565b8c61018001358d6101a001358e60a001604001358f60a001602001356137db565b6000610f1560208c0135610f106101408e018e614f5a565b61394b565b60008181526003602052604090205490915060ff1615610fc35760405162461bcd60e51b815260206004820152604c60248201527f436f6c6f737365756d3a207075626c696320696e70757420746861742068617360448201527f20616c7265616479206265656e2076616c6964617465642063616e6e6f74206260648201527f65207573656420616761696e0000000000000000000000000000000000000000608482015260a401610656565b6040517f4292dc3e0000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634292dc3e90611030908d908d908d908d908890600401615083565b602060405180830381865afa15801561104d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110719190614ec8565b6110bd5760405162461bcd60e51b815260206004820152601860248201527f436f6c6f737365756d3a20696e76616c69642070726f6f6600000000000000006044820152606401610656565b60405142815233908e907f0431864ed2609170587bbc7c198abd8caee4c55943dfb16fd42ec6f59c91c5f79060200160405180910390a36040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018e90526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a25ae55790602401608060405180830381865afa158015611175573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111999190614e09565b905060006362fc00db60e01b8f338960000160099054906101000a90046001600160a01b03168560200151876040516024016112039594939291909485526001600160a01b0393841660208601529190921660408401526060830191909152608082015260a00190565b60408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009095169490941790935291840151606085015192517f080b91ee0000000000000000000000000000000000000000000000000000000081529193506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263080b91ee926112d592919086906004016150bd565b600060405180830381600087803b1580156112ef57600080fd5b505af1158015611303573d6000803e3d6000fd5b50505050505060016003600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600260008e81526020019081526020016000206000336001600160a01b03166001600160a01b03168152602001908152602001600020600080820160006101000a81549060ff02191690556000820160016101000a81549067ffffffffffffffff02191690556000820160096101000a8154906001600160a01b0302191690556001820160006101000a8154906001600160a01b0302191690556002820160006113df91906147fa565b5060006003820181905560049182018190556040517fe66467230000000000000000000000000000000000000000000000000000000081529182018f905260248201523360448201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e664672390606401600060405180830381600087803b15801561147657600080fd5b505af115801561148a573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151091906150f7565b6040517fdd215c5d000000000000000000000000000000000000000000000000000000008152600481018f90523360248201526001600160a01b03919091169063dd215c5d90604401600060405180830381600087803b15801561157357600080fd5b505af1158015611587573d6000803e3d6000fd5b5050505050505050505b5050505050505050565b60008281526002602090815260408083206001600160a01b038516845290915281206115c6816139fe565b9150505b92915050565b60008181526002602090815260408083203384529091528120906115f382612a0f565b9050600081600581111561160957611609614d35565b0361167c5760405162461bcd60e51b815260206004820152602760248201527f436f6c6f737365756d3a20746865206368616c6c656e676520646f6573206e6f60448201527f74206578697374000000000000000000000000000000000000000000000000006064820152608401610656565b60018201546116969084906001600160a01b031683613075565b6117085760405162461bcd60e51b815260206004820152602860248201527f436f6c6f737365756d3a206368616c6c656e67652063616e6e6f74206265206360448201527f616e63656c6c65640000000000000000000000000000000000000000000000006064820152608401610656565b505050565b6040517f33727c4d0000000000000000000000000000000000000000000000000000000081526004810186905285907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa15801561178d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b19190614ec8565b1561184a5760405162461bcd60e51b815260206004820152604b60248201527f436f6c6f737365756d3a2063616e6e6f742070726f6772657373206368616c6c60448201527f656e67652070726f636573732061626f757420616c72656164792066696e616c60648201527f697a6564206f7574707574000000000000000000000000000000000000000000608482015260a401610656565b60008681526002602090815260408083206001600160a01b038916845290915281209061187682612a0f565b60018301549091506118939089906001600160a01b031683613075565b1561189f575050611b29565b600060018260058111156118b5576118b5614d35565b036118ce575060018201546001600160a01b0316611901565b60028260058111156118e2576118e2614d35565b0361190157508154690100000000000000000090046001600160a01b03165b336001600160a01b038216146119595760405162461bcd60e51b815260206004820152601860248201527f436f6c6f737365756d3a206e6f7420796f7572207475726e00000000000000006044820152606401610656565b825460009061196c9060ff166001615114565b90506119f781856002018a8154811061198757611987615139565b9060005260206000200154866002018b60016119a39190614eb0565b815481106119b3576119b3615139565b90600052602060002001548a8a80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613a1292505050565b6000611a0285613bb8565b90506000611a10828b615168565b8660040154611a1f9190614eb0565b9050611a62868a8a80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250879150613be49050565b85547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8416178655611a9686613c0e565b6040805160ff851681524260208201526001600160a01b038d16918e917fcadef6622777415b0589e491bdbf6baf11242f676f77055fd03bf1658c17a145910160405180910390a3611ae7866139fe565b611b22576040516001600160a01b038c16908d907f5c4528cbb38a169d24837617d3fd3d5c70a47769a4e9af6f384720b359b716c890600090a35b5050505050505b505050505050565b6000600160ff83161015611b875760405162461bcd60e51b815260206004820152601760248201527f436f6c6f737365756d3a20696e76616c6964207475726e0000000000000000006044820152606401610656565b60016000611b9582856151a5565b60ff168152602001908152602001600020549050919050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611c4c5760405162461bcd60e51b815260206004820152602d60248201527f436f6c6f737365756d3a2073656e646572206973206e6f74207468652073656360448201527f757269747920636f756e63696c000000000000000000000000000000000000006064820152608401610656565b6040517f33727c4d0000000000000000000000000000000000000000000000000000000081526004810182905281907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa158015611ccc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf09190614ec8565b15611d895760405162461bcd60e51b815260206004820152604b60248201527f436f6c6f737365756d3a2063616e6e6f742070726f6772657373206368616c6c60448201527f656e67652070726f636573732061626f757420616c72656164792066696e616c60648201527f697a6564206f7574707574000000000000000000000000000000000000000000608482015260a401610656565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa158015611e0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2e9190614e09565b6020810151909150611ea85760405162461bcd60e51b815260206004820152602e60248201527f436f6c6f737365756d3a20746865206f75747075742068617320616c7265616460448201527f79206265656e2064656c657465640000000000000000000000000000000000006064820152608401610656565b6040517fe664672300000000000000000000000000000000000000000000000000000000815260048101849052600060248201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660448301527f0000000000000000000000000000000000000000000000000000000000000000169063e6646723906064015b600060405180830381600087803b158015611f5357600080fd5b505af1158015611f67573d6000803e3d6000fd5b50505050505050565b6040805160e0810182526000808252602082018190529181018290526060808201839052608082015260a0810182905260c081019190915260008381526002602081815260408084206001600160a01b03808816865290835293819020815160e081018352815460ff8116825267ffffffffffffffff6101008204168286015269010000000000000000009004861681840152600182015490951660608601529283018054825181850281018501909352808352608086019383018282801561205857602002820191906000526020600020905b815481526020019060010190808311612044575b5050505050815260200160038201548152602001600482015481525050905092915050565b60008281526002602090815260408083206001600160a01b038516845290915281206115c681612a0f565b6040517f33727c4d0000000000000000000000000000000000000000000000000000000081526004810186905285907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa158015612128573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214c9190614ec8565b156121e55760405162461bcd60e51b815260206004820152604b60248201527f436f6c6f737365756d3a2063616e6e6f742070726f6772657373206368616c6c60448201527f656e67652070726f636573732061626f757420616c72656164792066696e616c60648201527f697a6564206f7574707574000000000000000000000000000000000000000000608482015260a401610656565b6000861161225b5760405162461bcd60e51b815260206004820152603660248201527f436f6c6f737365756d3a206368616c6c656e676520666f722067656e6573697360448201527f206f7574707574206973206e6f7420616c6c6f776564000000000000000000006064820152608401610656565b600086815260026020908152604080832033845290915290208054600160ff9091161061234857600061228d82612a0f565b905060038160058111156122a3576122a3614d35565b1461233c5760405162461bcd60e51b815260206004820152604660248201527f436f6c6f737365756d3a20746865206368616c6c656e676520666f722067697660448201527f656e206f757470757420696e64657820697320616c726561647920696e20707260648201527f6f67726573730000000000000000000000000000000000000000000000000000608482015260a401610656565b6123468833612aec565b505b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018890526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa1580156123c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ed9190614e09565b9050427f000000000000000000000000000000000000000000000000000000000000000082604001516fffffffffffffffffffffffffffffffff166124329190614eb0565b10156124a65760405162461bcd60e51b815260206004820152603e60248201527f436f6c6f737365756d3a2063616e6e6f74206372656174652061206368616c6c60448201527f656e676520616674657220746865206372656174696f6e20706572696f6400006064820152608401610656565b602081015161251d5760405162461bcd60e51b815260206004820152603660248201527f436f6c6f737365756d3a206368616c6c656e676520666f722064656c6574656460448201527f206f7574707574206973206e6f7420616c6c6f776564000000000000000000006064820152608401610656565b80516001600160a01b0316330361259c5760405162461bcd60e51b815260206004820152603860248201527f436f6c6f737365756d3a2074686520617373657274657220616e64206368616c60448201527f6c656e676572206d75737420626520646966666572656e7400000000000000006064820152608401610656565b86158015906125ab5750854015155b1561264d578686401461264d5760405162461bcd60e51b8152602060048201526044602482018190527f436f6c6f737365756d3a20626c6f636b206861736820646f6573206e6f74206d908201527f617463682074686520686173682061742074686520657870656374656420686560648201527f6967687400000000000000000000000000000000000000000000000000000000608482015260a401610656565b60006001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a25ae55761268960018c6151c8565b6040518263ffffffff1660e01b81526004016126a791815260200190565b608060405180830381865afa1580156126c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e89190614e09565b60208101519091506127565761275160018787600081811061270c5761270c615139565b905060200201358460200151898980806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613a1292505050565b61279e565b61279e600182602001518460200151898980806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613a1292505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061282091906150f7565b6040517f5a544742000000000000000000000000000000000000000000000000000000008152600481018b90523360248201526001600160a01b039190911690635a54474290604401600060405180830381600087803b15801561288357600080fd5b505af1158015612897573d6000803e3d6000fd5b5050505061293a838787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505050606086015161291491507f0000000000000000000000000000000000000000000000000000000000000000906fffffffffffffffffffffffffffffffff166151c8565b7f0000000000000000000000000000000000000000000000000000000000000000613be4565b825482516001600160a01b03166901000000000000000000027fffffff0000000000000000000000000000000000000000ffffffffffffffff009091161760019081178455830180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790556129b283613c0e565b815160405142815233916001600160a01b0316908b907fd2f7931a802085b3d0234d4c320ce7ee0041da96678ce2bf5c93e8d3d7e65f529060200160405180910390a4505050505050505050565b6001600160a01b03163b151590565b8054600090600160ff9091161015612a2957506000919050565b8154600090612a3a9060ff16613caf565b8354909150610100900467ffffffffffffffff16421115612ac0578015612a645750600392915050565b8254612aa990612aa4907f000000000000000000000000000000000000000000000000000000000000000090610100900467ffffffffffffffff16614eb0565b421190565b15612ab75750600392915050565b50600492915050565b612ac9836139fe565b612ad65750600592915050565b80612ae2576002612ae5565b60015b9392505050565b60008281526002602081815260408084206001600160a01b0386168552909152822080547fffffff00000000000000000000000000000000000000000000000000000000001681556001810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690559190612b6c908301826147fa565b600382016000905560048201600090555050806001600160a01b0316827fbf4506ef5d06ecb6168f37bc9e69dd473089eb9e3f2675322d01b4d466cff05142604051612bba91815260200190565b60405180910390a36040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa158015612c40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c649190614ec8565b15612dea576040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa158015612cea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d0e9190614e09565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d9291906150f7565b81516040517f36b83469000000000000000000000000000000000000000000000000000000008152600481018690526001600160a01b03858116602483015291821660448201529116906336b8346990606401611f39565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e6c91906150f7565b6040517fdd215c5d000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b038381166024830152919091169063dd215c5d90604401600060405180830381600087803b158015612ed157600080fd5b505af1158015611b29573d6000803e3d6000fd5b60028151612ef3919061520e565b15612f665760405162461bcd60e51b815260206004820152603a60248201527f436f6c6f737365756d3a206c656e677468206f66207365676d656e7473206c6560448201527f6e677468732063616e6e6f74206265206f6464206e756d6265720000000000006064820152608401610656565b600160005b8251811015612fdf57828181518110612f8657612f86615139565b602002602001015160016000838152602001908152602001600020819055506001838281518110612fb957612fb9615139565b6020026020010151612fcb91906151c8565b612fd59083615168565b9150600101612f6b565b507f00000000000000000000000000000000000000000000000000000000000000008114610c285760405162461bcd60e51b815260206004820152602360248201527f436f6c6f737365756d3a20696e76616c6964207365676d656e7473206c656e6760448201527f74687300000000000000000000000000000000000000000000000000000000006064820152608401610656565b6040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810184905260009081906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a25ae55790602401608060405180830381865afa1580156130f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061311c9190614e09565b6020015190508015613132576000915050612ae5565b336001600160a01b038516146131b05760405162461bcd60e51b815260206004820152602560248201527f436f6c6f737365756d3a2073656e646572206973206e6f742061206368616c6c60448201527f656e6765720000000000000000000000000000000000000000000000000000006064820152608401610656565b60038360058111156131c4576131c4614d35565b03613239576040805162461bcd60e51b81526020600482015260248101919091527f436f6c6f737365756d3a206368616c6c656e67652063616e6e6f74206265206360448201527f616e63656c6c6564206966206368616c6c656e6765722074696d6564206f75746064820152608401610656565b6000858152600260208181526040808420338552909152822080547fffffff00000000000000000000000000000000000000000000000000000000001681556001810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905591906132b0908301826147fa565b50600060038201819055600490910155604051428152339086907f6f3468a095154788e69ed719ee418416c1e338ac2348ccb3531bb97a0ed6ed9d9060200160405180910390a37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613355573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061337991906150f7565b6040517f36b8346900000000000000000000000000000000000000000000000000000000815260048101879052336024820181905260448201526001600160a01b0391909116906336b8346990606401600060405180830381600087803b1580156133e357600080fd5b505af11580156133f7573d6000803e3d6000fd5b50600198975050505050505050565b80516000906134685781516020808401516040808601516060808801516080808a0151855180890199909952888601969096529187019290925285015260a0808501929092528051808503909201825260c090930190925281519101206115ca565b60405162461bcd60e51b815260206004820152602a60248201527f48617368696e673a20756e6b6e6f776e206f757470757420726f6f742070726f60448201527f6f662076657273696f6e000000000000000000000000000000000000000000006064820152608401610656565b919050565b838560020187815481106134f1576134f1615139565b90600052602060002001541461356f5760405162461bcd60e51b815260206004820152602d60248201527f436f6c6f737365756d3a2074686520736f75726365207365676d656e74206d7560448201527f7374206265206d617463686564000000000000000000000000000000000000006064820152608401610656565b613578856139fe565b61361a57826002860161358c886001614eb0565b8154811061359c5761359c615139565b90600052602060002001540361361a5760405162461bcd60e51b815260206004820152603660248201527f436f6c6f737365756d3a207468652064657374696e6174696f6e207365676d6560448201527f6e74206d757374206e6f74206265206d617463686564000000000000000000006064820152608401610656565b8060600135826080013514611b295760405162461bcd60e51b815260206004820152602960248201527f436f6c6f737365756d3a2074686520626c6f636b2068617368206d757374206260448201527f65206d61746368656400000000000000000000000000000000000000000000006064820152608401610656565b82602001358260e00135146137145760405162461bcd60e51b815260206004820152602960248201527f436f6c6f737365756d3a2074686520737461746520726f6f74206d757374206260448201527f65206d61746368656400000000000000000000000000000000000000000000006064820152608401610656565b600061018083013561373f5761373a61372c846152a0565b613735846153fa565b613cc6565b613759565b61375961374b846152a0565b613754846153fa565b613d6a565b9050808560800135146137d45760405162461bcd60e51b815260206004820152603b60248201527f436f6c6f737365756d3a2074686520626c6f636b20686173682066726f6d207060448201527f75626c696320696e707574206d757374206265206d61746368656400000000006064820152608401610656565b5050505050565b60408051600060208201528082018690526060810185905260808082018590528251808303909101815260a08201928390527f12e64a72000000000000000000000000000000000000000000000000000000009092527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906312e64a7290613898907f42000000000000000000000000000000000000030000000000000000000000009085908c908c90899060a40161559b565b602060405180830381865afa1580156138b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138d99190614ec8565b611f675760405162461bcd60e51b815260206004820152603660248201527f436f6c6f737365756d3a20696e76616c6964204c32546f4c314d65737361676560448201527f50617373657220696e636c7573696f6e2070726f6f66000000000000000000006064820152608401610656565b600060607f000000000000000000000000000000000000000000000000000000000000000061397e610120850185614fcc565b905010156139eb576139e87f00000000000000000000000000000000000000000000000000000000000000006139b8610120860186614fcc565b6139e391507f00000000000000000000000000000000000000000000000000000000000000006151c8565b613e7b565b90505b6115c6846139f8856152a0565b83613f07565b60006001613a0b83613bb8565b1192915050565b805180613a1e86611b31565b14613a915760405162461bcd60e51b815260206004820152602260248201527f436f6c6f737365756d3a20696e76616c6964207365676d656e7473206c656e6760448201527f74680000000000000000000000000000000000000000000000000000000000006064820152608401610656565b81600081518110613aa457613aa4615139565b60200260200101518414613b205760405162461bcd60e51b815260206004820152602c60248201527f436f6c6f737365756d3a20746865206669727374207365676d656e74206d757360448201527f74206265206d61746368656400000000000000000000000000000000000000006064820152608401610656565b81613b2c6001836151c8565b81518110613b3c57613b3c615139565b602002602001015183036137d45760405162461bcd60e51b815260206004820152602f60248201527f436f6c6f737365756d3a20746865206c617374207365676d656e74206d75737460448201527f206e6f74206265206d61746368656400000000000000000000000000000000006064820152608401610656565b805460009060ff166001613bcb82611b31565b613bd591906151c8565b8360030154612ae59190615676565b8251613bf99060028601906020860190614818565b50600484019190915560039092019190915550565b613c17816139fe565b613c8257613c457f000000000000000000000000000000000000000000000000000000000000000042614eb0565b815467ffffffffffffffff91909116610100027fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff90911617815550565b613c457f000000000000000000000000000000000000000000000000000000000000000042614eb0565b50565b6000613cbc60028361568a565b60ff161592915050565b6040805160118082526102408201909252600091829190816020015b6060815260200190600190039081613ce2579050509050613d04848483613f79565b613d33846101000151604051602001613d1f91815260200190565b60405160208183030381529060405261422c565b81601081518110613d4657613d46615139565b6020026020010181905250613d5a8161429b565b8051906020012091505092915050565b6040805160148082526102a08201909252600091829190816020015b6060815260200190600190039081613d86579050509050613da8848483613f79565b613dc3846101000151604051602001613d1f91815260200190565b81601081518110613dd657613dd6615139565b6020026020010181905250613df984610140015167ffffffffffffffff166142df565b81601181518110613e0c57613e0c615139565b6020026020010181905250613e2f84610160015167ffffffffffffffff166142df565b81601281518110613e4257613e42615139565b6020026020010181905250613e68846101800151604051602001613d1f91815260200190565b81601381518110613d4657613d46615139565b606060008267ffffffffffffffff811115613e9857613e98614993565b604051908082528060200260200182016040528015613ec1578160200160208202803683370190505b50905060005b83811015613eff5784828281518110613ee257613ee2615139565b602090810291909101015280613ef7816156ac565b915050613ec7565b509392505050565b6000838360e001516000801b85600001518660200151876060015188604001518960a001518a608001518b6101200151518c61012001518c604051602001613f5a9c9b9a99989796959493929190615717565b6040516020818303038152906040528051906020012090509392505050565b613f938360200151604051602001613d1f91815260200190565b81600081518110613fa657613fa6615139565b6020026020010181905250816000015181600181518110613fc957613fc9615139565b6020026020010181905250816020015181600281518110613fec57613fec615139565b60200260200101819052506140118360e00151604051602001613d1f91815260200190565b8160038151811061402457614024615139565b60200260200101819052506140498360c00151604051602001613d1f91815260200190565b8160048151811061405c5761405c615139565b602002602001018190525081604001518160058151811061407f5761407f615139565b60200260200101819052508160600151816006815181106140a2576140a2615139565b60200260200101819052508160800151816007815181106140c5576140c5615139565b60200260200101819052506140e7836060015167ffffffffffffffff166142df565b816008815181106140fa576140fa615139565b602002602001018190525061411c836080015167ffffffffffffffff166142df565b8160098151811061412f5761412f615139565b60200260200101819052508160a0015181600a8151811061415257614152615139565b6020026020010181905250614174836040015167ffffffffffffffff166142df565b81600b8151811061418757614187615139565b60200260200101819052508160c0015181600c815181106141aa576141aa615139565b60200260200101819052508160e0015181600d815181106141cd576141cd615139565b602002602001018190525081610100015181600e815181106141f1576141f1615139565b60200260200101819052506142098360a001516142df565b81600f8151811061421c5761421c615139565b6020026020010181905250505050565b6060808251600114801561425a575060808360008151811061425057614250615139565b016020015160f81c105b156142665750816115ca565b614272835160806142f2565b836040516020016142849291906157d0565b604051602081830303815290604052905092915050565b606060006142a8836144e8565b90506142b6815160c06142f2565b816040516020016142c89291906157d0565b604051602081830303815290604052915050919050565b60606115ca6142ed83614620565b61422c565b606080603884101561437157604080516001808252818301909252906020820181803683370190505090506143278385615114565b60f81b8160008151811061433d5761433d615139565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612ae5565b600060015b6143808187615676565b156143a6578161438f816156ac565b925061439f905061010082615168565b9050614376565b6143b1826001614eb0565b67ffffffffffffffff8111156143c9576143c9614993565b6040519080825280601f01601f1916602001820160405280156143f3576020820181803683370190505b5092506144008583615114565b61440b906037615114565b60f81b8360008151811061442157614421615139565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190505b8181116144df5761010061446982846151c8565b6144759061010061591f565b61447f9088615676565b614489919061520e565b60f81b83828151811061449e5761449e615139565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806144d7816156ac565b915050614455565b50509392505050565b6060815160000361450757505060408051600081526020810190915290565b6000805b835181101561454e5783818151811061452657614526615139565b6020026020010151518261453a9190614eb0565b915080614546816156ac565b91505061450b565b60008267ffffffffffffffff81111561456957614569614993565b6040519080825280601f01601f191660200182016040528015614593576020820181803683370190505b50600092509050602081015b85518310156146175760008684815181106145bc576145bc615139565b6020026020010151905060006020820190506145da8382845161477f565b8785815181106145ec576145ec615139565b602002602001015151836146009190614eb0565b92505050828061460f906156ac565b93505061459f565b50949350505050565b606060008260405160200161463791815260200190565b604051602081830303815290604052905060005b60208110156146a65781818151811061466657614666615139565b01602001517fff00000000000000000000000000000000000000000000000000000000000000166000036146a6578061469e816156ac565b91505061464b565b60006146b38260206151c8565b67ffffffffffffffff8111156146cb576146cb614993565b6040519080825280601f01601f1916602001820160405280156146f5576020820181803683370190505b50905060005b815181101561461757838361470f816156ac565b94508151811061472157614721615139565b602001015160f81c60f81b82828151811061473e5761473e615139565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080614777816156ac565b9150506146fb565b8282825b602081106147bb578151835261479a602084614eb0565b92506147a7602083614eb0565b91506147b46020826151c8565b9050614783565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052505050565b5080546000825590600052602060002090810190613cac9190614863565b828054828255906000526020600020908101928215614853579160200282015b82811115614853578251825591602001919060010190614838565b5061485f929150614863565b5090565b5b8082111561485f5760008155600101614864565b60006020828403121561488a57600080fd5b5035919050565b6001600160a01b0381168114613cac57600080fd5b600080604083850312156148b957600080fd5b8235915060208301356148cb81614891565b809150509250929050565b60005b838110156148f15781810151838201526020016148d9565b838111156106695750506000910152565b6000815180845261491a8160208601602086016148d6565b601f01601f19169290920160200192915050565b602081526000612ae56020830184614902565b600080600080600060a0868803121561495957600080fd5b85359450602086013561496b81614891565b9350604086013561497b81614891565b94979396509394606081013594506080013592915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516101a0810167ffffffffffffffff811182821017156149e6576149e6614993565b60405290565b604051610120810167ffffffffffffffff811182821017156149e6576149e6614993565b604051601f8201601f1916810167ffffffffffffffff81118282101715614a3957614a39614993565b604052919050565b600067ffffffffffffffff821115614a5b57614a5b614993565b5060051b60200190565b60006020808385031215614a7857600080fd5b823567ffffffffffffffff811115614a8f57600080fd5b8301601f81018513614aa057600080fd5b8035614ab3614aae82614a41565b614a10565b81815260059190911b82018301908381019087831115614ad257600080fd5b928401925b82841015614af057833582529284019290840190614ad7565b979650505050505050565b60008083601f840112614b0d57600080fd5b50813567ffffffffffffffff811115614b2557600080fd5b6020830191508360208260051b8501011115614b4057600080fd5b9250929050565b600080600080600080600060a0888a031215614b6257600080fd5b8735965060208801359550604088013567ffffffffffffffff80821115614b8857600080fd5b908901906101e0828c031215614b9d57600080fd5b90955060608901359080821115614bb357600080fd5b614bbf8b838c01614afb565b909650945060808a0135915080821115614bd857600080fd5b50614be58a828b01614afb565b989b979a50959850939692959293505050565b600080600080600060808688031215614c1057600080fd5b853594506020860135614c2281614891565b935060408601359250606086013567ffffffffffffffff811115614c4557600080fd5b614c5188828901614afb565b969995985093965092949392505050565b600060208284031215614c7457600080fd5b813560ff81168114612ae557600080fd5b60006020808352610100830160ff8551168285015267ffffffffffffffff8286015116604085015260408501516001600160a01b0380821660608701528060608801511660808701525050608085015160e060a0860152818151808452610120870191508483019350600092505b80831015614d135783518252928401926001929092019190840190614cf3565b5060a087015160c087015260c087015160e08701528094505050505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160068310614d9f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b600080600080600060808688031215614dbd57600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff811115614c4557600080fd5b80516fffffffffffffffffffffffffffffffff811681146134d657600080fd5b600060808284031215614e1b57600080fd5b6040516080810181811067ffffffffffffffff82111715614e3e57614e3e614993565b6040528251614e4c81614891565b815260208381015190820152614e6460408401614de9565b6040820152614e7560608401614de9565b60608201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115614ec357614ec3614e81565b500190565b600060208284031215614eda57600080fd5b81518015158114612ae557600080fd5b600060a08284031215614efc57600080fd5b60405160a0810181811067ffffffffffffffff82111715614f1f57614f1f614993565b806040525082358152602083013560208201526040830135604082015260608301356060820152608083013560808201528091505092915050565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe61833603018112614f8e57600080fd5b9190910192915050565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee1833603018112614f8e57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261500157600080fd5b83018035915067ffffffffffffffff82111561501c57600080fd5b6020019150600581901b3603821315614b4057600080fd5b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561506657600080fd5b8260051b8083602087013760009401602001938452509192915050565b606081526000615097606083018789615034565b82810360208401526150aa818688615034565b9150508260408301529695505050505050565b8381526fffffffffffffffffffffffffffffffff831660208201526060604082015260006150ee6060830184614902565b95945050505050565b60006020828403121561510957600080fd5b8151612ae581614891565b600060ff821660ff84168060ff0382111561513157615131614e81565b019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151a0576151a0614e81565b500290565b600060ff821660ff8416808210156151bf576151bf614e81565b90039392505050565b6000828210156151da576151da614e81565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261521d5761521d6151df565b500690565b803567ffffffffffffffff811681146134d657600080fd5b600082601f83011261524b57600080fd5b8135602061525b614aae83614a41565b82815260059290921b8401810191818101908684111561527a57600080fd5b8286015b84811015615295578035835291830191830161527e565b509695505050505050565b60006101a082360312156152b357600080fd5b6152bb6149c2565b82358152602083013560208201526152d560408401615222565b60408201526152e660608401615222565b60608201526152f760808401615222565b608082015260a083013560a082015260c083013560c082015260e083013560e08201526101008084013581830152506101208084013567ffffffffffffffff81111561534257600080fd5b61534e3682870161523a565b828401525050610140615362818501615222565b90820152610160615374848201615222565b9082015261018092830135928101929092525090565b600082601f83011261539b57600080fd5b813567ffffffffffffffff8111156153b5576153b5614993565b6153c86020601f19601f84011601614a10565b8181528460208386010111156153dd57600080fd5b816020850160208301376000918101602001919091529392505050565b6000610120823603121561540d57600080fd5b6154156149ec565b823567ffffffffffffffff8082111561542d57600080fd5b6154393683870161538a565b8352602085013591508082111561544f57600080fd5b61545b3683870161538a565b6020840152604085013591508082111561547457600080fd5b6154803683870161538a565b6040840152606085013591508082111561549957600080fd5b6154a53683870161538a565b606084015260808501359150808211156154be57600080fd5b6154ca3683870161538a565b608084015260a08501359150808211156154e357600080fd5b6154ef3683870161538a565b60a084015260c085013591508082111561550857600080fd5b6155143683870161538a565b60c084015260e085013591508082111561552d57600080fd5b6155393683870161538a565b60e08401526101009150818501358181111561555457600080fd5b6155603682880161538a565b8385015250505080915050919050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b858152600060206080818401526155b56080840188614902565b8381036040850152858152818101600587901b820183018860005b8981101561565d57601f1985840301845281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18c360301811261561357600080fd5b8b01868101903567ffffffffffffffff81111561562f57600080fd5b80360382131561563e57600080fd5b615649858284615570565b9588019594505050908501906001016155d0565b5050809450505050508260608301529695505050505050565b600082615685576156856151df565b500490565b600060ff83168061569d5761569d6151df565b8060ff84160691505092915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036156dd576156dd614e81565b5060010190565b60008151602080840160005b8381101561570c578151875295820195908201906001016156f0565b509495945050505050565b8c81528b60208201528a604082015289606082015288608082015260007fffffffffffffffff000000000000000000000000000000000000000000000000808a60c01b1660a0840152808960c01b1660a88401528760b0840152808760c01b1660d0840152507fffff0000000000000000000000000000000000000000000000000000000000008560f01b1660d88301526157be6157b860da8401866156e4565b846156e4565b9e9d5050505050505050505050505050565b600083516157e28184602088016148d6565b8351908301906157f68183602088016148d6565b01949350505050565b600181815b8085111561585857817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561583e5761583e614e81565b8085161561584b57918102915b93841c9390800290615804565b509250929050565b60008261586f575060016115ca565b8161587c575060006115ca565b8160018114615892576002811461589c576158b8565b60019150506115ca565b60ff8411156158ad576158ad614e81565b50506001821b6115ca565b5060208310610133831016604e8410600b84101617156158db575081810a6115ca565b6158e583836157ff565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561591757615917614e81565b029392505050565b6000612ae5838361586056fea164736f6c634300080f000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_l2Oracle\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"},{\"name\":\"_zkVerifier\",\"type\":\"address\",\"internalType\":\"contractZKVerifier\"},{\"name\":\"_submissionInterval\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_creationPeriodSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_bisectionTimeout\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_provingTimeout\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_dummyHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_maxTxs\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_segmentsLengths\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"_securityCouncil\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_zkMerkleTrie\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"BISECTION_TIMEOUT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"CREATION_PERIOD_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DUMMY_HASH\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"L2_ORACLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"L2_ORACLE_SUBMISSION_INTERVAL\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_TXS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PROVING_TIMEOUT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"SECURITY_COUNCIL\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ZK_MERKLE_TRIE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ZK_VERIFIER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractZKVerifier\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"bisect\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_pos\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_segments\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"cancelChallenge\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"challengerTimeout\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"challenges\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"turn\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"timeoutAt\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"asserter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"challenger\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"segSize\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"segStart\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createChallenge\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_l1BlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_l1BlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_segments\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deletedOutputs\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"outputRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"timestamp\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"l2BlockNumber\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"dismissChallenge\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_asserter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_outputRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_publicInputHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"forceDeleteOutput\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getSegments\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStatus\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumColosseum.ChallengeStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_segmentsLengths\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isInCreationPeriod\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proveFault\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_pos\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_proof\",\"type\":\"tuple\",\"internalType\":\"structTypes.PublicInputProof\",\"components\":[{\"name\":\"srcOutputRootProof\",\"type\":\"tuple\",\"internalType\":\"structTypes.OutputRootProof\",\"components\":[{\"name\":\"version\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messagePasserStorageRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"nextBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"dstOutputRootProof\",\"type\":\"tuple\",\"internalType\":\"structTypes.OutputRootProof\",\"components\":[{\"name\":\"version\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"messagePasserStorageRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"nextBlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"publicInput\",\"type\":\"tuple\",\"internalType\":\"structTypes.PublicInput\",\"components\":[{\"name\":\"blockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"parentHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"timestamp\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"number\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"gasLimit\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"baseFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"transactionsRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stateRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"withdrawalsRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"txHashes\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"blobGasUsed\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"excessBlobGas\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"parentBeaconRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"rlps\",\"type\":\"tuple\",\"internalType\":\"structTypes.BlockHeaderRLP\",\"components\":[{\"name\":\"uncleHash\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"coinbase\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"receiptsRoot\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"logsBloom\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"difficulty\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"gasUsed\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"extraData\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"mixHash\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"nonce\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"l2ToL1MessagePasserBalance\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"l2ToL1MessagePasserCodeHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"merkleProof\",\"type\":\"bytes[]\",\"internalType\":\"bytes[]\"}]},{\"name\":\"_zkproof\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"},{\"name\":\"_pair\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"segmentsLengths\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"verifiedPublicInputs\",\"inputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Bisected\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"turn\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChallengeCanceled\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChallengeCreated\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"asserter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChallengeDismissed\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ChallengerTimedOut\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OutputForceDeleted\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"asseter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Proven\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ReadyToProve\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"BlockHashMismatched\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"BlockHashMismatchedBtwSrcAndDst\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CannotCancelChallenge\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"CreationPeriodPassed\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FirstSegmentMismatched\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ImproperChallengeStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ImproperChallengeStatusToCancel\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ImproperValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddressGiven\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInclusionProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidOutputGiven\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidPublicInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSegmentsLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidTurn\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidZKProof\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"L1Reorged\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"LastSegmentMatched\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotAllowedCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotAllowedGenesisOutput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OnlyChallengerCanCancel\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutputAlreadyDeleted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutputAlreadyFinalized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OutputNotDeleted\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StateRootMismatched\",\"inputs\":[]}]", + Bin: "0x6101c06040523480156200001257600080fd5b50604051620064fd380380620064fd83398101604081905262000035916200038a565b6001600160a01b03808c166080528a811660a05260c089905260e08890526101008790526101208a90526101408690526101608590528281166101805281166101a052620000838362000094565b5050505050505050505050620004e3565b600054610100900460ff1615808015620000b55750600054600160ff909116105b80620000e55750620000d2306200029660201b62002dca1760201c565b158015620000e5575060005460ff166001145b6200014d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840160405180910390fd5b6000805460ff19166001179055801562000171576000805461ff0019166101001790555b6002825162000181919062000458565b15620001a057604051630fbb795f60e41b815260040160405180910390fd5b600160005b83518110156200022557838181518110620001c457620001c46200047b565b602002602001015160016000838152602001908152602001600020819055506001848281518110620001fa57620001fa6200047b565b60200260200101516200020e9190620004a7565b6200021a9083620004c1565b9150600101620001a5565b506101205181146200024a57604051630fbb795f60e41b815260040160405180910390fd5b50801562000292576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6001600160a01b03163b151590565b6001600160a01b0381168114620002bb57600080fd5b50565b8051620002cb81620002a5565b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620002f857600080fd5b815160206001600160401b0380831115620003175762000317620002d0565b8260051b604051601f19603f830116810181811084821117156200033f576200033f620002d0565b6040529384528581018301938381019250878511156200035e57600080fd5b83870191505b848210156200037f5781518352918301919083019062000364565b979650505050505050565b60008060008060008060008060008060006101608c8e031215620003ad57600080fd5b8b51620003ba81620002a5565b60208d0151909b50620003cd81620002a5565b809a505060408c0151985060608c0151975060808c0151965060a08c0151955060c08c0151945060e08c015193506101008c015160018060401b038111156200041557600080fd5b620004238e828f01620002e6565b935050620004356101208d01620002be565b9150620004466101408d01620002be565b90509295989b509295989b9093969950565b6000826200047657634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015620004bc57620004bc62000491565b500390565b6000816000190483118215151615620004de57620004de62000491565b500290565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051615e32620006cb600039600081816103d50152613e860152600081816102f6015281816115bc0152818161202c01528181612260015261351e01526000818161036501528181613f680152613fd60152600081816105dc0152613fa201526000818161058e0152818161108001528181612ca80152612ce10152600081816105b501528181612e3f01526141af01526000818161031d01526142160152600081816104da015281816106cc01526126e301526000818161052101526113270152600081816101b7015281816106ed015281816107e50152818161090c01528181610af301528181610b5101528181610c4601528181610d4501528181611444015281816116db015281816117c1015281816118d801528181611acd01528181611f3d01528181612054015281816120b2015281816121a7015281816123870152818161247c0152818161266b015281816128330152818161297a01528181612a6f01528181612b6a01528181612f8f015281816130840152818161311501528181613256015281816132d00152818161336201528181613443015281816135a601528181613687015281816138750152818161396a0152613a650152615e326000f3fe608060405234801561001057600080fd5b50600436106101ad5760003560e01c806380ab1313116100ee578063b3e7766d11610097578063d5145ebc11610071578063d5145ebc146105d7578063e39a219c146105fe578063e9371a2c14610611578063fc9d84df1461063157600080fd5b8063b3e7766d14610569578063cfb4474d14610589578063d2ee3075146105b057600080fd5b80639ded3952116100c85780639ded39521461051c578063a41483e314610543578063a6ade11f1461055657600080fd5b806380ab1313146104c25780638f3a6c88146104d55780638f86c803146104fc57600080fd5b8063461569b81161015b5780635865b607116101355780635865b607146103d05780635a6b011f146103f757806362fc00db1461049c5780636fe0e559146104af57600080fd5b8063461569b81461034d5780635375b8911461036057806354fd4d501461038757600080fd5b80632df27fa51161018c5780632df27fa51461023e57806336086417146102f15780634394c5841461031857600080fd5b80621c2ff6146101b25780631be4e27e146101f65780631db1b67214610229575b600080fd5b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b610219610204366004614e01565b60036020526000908152604090205460ff1681565b60405190151581526020016101ed565b61023c610237366004614e2f565b610644565b005b6102aa61024c366004614e2f565b6002602090815260009283526040808420909152908252902080546001820154600383015460049093015460ff83169367ffffffffffffffff610100850416936001600160a01b036901000000000000000000909104811693169186565b6040805160ff909716875267ffffffffffffffff90951660208701526001600160a01b039384169486019490945291166060840152608083015260a082015260c0016101ed565b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016101ed565b61021961035b366004614e01565b6106c7565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b6103c36040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516101ed9190614eb7565b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b61045a610405366004614e01565b6004602052600090815260409020805460018201546002909201546001600160a01b0390911691906fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041684565b604080516001600160a01b03909516855260208501939093526fffffffffffffffffffffffffffffffff918216928401929092521660608201526080016101ed565b61023c6104aa366004614eca565b6107a2565b61023c6104bd366004614fee565b610e96565b61023c6104d03660046150d0565b61113e565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b61033f61050a366004614e01565b60016020526000908152604090205481565b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b61023c610551366004614e01565b611b3e565b61023c610564366004615181565b611baf565b61057c610577366004614e2f565b611e82565b6040516101ed91906151eb565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b61023c61060c366004614e01565b611efa565b61062461061f366004614e2f565b612319565b6040516101ed919061525e565b61023c61063f36600461529f565b61234b565b600360008381526002602090815260408083206001600160a01b0386168452909152902061067190612dd9565b60058111156106825761068261522f565b146106b9576040517f744b348200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106c38282612eb7565b5050565b6000427f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a25ae557856040518263ffffffff1660e01b815260040161073991815260200190565b608060405180830381865afa158015610756573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077a9190615303565b604001516fffffffffffffffffffffffffffffffff1661079a91906153aa565b101592915050565b6107aa613513565b6107b385613577565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018690526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa158015610834573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108589190615303565b6020015114610893576040517f8796efdc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008581526004602052604090206001015482146108dd576040517f90e78fa500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018690527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0ea09a890602401602060405180830381865afa15801561095b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097f91906153c2565b6001600160a01b0316846001600160a01b03161415806109b957506000858152600460205260409020546001600160a01b03848116911614155b156109f0576040517f8036a47f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008181526003602052604090205460ff16610a38576040517f7458ca2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260036020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905587835260049182905280832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155600181018490556002019290925590517fe6646723000000000000000000000000000000000000000000000000000000008152908101869052602481018390526001600160a01b0384811660448301527f0000000000000000000000000000000000000000000000000000000000000000169063e664672390606401600060405180830381600087803b158015610b3757600080fd5b505af1158015610b4b573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd191906153c2565b6001600160a01b031663ad36d6cc866040518263ffffffff1660e01b8152600401610bfe91815260200190565b602060405180830381865afa158015610c1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3f91906153df565b15610e4b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc691906153c2565b6040517fab04b8aa000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b038581166024830152919091169063ab04b8aa90604401600060405180830381600087803b158015610d2b57600080fd5b505af1158015610d3f573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610da1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc591906153c2565b6040517fbe995dc2000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b0385811660248301528681166044830152919091169063be995dc290606401600060405180830381600087803b158015610e3257600080fd5b505af1158015610e46573d6000803e3d6000fd5b505050505b836001600160a01b0316857fdca9fa9b51a5ba03938c6a0cd5489011630370fc481ef2b0cb771ad904a7305342604051610e8791815260200190565b60405180910390a35050505050565b600054610100900460ff1615808015610eb65750600054600160ff909116105b80610ed05750303b158015610ed0575060005460ff166001145b610f61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610fbf57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60028251610fcd9190615430565b15611004576040517ffbb795f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160005b835181101561107d5783818151811061102457611024615444565b60200260200101516001600083815260200190815260200160002081905550600184828151811061105757611057615444565b60200260200101516110699190615473565b611073908361548a565b9150600101611009565b507f000000000000000000000000000000000000000000000000000000000000000081146110d7576040517ffbb795f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5080156106c357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b61114787613577565b600087815260026020908152604080832033845290915281209061116a82612dd9565b6001830154909150611187908a906001600160a01b031683613653565b15611193575050611b35565b60058160058111156111a7576111a761522f565b141580156111c7575060048160058111156111c4576111c461522f565b14155b156111fe576040517f744b348200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611239888361121a611215368c90038c018c6154c7565b613b72565b61122f611215368d90038d0160a08e016154c7565b8b60a08101613c61565b6112628760a0810161124f610140830183615537565b61125d6101608c018c615575565b613d69565b61128e6112736101c08901896155a9565b6101808a01356101a08b013560e08c013560c08d0135613e2e565b60006112ab60208901356112a66101408b018b615537565b613f62565b60008181526003602052604090205490915060ff16156112f7576040517f7458ca2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f4292dc3e0000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634292dc3e90611364908a908a908a908a908890600401615660565b602060405180830381865afa158015611381573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a591906153df565b6113db576040517f076490f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405142815233908b907f0431864ed2609170587bbc7c198abd8caee4c55943dfb16fd42ec6f59c91c5f79060200160405180910390a36040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018b90526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa158015611493573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b79190615303565b84546020820151604051602481018f905233604482015269010000000000000000009092046001600160a01b03166064830152608482015260a481018490529091506000907f62fc00db000000000000000000000000000000000000000000000000000000009060c40160408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009095169490941790935291840151606085015192517f080b91ee0000000000000000000000000000000000000000000000000000000081529193506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263080b91ee926115f3929190869060040161569a565b600060405180830381600087803b15801561160d57600080fd5b505af1158015611621573d6000803e3d6000fd5b50505060008d815260046020818152604092839020865181546001600160a01b039182167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116178255828801516001830155848801516060909801516fffffffffffffffffffffffffffffffff9081167001000000000000000000000000000000000298169790971760029091015582517fb98debbf00000000000000000000000000000000000000000000000000000000815292517f00000000000000000000000000000000000000000000000000000000000000009096169563b98debbf9550838301945090929091908290030181865afa158015611728573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174c91906153c2565b6001600160a01b031663ad36d6cc8b6040518263ffffffff1660e01b815260040161177991815260200190565b602060405180830381865afa158015611796573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ba91906153df565b156118d6577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561181d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184191906153c2565b83546040517fbe995dc2000000000000000000000000000000000000000000000000000000008152600481018d90523360248201526001600160a01b0369010000000000000000009092048216604482015291169063be995dc290606401600060405180830381600087803b1580156118b957600080fd5b505af11580156118cd573d6000803e3d6000fd5b505050506119d4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611934573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195891906153c2565b6040517fdd215c5d000000000000000000000000000000000000000000000000000000008152600481018c90523360248201526001600160a01b03919091169063dd215c5d90604401600060405180830381600087803b1580156119bb57600080fd5b505af11580156119cf573d6000803e3d6000fd5b505050505b600081815260036020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558d8452600280845282852033865290935290832080547fffffff000000000000000000000000000000000000000000000000000000000016815590810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690559190611a8290830182614d83565b5060006003820181905560049182018190556040517fe66467230000000000000000000000000000000000000000000000000000000081529182018c905260248201523360448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e664672390606401600060405180830381600087803b158015611b1957600080fd5b505af1158015611b2d573d6000803e3d6000fd5b505050505050505b50505050505050565b600081815260026020908152604080832033845290915290206001810154611b799083906001600160a01b0316611b7484612dd9565b613653565b6106c3576040517f4e9d86f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611bb885613577565b60008581526002602090815260408083206001600160a01b0388168452909152812090611be482612dd9565b6001830154909150611c019088906001600160a01b031683613653565b15611c0d575050611e7b565b60006001826005811115611c2357611c2361522f565b03611c3c575060018201546001600160a01b0316611c6f565b6002826005811115611c5057611c5061522f565b03611c6f57508154690100000000000000000090046001600160a01b03165b336001600160a01b03821614611cb1576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8254600090611cc49060ff1660016156d4565b9050611d4f81856002018981548110611cdf57611cdf615444565b9060005260206000200154866002018a6001611cfb91906153aa565b81548110611d0b57611d0b615444565b906000526020600020015489898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061401d92505050565b6000611d5a8561412e565b9050611db585888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611da092508691508d905061548a565b8860040154611daf91906153aa565b84614173565b84547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8316178555611de98561419d565b6040805160ff841681524260208201526001600160a01b038b16918c917fcadef6622777415b0589e491bdbf6baf11242f676f77055fd03bf1658c17a145910160405180910390a3611e3a8561423b565b611e75576040516001600160a01b038a16908b907f5c4528cbb38a169d24837617d3fd3d5c70a47769a4e9af6f384720b359b716c890600090a35b50505050505b5050505050565b60008281526002602081815260408084206001600160a01b0386168552825292839020909101805483518184028101840190945280845260609392830182828015611eec57602002820191906000526020600020905b815481526020019060010190808311611ed8575b505050505090505b92915050565b611f02613513565b611f0b81613577565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa158015611f8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb09190615303565b6020810151909150611fee576040517fe66309bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fe664672300000000000000000000000000000000000000000000000000000000815260048101839052600060248201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660448301527f0000000000000000000000000000000000000000000000000000000000000000169063e664672390606401600060405180830381600087803b15801561209857600080fd5b505af11580156120ac573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561210e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213291906153c2565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b815260040161215f91815260200190565b602060405180830381865afa15801561217c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a091906153df565b156122cd577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612203573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061222791906153c2565b81516040517fbe995dc2000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166024830152918216604482015291169063be995dc290606401600060405180830381600087803b1580156122b457600080fd5b505af11580156122c8573d6000803e3d6000fd5b505050505b80600001516001600160a01b0316827fa620f04b65b1d538481626bf41dc5ee321b5c48e0cc1a7daae213cf7c254b54e4260405161230d91815260200190565b60405180910390a35050565b60008281526002602090815260408083206001600160a01b0385168452909152812061234490612dd9565b9392505050565b84600003612385576040517f2604872b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240791906153c2565b6001600160a01b031663ad36d6cc866040518263ffffffff1660e01b815260040161243491815260200190565b602060405180830381865afa158015612451573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247591906153df565b156125b5577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124fc91906153c2565b6040517f9f8a13d70000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b039190911690639f8a13d790602401602060405180830381865afa15801561255b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257f91906153df565b6125b5576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600085815260026020908152604080832033845290915290208054600160ff909116106126395760036125e782612dd9565b60058111156125f8576125f861522f565b1461262f576040517f744b348200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126398633612eb7565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018790526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa1580156126ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126de9190615303565b9050427f000000000000000000000000000000000000000000000000000000000000000082604001516fffffffffffffffffffffffffffffffff1661272391906153aa565b101561275b576040517fa0388b4700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020810151612796576040517fe66309bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516001600160a01b031633036127d9576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85158015906127e85750844015155b156128275785854014612827576040517f72f1f56300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a25ae55761286360018b615473565b6040518263ffffffff1660e01b815260040161288191815260200190565b608060405180830381865afa15801561289e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c29190615303565b60208101519091506129305761292b6001868660008181106128e6576128e6615444565b90506020020135846020015188888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061401d92505050565b612978565b61297860018260200151846020015188888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061401d92505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129fa91906153c2565b6001600160a01b031663ad36d6cc896040518263ffffffff1660e01b8152600401612a2791815260200190565b602060405180830381865afa158015612a44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a6891906153df565b15612b68577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612acb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aef91906153c2565b6040517f8c1516c70000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b039190911690638c1516c790602401600060405180830381600087803b158015612b4b57600080fd5b505af1158015612b5f573d6000803e3d6000fd5b50505050612c66565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bea91906153c2565b6040517f5a544742000000000000000000000000000000000000000000000000000000008152600481018a90523360248201526001600160a01b039190911690635a54474290604401600060405180830381600087803b158015612c4d57600080fd5b505af1158015612c61573d6000803e3d6000fd5b505050505b612d058386868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050506060860151612cdf91507f0000000000000000000000000000000000000000000000000000000000000000906fffffffffffffffffffffffffffffffff16615473565b7f0000000000000000000000000000000000000000000000000000000000000000614173565b825482516001600160a01b03166901000000000000000000027fffffff0000000000000000000000000000000000000000ffffffffffffffff009091161760019081178455830180547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055612d7d8361419d565b815160405142815233916001600160a01b0316908a907fd2f7931a802085b3d0234d4c320ce7ee0041da96678ce2bf5c93e8d3d7e65f529060200160405180910390a45050505050505050565b6001600160a01b03163b151590565b8054600090600160ff9091161015612df357506000919050565b8154600090612e079060029060ff166156f9565b835460ff91909116159150610100900467ffffffffffffffff16421115612e8c578015612e375750600392915050565b8254612e73907f000000000000000000000000000000000000000000000000000000000000000090610100900467ffffffffffffffff166153aa565b421115612e835750600392915050565b50600492915050565b612e958361423b565b612ea25750600592915050565b80612eae576002612344565b60019392505050565b60008281526002602081815260408084206001600160a01b0386168552909152822080547fffffff00000000000000000000000000000000000000000000000000000000001681556001810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690559190612f3790830182614d83565b600382016000905560048201600090555050806001600160a01b0316827fbf4506ef5d06ecb6168f37bc9e69dd473089eb9e3f2675322d01b4d466cff05142604051612f8591815260200190565b60405180910390a37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612feb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061300f91906153c2565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b815260040161303c91815260200190565b602060405180830381865afa158015613059573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307d91906153df565b15613227577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061310491906153c2565b6001600160a01b031663be995dc2837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b0ea09a8866040518263ffffffff1660e01b815260040161316191815260200190565b602060405180830381865afa15801561317e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131a291906153c2565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526001600160a01b039081166024830152841660448201526064015b600060405180830381600087803b15801561320b57600080fd5b505af115801561321f573d6000803e3d6000fd5b505050505050565b6040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa1580156132a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132c991906153df565b15613441577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561332c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061335091906153c2565b6001600160a01b03166336b8346983837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b0ea09a8876040518263ffffffff1660e01b81526004016133ae91815260200190565b602060405180830381865afa1580156133cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133ef91906153c2565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526001600160a01b0391821660248401521660448201526064016131f1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561349f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134c391906153c2565b6040517fdd215c5d000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b038381166024830152919091169063dd215c5d906044016131f1565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614613575576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa1580156135f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061361991906153df565b15613650576040517f5c9d9a2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b6040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810184905260009081907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa1580156136d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136fa9190615303565b602001511461370b57506000612344565b336001600160a01b0384161461374d576040517f21e62a3f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260058111156137615761376161522f565b148061377e5750600382600581111561377c5761377c61522f565b145b156137b5576040517ff691b6e600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848152600260208181526040808420338552909152822080547fffffff00000000000000000000000000000000000000000000000000000000001681556001810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055919061382c90830182614d83565b50600060038201819055600490910155604051428152339085907f6f3468a095154788e69ed719ee418416c1e338ac2348ccb3531bb97a0ed6ed9d9060200160405180910390a37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138f591906153c2565b6001600160a01b031663ad36d6cc856040518263ffffffff1660e01b815260040161392291815260200190565b602060405180830381865afa15801561393f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061396391906153df565b15613a63577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139ea91906153c2565b6040517fa83871720000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03919091169063a838717290602401600060405180830381600087803b158015613a4657600080fd5b505af1158015613a5a573d6000803e3d6000fd5b50505050613b68565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ac1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ae591906153c2565b6040517f36b8346900000000000000000000000000000000000000000000000000000000815260048101869052336024820181905260448201526001600160a01b0391909116906336b8346990606401600060405180830381600087803b158015613b4f57600080fd5b505af1158015613b63573d6000803e3d6000fd5b505050505b5060019392505050565b8051600090613bd45781516020808401516040808601516060808801516080808a0151855180890199909952888601969096529187019290925285015260a0808501929092528051808503909201825260c09093019092528151910120611ef4565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f48617368696e673a20756e6b6e6f776e206f757470757420726f6f742070726f60448201527f6f662076657273696f6e000000000000000000000000000000000000000000006064820152608401610f58565b919050565b83856002018781548110613c7757613c77615444565b906000526020600020015414613cb9576040517f224dff3200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613cc28561423b565b613d28578260028601613cd68860016153aa565b81548110613ce657613ce6615444565b906000526020600020015403613d28576040517f87c1943200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806060013582608001351461321f576040517f3f126fab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82602001358260e0013514613daa576040517f4d9e774000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610180830135613dd557613dd0613dc284615799565b613dcb846158f3565b61424f565b613def565b613def613de184615799565b613dea846158f3565b6142f3565b905080856080013514611e7b576040517fb033950600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051600060208201528082018690526060810185905260808082018590528251808303909101815260a08201928390527f12e64a72000000000000000000000000000000000000000000000000000000009092527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906312e64a7290613eeb907f42000000000000000000000000000000000000030000000000000000000000009085908c908c90899060a401615a94565b602060405180830381865afa158015613f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f2c91906153df565b611b35576040517ff35959c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060607f0000000000000000000000000000000000000000000000000000000000000000613f956101208501856155a9565b9050101561400257613fff7f0000000000000000000000000000000000000000000000000000000000000000613fcf6101208601866155a9565b613ffa91507f0000000000000000000000000000000000000000000000000000000000000000615473565b614404565b90505b6140158461400f85615799565b83614490565b949350505050565b80516001600061402d8288615b6f565b60ff1681526020019081526020016000205414614076576040517ffbb795f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008151811061408957614089615444565b602002602001015183146140c9576040517f224dff3200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600182516140d89190615473565b815181106140e8576140e8615444565b60200260200101518203614128576040517f87c1943200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b80546000906001908190839061414890839060ff16615b6f565b60ff168152602001908152602001600020546141649190615473565b8260030154611ef49190615b92565b82516141889060028601906020860190614da1565b50600484019190915560039092019190915550565b6141a68161423b565b614211576141d47f0000000000000000000000000000000000000000000000000000000000000000426153aa565b815467ffffffffffffffff91909116610100027fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff90911617815550565b6141d47f0000000000000000000000000000000000000000000000000000000000000000426153aa565b600060016142488361412e565b1192915050565b6040805160118082526102408201909252600091829190816020015b606081526020019060019003908161426b57905050905061428d848483614502565b6142bc8461010001516040516020016142a891815260200190565b6040516020818303038152906040526147b5565b816010815181106142cf576142cf615444565b60200260200101819052506142e381614824565b8051906020012091505092915050565b6040805160148082526102a08201909252600091829190816020015b606081526020019060019003908161430f579050509050614331848483614502565b61434c8461010001516040516020016142a891815260200190565b8160108151811061435f5761435f615444565b602002602001018190525061438284610140015167ffffffffffffffff16614868565b8160118151811061439557614395615444565b60200260200101819052506143b884610160015167ffffffffffffffff16614868565b816012815181106143cb576143cb615444565b60200260200101819052506143f18461018001516040516020016142a891815260200190565b816013815181106142cf576142cf615444565b606060008267ffffffffffffffff81111561442157614421614f1c565b60405190808252806020026020018201604052801561444a578160200160208202803683370190505b50905060005b83811015614488578482828151811061446b5761446b615444565b60209081029190910101528061448081615ba6565b915050614450565b509392505050565b6000838360e001516000801b85600001518660200151876060015188604001518960a001518a608001518b6101200151518c61012001518c6040516020016144e39c9b9a99989796959493929190615c11565b6040516020818303038152906040528051906020012090509392505050565b61451c83602001516040516020016142a891815260200190565b8160008151811061452f5761452f615444565b602002602001018190525081600001518160018151811061455257614552615444565b602002602001018190525081602001518160028151811061457557614575615444565b602002602001018190525061459a8360e001516040516020016142a891815260200190565b816003815181106145ad576145ad615444565b60200260200101819052506145d28360c001516040516020016142a891815260200190565b816004815181106145e5576145e5615444565b602002602001018190525081604001518160058151811061460857614608615444565b602002602001018190525081606001518160068151811061462b5761462b615444565b602002602001018190525081608001518160078151811061464e5761464e615444565b6020026020010181905250614670836060015167ffffffffffffffff16614868565b8160088151811061468357614683615444565b60200260200101819052506146a5836080015167ffffffffffffffff16614868565b816009815181106146b8576146b8615444565b60200260200101819052508160a0015181600a815181106146db576146db615444565b60200260200101819052506146fd836040015167ffffffffffffffff16614868565b81600b8151811061471057614710615444565b60200260200101819052508160c0015181600c8151811061473357614733615444565b60200260200101819052508160e0015181600d8151811061475657614756615444565b602002602001018190525081610100015181600e8151811061477a5761477a615444565b60200260200101819052506147928360a00151614868565b81600f815181106147a5576147a5615444565b6020026020010181905250505050565b606080825160011480156147e357506080836000815181106147d9576147d9615444565b016020015160f81c105b156147ef575081611ef4565b6147fb8351608061487b565b8360405160200161480d929190615cca565b604051602081830303815290604052905092915050565b6060600061483183614a71565b905061483f815160c061487b565b81604051602001614851929190615cca565b604051602081830303815290604052915050919050565b6060611ef461487683614ba9565b6147b5565b60608060388410156148fa57604080516001808252818301909252906020820181803683370190505090506148b083856156d4565b60f81b816000815181106148c6576148c6615444565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612344565b600060015b6149098187615b92565b1561492f578161491881615ba6565b925061492890506101008261548a565b90506148ff565b61493a8260016153aa565b67ffffffffffffffff81111561495257614952614f1c565b6040519080825280601f01601f19166020018201604052801561497c576020820181803683370190505b50925061498985836156d4565b6149949060376156d4565b60f81b836000815181106149aa576149aa615444565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190505b818111614a68576101006149f28284615473565b6149fe90610100615e19565b614a089088615b92565b614a129190615430565b60f81b838281518110614a2757614a27615444565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080614a6081615ba6565b9150506149de565b50509392505050565b60608151600003614a9057505060408051600081526020810190915290565b6000805b8351811015614ad757838181518110614aaf57614aaf615444565b60200260200101515182614ac391906153aa565b915080614acf81615ba6565b915050614a94565b60008267ffffffffffffffff811115614af257614af2614f1c565b6040519080825280601f01601f191660200182016040528015614b1c576020820181803683370190505b50600092509050602081015b8551831015614ba0576000868481518110614b4557614b45615444565b602002602001015190506000602082019050614b6383828451614d08565b878581518110614b7557614b75615444565b60200260200101515183614b8991906153aa565b925050508280614b9890615ba6565b935050614b28565b50949350505050565b6060600082604051602001614bc091815260200190565b604051602081830303815290604052905060005b6020811015614c2f57818181518110614bef57614bef615444565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016600003614c2f5780614c2781615ba6565b915050614bd4565b6000614c3c826020615473565b67ffffffffffffffff811115614c5457614c54614f1c565b6040519080825280601f01601f191660200182016040528015614c7e576020820181803683370190505b50905060005b8151811015614ba0578383614c9881615ba6565b945081518110614caa57614caa615444565b602001015160f81c60f81b828281518110614cc757614cc7615444565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080614d0081615ba6565b915050614c84565b8282825b60208110614d445781518352614d236020846153aa565b9250614d306020836153aa565b9150614d3d602082615473565b9050614d0c565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052505050565b50805460008255906000526020600020908101906136509190614dec565b828054828255906000526020600020908101928215614ddc579160200282015b82811115614ddc578251825591602001919060010190614dc1565b50614de8929150614dec565b5090565b5b80821115614de85760008155600101614ded565b600060208284031215614e1357600080fd5b5035919050565b6001600160a01b038116811461365057600080fd5b60008060408385031215614e4257600080fd5b823591506020830135614e5481614e1a565b809150509250929050565b60005b83811015614e7a578181015183820152602001614e62565b838111156141285750506000910152565b60008151808452614ea3816020860160208601614e5f565b601f01601f19169290920160200192915050565b6020815260006123446020830184614e8b565b600080600080600060a08688031215614ee257600080fd5b853594506020860135614ef481614e1a565b93506040860135614f0481614e1a565b94979396509394606081013594506080013592915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516101a0810167ffffffffffffffff81118282101715614f6f57614f6f614f1c565b60405290565b604051610120810167ffffffffffffffff81118282101715614f6f57614f6f614f1c565b604051601f8201601f1916810167ffffffffffffffff81118282101715614fc257614fc2614f1c565b604052919050565b600067ffffffffffffffff821115614fe457614fe4614f1c565b5060051b60200190565b6000602080838503121561500157600080fd5b823567ffffffffffffffff81111561501857600080fd5b8301601f8101851361502957600080fd5b803561503c61503782614fca565b614f99565b81815260059190911b8201830190838101908783111561505b57600080fd5b928401925b8284101561507957833582529284019290840190615060565b979650505050505050565b60008083601f84011261509657600080fd5b50813567ffffffffffffffff8111156150ae57600080fd5b6020830191508360208260051b85010111156150c957600080fd5b9250929050565b600080600080600080600060a0888a0312156150eb57600080fd5b8735965060208801359550604088013567ffffffffffffffff8082111561511157600080fd5b908901906101e0828c03121561512657600080fd5b9095506060890135908082111561513c57600080fd5b6151488b838c01615084565b909650945060808a013591508082111561516157600080fd5b5061516e8a828b01615084565b989b979a50959850939692959293505050565b60008060008060006080868803121561519957600080fd5b8535945060208601356151ab81614e1a565b935060408601359250606086013567ffffffffffffffff8111156151ce57600080fd5b6151da88828901615084565b969995985093965092949392505050565b6020808252825182820181905260009190848201906040850190845b8181101561522357835183529284019291840191600101615207565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160068310615299577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806000806000608086880312156152b757600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff8111156151ce57600080fd5b80516fffffffffffffffffffffffffffffffff81168114613c5c57600080fd5b60006080828403121561531557600080fd5b6040516080810181811067ffffffffffffffff8211171561533857615338614f1c565b604052825161534681614e1a565b81526020838101519082015261535e604084016152e3565b604082015261536f606084016152e3565b60608201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156153bd576153bd61537b565b500190565b6000602082840312156153d457600080fd5b815161234481614e1a565b6000602082840312156153f157600080fd5b8151801515811461234457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261543f5761543f615401565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000828210156154855761548561537b565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156154c2576154c261537b565b500290565b600060a082840312156154d957600080fd5b60405160a0810181811067ffffffffffffffff821117156154fc576154fc614f1c565b806040525082358152602083013560208201526040830135604082015260608301356060820152608083013560808201528091505092915050565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6183360301811261556b57600080fd5b9190910192915050565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee183360301811261556b57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126155de57600080fd5b83018035915067ffffffffffffffff8211156155f957600080fd5b6020019150600581901b36038213156150c957600080fd5b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561564357600080fd5b8260051b8083602087013760009401602001938452509192915050565b606081526000615674606083018789615611565b8281036020840152615687818688615611565b9150508260408301529695505050505050565b8381526fffffffffffffffffffffffffffffffff831660208201526060604082015260006156cb6060830184614e8b565b95945050505050565b600060ff821660ff84168060ff038211156156f1576156f161537b565b019392505050565b600060ff83168061570c5761570c615401565b8060ff84160691505092915050565b803567ffffffffffffffff81168114613c5c57600080fd5b600082601f83011261574457600080fd5b8135602061575461503783614fca565b82815260059290921b8401810191818101908684111561577357600080fd5b8286015b8481101561578e5780358352918301918301615777565b509695505050505050565b60006101a082360312156157ac57600080fd5b6157b4614f4b565b82358152602083013560208201526157ce6040840161571b565b60408201526157df6060840161571b565b60608201526157f06080840161571b565b608082015260a083013560a082015260c083013560c082015260e083013560e08201526101008084013581830152506101208084013567ffffffffffffffff81111561583b57600080fd5b61584736828701615733565b82840152505061014061585b81850161571b565b9082015261016061586d84820161571b565b9082015261018092830135928101929092525090565b600082601f83011261589457600080fd5b813567ffffffffffffffff8111156158ae576158ae614f1c565b6158c16020601f19601f84011601614f99565b8181528460208386010111156158d657600080fd5b816020850160208301376000918101602001919091529392505050565b6000610120823603121561590657600080fd5b61590e614f75565b823567ffffffffffffffff8082111561592657600080fd5b61593236838701615883565b8352602085013591508082111561594857600080fd5b61595436838701615883565b6020840152604085013591508082111561596d57600080fd5b61597936838701615883565b6040840152606085013591508082111561599257600080fd5b61599e36838701615883565b606084015260808501359150808211156159b757600080fd5b6159c336838701615883565b608084015260a08501359150808211156159dc57600080fd5b6159e836838701615883565b60a084015260c0850135915080821115615a0157600080fd5b615a0d36838701615883565b60c084015260e0850135915080821115615a2657600080fd5b615a3236838701615883565b60e084015261010091508185013581811115615a4d57600080fd5b615a5936828801615883565b8385015250505080915050919050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b85815260006020608081840152615aae6080840188614e8b565b8381036040850152858152818101600587901b820183018860005b89811015615b5657601f1985840301845281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18c3603018112615b0c57600080fd5b8b01868101903567ffffffffffffffff811115615b2857600080fd5b803603821315615b3757600080fd5b615b42858284615a69565b958801959450505090850190600101615ac9565b5050809450505050508260608301529695505050505050565b600060ff821660ff841680821015615b8957615b8961537b565b90039392505050565b600082615ba157615ba1615401565b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615bd757615bd761537b565b5060010190565b60008151602080840160005b83811015615c0657815187529582019590820190600101615bea565b509495945050505050565b8c81528b60208201528a604082015289606082015288608082015260007fffffffffffffffff000000000000000000000000000000000000000000000000808a60c01b1660a0840152808960c01b1660a88401528760b0840152808760c01b1660d0840152507fffff0000000000000000000000000000000000000000000000000000000000008560f01b1660d8830152615cb8615cb260da840186615bde565b84615bde565b9e9d5050505050505050505050505050565b60008351615cdc818460208801614e5f565b835190830190615cf0818360208801614e5f565b01949350505050565b600181815b80851115615d5257817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615d3857615d3861537b565b80851615615d4557918102915b93841c9390800290615cfe565b509250929050565b600082615d6957506001611ef4565b81615d7657506000611ef4565b8160018114615d8c5760028114615d9657615db2565b6001915050611ef4565b60ff841115615da757615da761537b565b50506001821b611ef4565b5060208310610133831016604e8410600b8410161715615dd5575081810a611ef4565b615ddf8383615cf9565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615e1157615e1161537b565b029392505050565b60006123448383615d5a56fea164736f6c634300080f000a", } // ColosseumABI is the input ABI used to generate the binding from. @@ -577,66 +577,90 @@ func (_Colosseum *ColosseumCallerSession) Challenges(arg0 *big.Int, arg1 common. return _Colosseum.Contract.Challenges(&_Colosseum.CallOpts, arg0, arg1) } -// GetChallenge is a free data retrieval call binding the contract method 0xe58932b3. +// DeletedOutputs is a free data retrieval call binding the contract method 0x5a6b011f. // -// Solidity: function getChallenge(uint256 _outputIndex, address _challenger) view returns((uint8,uint64,address,address,bytes32[],uint256,uint256)) -func (_Colosseum *ColosseumCaller) GetChallenge(opts *bind.CallOpts, _outputIndex *big.Int, _challenger common.Address) (TypesChallenge, error) { +// Solidity: function deletedOutputs(uint256 ) view returns(address submitter, bytes32 outputRoot, uint128 timestamp, uint128 l2BlockNumber) +func (_Colosseum *ColosseumCaller) DeletedOutputs(opts *bind.CallOpts, arg0 *big.Int) (struct { + Submitter common.Address + OutputRoot [32]byte + Timestamp *big.Int + L2BlockNumber *big.Int +}, error) { var out []interface{} - err := _Colosseum.contract.Call(opts, &out, "getChallenge", _outputIndex, _challenger) + err := _Colosseum.contract.Call(opts, &out, "deletedOutputs", arg0) + outstruct := new(struct { + Submitter common.Address + OutputRoot [32]byte + Timestamp *big.Int + L2BlockNumber *big.Int + }) if err != nil { - return *new(TypesChallenge), err + return *outstruct, err } - out0 := *abi.ConvertType(out[0], new(TypesChallenge)).(*TypesChallenge) + outstruct.Submitter = *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + outstruct.OutputRoot = *abi.ConvertType(out[1], new([32]byte)).(*[32]byte) + outstruct.Timestamp = *abi.ConvertType(out[2], new(*big.Int)).(**big.Int) + outstruct.L2BlockNumber = *abi.ConvertType(out[3], new(*big.Int)).(**big.Int) - return out0, err + return *outstruct, err } -// GetChallenge is a free data retrieval call binding the contract method 0xe58932b3. +// DeletedOutputs is a free data retrieval call binding the contract method 0x5a6b011f. // -// Solidity: function getChallenge(uint256 _outputIndex, address _challenger) view returns((uint8,uint64,address,address,bytes32[],uint256,uint256)) -func (_Colosseum *ColosseumSession) GetChallenge(_outputIndex *big.Int, _challenger common.Address) (TypesChallenge, error) { - return _Colosseum.Contract.GetChallenge(&_Colosseum.CallOpts, _outputIndex, _challenger) +// Solidity: function deletedOutputs(uint256 ) view returns(address submitter, bytes32 outputRoot, uint128 timestamp, uint128 l2BlockNumber) +func (_Colosseum *ColosseumSession) DeletedOutputs(arg0 *big.Int) (struct { + Submitter common.Address + OutputRoot [32]byte + Timestamp *big.Int + L2BlockNumber *big.Int +}, error) { + return _Colosseum.Contract.DeletedOutputs(&_Colosseum.CallOpts, arg0) } -// GetChallenge is a free data retrieval call binding the contract method 0xe58932b3. +// DeletedOutputs is a free data retrieval call binding the contract method 0x5a6b011f. // -// Solidity: function getChallenge(uint256 _outputIndex, address _challenger) view returns((uint8,uint64,address,address,bytes32[],uint256,uint256)) -func (_Colosseum *ColosseumCallerSession) GetChallenge(_outputIndex *big.Int, _challenger common.Address) (TypesChallenge, error) { - return _Colosseum.Contract.GetChallenge(&_Colosseum.CallOpts, _outputIndex, _challenger) +// Solidity: function deletedOutputs(uint256 ) view returns(address submitter, bytes32 outputRoot, uint128 timestamp, uint128 l2BlockNumber) +func (_Colosseum *ColosseumCallerSession) DeletedOutputs(arg0 *big.Int) (struct { + Submitter common.Address + OutputRoot [32]byte + Timestamp *big.Int + L2BlockNumber *big.Int +}, error) { + return _Colosseum.Contract.DeletedOutputs(&_Colosseum.CallOpts, arg0) } -// GetSegmentsLength is a free data retrieval call binding the contract method 0xb8b1a27c. +// GetSegments is a free data retrieval call binding the contract method 0xb3e7766d. // -// Solidity: function getSegmentsLength(uint8 _turn) view returns(uint256) -func (_Colosseum *ColosseumCaller) GetSegmentsLength(opts *bind.CallOpts, _turn uint8) (*big.Int, error) { +// Solidity: function getSegments(uint256 _outputIndex, address _challenger) view returns(bytes32[]) +func (_Colosseum *ColosseumCaller) GetSegments(opts *bind.CallOpts, _outputIndex *big.Int, _challenger common.Address) ([][32]byte, error) { var out []interface{} - err := _Colosseum.contract.Call(opts, &out, "getSegmentsLength", _turn) + err := _Colosseum.contract.Call(opts, &out, "getSegments", _outputIndex, _challenger) if err != nil { - return *new(*big.Int), err + return *new([][32]byte), err } - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + out0 := *abi.ConvertType(out[0], new([][32]byte)).(*[][32]byte) return out0, err } -// GetSegmentsLength is a free data retrieval call binding the contract method 0xb8b1a27c. +// GetSegments is a free data retrieval call binding the contract method 0xb3e7766d. // -// Solidity: function getSegmentsLength(uint8 _turn) view returns(uint256) -func (_Colosseum *ColosseumSession) GetSegmentsLength(_turn uint8) (*big.Int, error) { - return _Colosseum.Contract.GetSegmentsLength(&_Colosseum.CallOpts, _turn) +// Solidity: function getSegments(uint256 _outputIndex, address _challenger) view returns(bytes32[]) +func (_Colosseum *ColosseumSession) GetSegments(_outputIndex *big.Int, _challenger common.Address) ([][32]byte, error) { + return _Colosseum.Contract.GetSegments(&_Colosseum.CallOpts, _outputIndex, _challenger) } -// GetSegmentsLength is a free data retrieval call binding the contract method 0xb8b1a27c. +// GetSegments is a free data retrieval call binding the contract method 0xb3e7766d. // -// Solidity: function getSegmentsLength(uint8 _turn) view returns(uint256) -func (_Colosseum *ColosseumCallerSession) GetSegmentsLength(_turn uint8) (*big.Int, error) { - return _Colosseum.Contract.GetSegmentsLength(&_Colosseum.CallOpts, _turn) +// Solidity: function getSegments(uint256 _outputIndex, address _challenger) view returns(bytes32[]) +func (_Colosseum *ColosseumCallerSession) GetSegments(_outputIndex *big.Int, _challenger common.Address) ([][32]byte, error) { + return _Colosseum.Contract.GetSegments(&_Colosseum.CallOpts, _outputIndex, _challenger) } // GetStatus is a free data retrieval call binding the contract method 0xe9371a2c. @@ -670,12 +694,12 @@ func (_Colosseum *ColosseumCallerSession) GetStatus(_outputIndex *big.Int, _chal return _Colosseum.Contract.GetStatus(&_Colosseum.CallOpts, _outputIndex, _challenger) } -// IsAbleToBisect is a free data retrieval call binding the contract method 0x887c560f. +// IsInCreationPeriod is a free data retrieval call binding the contract method 0x461569b8. // -// Solidity: function isAbleToBisect(uint256 _outputIndex, address _challenger) view returns(bool) -func (_Colosseum *ColosseumCaller) IsAbleToBisect(opts *bind.CallOpts, _outputIndex *big.Int, _challenger common.Address) (bool, error) { +// Solidity: function isInCreationPeriod(uint256 _outputIndex) view returns(bool) +func (_Colosseum *ColosseumCaller) IsInCreationPeriod(opts *bind.CallOpts, _outputIndex *big.Int) (bool, error) { var out []interface{} - err := _Colosseum.contract.Call(opts, &out, "isAbleToBisect", _outputIndex, _challenger) + err := _Colosseum.contract.Call(opts, &out, "isInCreationPeriod", _outputIndex) if err != nil { return *new(bool), err @@ -687,49 +711,49 @@ func (_Colosseum *ColosseumCaller) IsAbleToBisect(opts *bind.CallOpts, _outputIn } -// IsAbleToBisect is a free data retrieval call binding the contract method 0x887c560f. +// IsInCreationPeriod is a free data retrieval call binding the contract method 0x461569b8. // -// Solidity: function isAbleToBisect(uint256 _outputIndex, address _challenger) view returns(bool) -func (_Colosseum *ColosseumSession) IsAbleToBisect(_outputIndex *big.Int, _challenger common.Address) (bool, error) { - return _Colosseum.Contract.IsAbleToBisect(&_Colosseum.CallOpts, _outputIndex, _challenger) +// Solidity: function isInCreationPeriod(uint256 _outputIndex) view returns(bool) +func (_Colosseum *ColosseumSession) IsInCreationPeriod(_outputIndex *big.Int) (bool, error) { + return _Colosseum.Contract.IsInCreationPeriod(&_Colosseum.CallOpts, _outputIndex) } -// IsAbleToBisect is a free data retrieval call binding the contract method 0x887c560f. +// IsInCreationPeriod is a free data retrieval call binding the contract method 0x461569b8. // -// Solidity: function isAbleToBisect(uint256 _outputIndex, address _challenger) view returns(bool) -func (_Colosseum *ColosseumCallerSession) IsAbleToBisect(_outputIndex *big.Int, _challenger common.Address) (bool, error) { - return _Colosseum.Contract.IsAbleToBisect(&_Colosseum.CallOpts, _outputIndex, _challenger) +// Solidity: function isInCreationPeriod(uint256 _outputIndex) view returns(bool) +func (_Colosseum *ColosseumCallerSession) IsInCreationPeriod(_outputIndex *big.Int) (bool, error) { + return _Colosseum.Contract.IsInCreationPeriod(&_Colosseum.CallOpts, _outputIndex) } -// IsInCreationPeriod is a free data retrieval call binding the contract method 0x461569b8. +// SegmentsLengths is a free data retrieval call binding the contract method 0x8f86c803. // -// Solidity: function isInCreationPeriod(uint256 _outputIndex) view returns(bool) -func (_Colosseum *ColosseumCaller) IsInCreationPeriod(opts *bind.CallOpts, _outputIndex *big.Int) (bool, error) { +// Solidity: function segmentsLengths(uint256 ) view returns(uint256) +func (_Colosseum *ColosseumCaller) SegmentsLengths(opts *bind.CallOpts, arg0 *big.Int) (*big.Int, error) { var out []interface{} - err := _Colosseum.contract.Call(opts, &out, "isInCreationPeriod", _outputIndex) + err := _Colosseum.contract.Call(opts, &out, "segmentsLengths", arg0) if err != nil { - return *new(bool), err + return *new(*big.Int), err } - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) return out0, err } -// IsInCreationPeriod is a free data retrieval call binding the contract method 0x461569b8. +// SegmentsLengths is a free data retrieval call binding the contract method 0x8f86c803. // -// Solidity: function isInCreationPeriod(uint256 _outputIndex) view returns(bool) -func (_Colosseum *ColosseumSession) IsInCreationPeriod(_outputIndex *big.Int) (bool, error) { - return _Colosseum.Contract.IsInCreationPeriod(&_Colosseum.CallOpts, _outputIndex) +// Solidity: function segmentsLengths(uint256 ) view returns(uint256) +func (_Colosseum *ColosseumSession) SegmentsLengths(arg0 *big.Int) (*big.Int, error) { + return _Colosseum.Contract.SegmentsLengths(&_Colosseum.CallOpts, arg0) } -// IsInCreationPeriod is a free data retrieval call binding the contract method 0x461569b8. +// SegmentsLengths is a free data retrieval call binding the contract method 0x8f86c803. // -// Solidity: function isInCreationPeriod(uint256 _outputIndex) view returns(bool) -func (_Colosseum *ColosseumCallerSession) IsInCreationPeriod(_outputIndex *big.Int) (bool, error) { - return _Colosseum.Contract.IsInCreationPeriod(&_Colosseum.CallOpts, _outputIndex) +// Solidity: function segmentsLengths(uint256 ) view returns(uint256) +func (_Colosseum *ColosseumCallerSession) SegmentsLengths(arg0 *big.Int) (*big.Int, error) { + return _Colosseum.Contract.SegmentsLengths(&_Colosseum.CallOpts, arg0) } // VerifiedPublicInputs is a free data retrieval call binding the contract method 0x1be4e27e. @@ -1876,6 +1900,160 @@ func (_Colosseum *ColosseumFilterer) ParseInitialized(log types.Log) (*Colosseum return event, nil } +// ColosseumOutputForceDeletedIterator is returned from FilterOutputForceDeleted and is used to iterate over the raw logs and unpacked data for OutputForceDeleted events raised by the Colosseum contract. +type ColosseumOutputForceDeletedIterator struct { + Event *ColosseumOutputForceDeleted // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ColosseumOutputForceDeletedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ColosseumOutputForceDeleted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ColosseumOutputForceDeleted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ColosseumOutputForceDeletedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ColosseumOutputForceDeletedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ColosseumOutputForceDeleted represents a OutputForceDeleted event raised by the Colosseum contract. +type ColosseumOutputForceDeleted struct { + OutputIndex *big.Int + Asseter common.Address + Timestamp *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOutputForceDeleted is a free log retrieval operation binding the contract event 0xa620f04b65b1d538481626bf41dc5ee321b5c48e0cc1a7daae213cf7c254b54e. +// +// Solidity: event OutputForceDeleted(uint256 indexed outputIndex, address indexed asseter, uint256 timestamp) +func (_Colosseum *ColosseumFilterer) FilterOutputForceDeleted(opts *bind.FilterOpts, outputIndex []*big.Int, asseter []common.Address) (*ColosseumOutputForceDeletedIterator, error) { + + var outputIndexRule []interface{} + for _, outputIndexItem := range outputIndex { + outputIndexRule = append(outputIndexRule, outputIndexItem) + } + var asseterRule []interface{} + for _, asseterItem := range asseter { + asseterRule = append(asseterRule, asseterItem) + } + + logs, sub, err := _Colosseum.contract.FilterLogs(opts, "OutputForceDeleted", outputIndexRule, asseterRule) + if err != nil { + return nil, err + } + return &ColosseumOutputForceDeletedIterator{contract: _Colosseum.contract, event: "OutputForceDeleted", logs: logs, sub: sub}, nil +} + +// WatchOutputForceDeleted is a free log subscription operation binding the contract event 0xa620f04b65b1d538481626bf41dc5ee321b5c48e0cc1a7daae213cf7c254b54e. +// +// Solidity: event OutputForceDeleted(uint256 indexed outputIndex, address indexed asseter, uint256 timestamp) +func (_Colosseum *ColosseumFilterer) WatchOutputForceDeleted(opts *bind.WatchOpts, sink chan<- *ColosseumOutputForceDeleted, outputIndex []*big.Int, asseter []common.Address) (event.Subscription, error) { + + var outputIndexRule []interface{} + for _, outputIndexItem := range outputIndex { + outputIndexRule = append(outputIndexRule, outputIndexItem) + } + var asseterRule []interface{} + for _, asseterItem := range asseter { + asseterRule = append(asseterRule, asseterItem) + } + + logs, sub, err := _Colosseum.contract.WatchLogs(opts, "OutputForceDeleted", outputIndexRule, asseterRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ColosseumOutputForceDeleted) + if err := _Colosseum.contract.UnpackLog(event, "OutputForceDeleted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOutputForceDeleted is a log parse operation binding the contract event 0xa620f04b65b1d538481626bf41dc5ee321b5c48e0cc1a7daae213cf7c254b54e. +// +// Solidity: event OutputForceDeleted(uint256 indexed outputIndex, address indexed asseter, uint256 timestamp) +func (_Colosseum *ColosseumFilterer) ParseOutputForceDeleted(log types.Log) (*ColosseumOutputForceDeleted, error) { + event := new(ColosseumOutputForceDeleted) + if err := _Colosseum.contract.UnpackLog(event, "OutputForceDeleted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // ColosseumProvenIterator is returned from FilterProven and is used to iterate over the raw logs and unpacked data for Proven events raised by the Colosseum contract. type ColosseumProvenIterator struct { Event *ColosseumProven // Event containing the contract specifics and raw log diff --git a/kroma-bindings/bindings/colosseum_more.go b/kroma-bindings/bindings/colosseum_more.go index c03ff55f27..27445e9572 100644 --- a/kroma-bindings/bindings/colosseum_more.go +++ b/kroma-bindings/bindings/colosseum_more.go @@ -9,11 +9,11 @@ import ( "github.com/ethereum-optimism/optimism/op-bindings/solc" ) -const ColosseumStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/L1/Colosseum.sol:Colosseum\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"contracts/L1/Colosseum.sol:Colosseum\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"contracts/L1/Colosseum.sol:Colosseum\",\"label\":\"segmentsLengths\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_mapping(t_uint256,t_uint256)\"},{\"astId\":1003,\"contract\":\"contracts/L1/Colosseum.sol:Colosseum\",\"label\":\"challenges\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_mapping(t_uint256,t_mapping(t_address,t_struct(Challenge)1005_storage))\"},{\"astId\":1004,\"contract\":\"contracts/L1/Colosseum.sol:Colosseum\",\"label\":\"verifiedPublicInputs\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_mapping(t_bytes32,t_bool)\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_bytes32)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"bytes32[]\",\"numberOfBytes\":\"32\",\"base\":\"t_bytes32\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_address,t_struct(Challenge)1005_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e struct Types.Challenge)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_struct(Challenge)1005_storage\"},\"t_mapping(t_bytes32,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_bool\"},\"t_mapping(t_uint256,t_mapping(t_address,t_struct(Challenge)1005_storage))\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e mapping(address =\u003e struct Types.Challenge))\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_mapping(t_address,t_struct(Challenge)1005_storage)\"},\"t_mapping(t_uint256,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_uint256\"},\"t_struct(Challenge)1005_storage\":{\"encoding\":\"inplace\",\"label\":\"struct Types.Challenge\",\"numberOfBytes\":\"160\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint64\":{\"encoding\":\"inplace\",\"label\":\"uint64\",\"numberOfBytes\":\"8\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" +const ColosseumStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/L1/Colosseum.sol:Colosseum\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"contracts/L1/Colosseum.sol:Colosseum\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"contracts/L1/Colosseum.sol:Colosseum\",\"label\":\"segmentsLengths\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_mapping(t_uint256,t_uint256)\"},{\"astId\":1003,\"contract\":\"contracts/L1/Colosseum.sol:Colosseum\",\"label\":\"challenges\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_mapping(t_uint256,t_mapping(t_address,t_struct(Challenge)1006_storage))\"},{\"astId\":1004,\"contract\":\"contracts/L1/Colosseum.sol:Colosseum\",\"label\":\"verifiedPublicInputs\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1005,\"contract\":\"contracts/L1/Colosseum.sol:Colosseum\",\"label\":\"deletedOutputs\",\"offset\":0,\"slot\":\"4\",\"type\":\"t_mapping(t_uint256,t_struct(CheckpointOutput)1007_storage)\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_bytes32)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"bytes32[]\",\"numberOfBytes\":\"32\",\"base\":\"t_bytes32\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_address,t_struct(Challenge)1006_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e struct Types.Challenge)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_struct(Challenge)1006_storage\"},\"t_mapping(t_bytes32,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_bool\"},\"t_mapping(t_uint256,t_mapping(t_address,t_struct(Challenge)1006_storage))\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e mapping(address =\u003e struct Types.Challenge))\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_mapping(t_address,t_struct(Challenge)1006_storage)\"},\"t_mapping(t_uint256,t_struct(CheckpointOutput)1007_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e struct Types.CheckpointOutput)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_struct(CheckpointOutput)1007_storage\"},\"t_mapping(t_uint256,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_uint256\"},\"t_struct(Challenge)1006_storage\":{\"encoding\":\"inplace\",\"label\":\"struct Types.Challenge\",\"numberOfBytes\":\"160\"},\"t_struct(CheckpointOutput)1007_storage\":{\"encoding\":\"inplace\",\"label\":\"struct Types.CheckpointOutput\",\"numberOfBytes\":\"96\"},\"t_uint128\":{\"encoding\":\"inplace\",\"label\":\"uint128\",\"numberOfBytes\":\"16\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint64\":{\"encoding\":\"inplace\",\"label\":\"uint64\",\"numberOfBytes\":\"8\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" var ColosseumStorageLayout = new(solc.StorageLayout) -var ColosseumDeployedBin = "0x608060405234801561001057600080fd5b50600436106101ad5760003560e01c8063887c560f116100ee578063cfb4474d11610097578063e39a219c11610071578063e39a219c1461053f578063e58932b314610552578063e9371a2c14610572578063fc9d84df1461059257600080fd5b8063cfb4474d146104ca578063d2ee3075146104f1578063d5145ebc1461051857600080fd5b8063a41483e3116100c8578063a41483e314610491578063a6ade11f146104a4578063b8b1a27c146104b757600080fd5b8063887c560f146104305780638f3a6c88146104435780639ded39521461046a57600080fd5b8063461569b81161015b5780635865b607116101355780635865b607146103d057806362fc00db146103f75780636fe0e5591461040a57806380ab13131461041d57600080fd5b8063461569b81461034d5780635375b8911461036057806354fd4d501461038757600080fd5b80632df27fa51161018c5780632df27fa51461023e57806336086417146102f15780634394c5841461031857600080fd5b80621c2ff6146101b25780631be4e27e146101f65780631db1b67214610229575b600080fd5b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b610219610204366004614878565b60036020526000908152604090205460ff1681565b60405190151581526020016101ed565b61023c6102373660046148a6565b6105a5565b005b6102aa61024c3660046148a6565b6002602090815260009283526040808420909152908252902080546001820154600383015460049093015460ff83169367ffffffffffffffff610100850416936001600160a01b036901000000000000000000909104811693169186565b6040805160ff909716875267ffffffffffffffff90951660208701526001600160a01b039384169486019490945291166060840152608083015260a082015260c0016101ed565b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016101ed565b61021961035b366004614878565b61066f565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b6103c36040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516101ed919061492e565b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b61023c610405366004614941565b610764565b61023c610418366004614a65565b610ab2565b61023c61042b366004614b47565b610c2c565b61021961043e3660046148a6565b61159b565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b61023c61049f366004614878565b6115d0565b61023c6104b2366004614bf8565b61170d565b61033f6104c5366004614c62565b611b31565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b61023c61054d366004614878565b611bae565b6105656105603660046148a6565b611f70565b6040516101ed9190614c85565b6105856105803660046148a6565b61207d565b6040516101ed9190614d64565b61023c6105a0366004614da5565b6120a8565b60008281526002602090815260408083206001600160a01b03851684529091528120906105d182612a0f565b905060038160058111156105e7576105e7614d35565b1461065f5760405162461bcd60e51b815260206004820152603c60248201527f436f6c6f737365756d3a2063616e206f6e6c792062652063616c6c656420696660448201527f20746865206368616c6c656e67657220697320696e2074696d6f75740000000060648201526084015b60405180910390fd5b6106698484612aec565b50505050565b6040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810182905260009081906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a25ae55790602401608060405180830381865afa1580156106f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107169190614e09565b9050427f000000000000000000000000000000000000000000000000000000000000000082604001516fffffffffffffffffffffffffffffffff1661075b9190614eb0565b10159392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108025760405162461bcd60e51b815260206004820152602d60248201527f436f6c6f737365756d3a2073656e646572206973206e6f74207468652073656360448201527f757269747920636f756e63696c000000000000000000000000000000000000006064820152608401610656565b816108755760405162461bcd60e51b815260206004820152602e60248201527f436f6c6f737365756d3a2063616e6e6f7420726f6c6c6261636b206f7574707560448201527f7420746f207a65726f20686173680000000000000000000000000000000000006064820152608401610656565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018690526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa1580156108f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091a9190614e09565b60200151146109915760405162461bcd60e51b815260206004820152603b60248201527f436f6c6f737365756d3a206f6e6c792063616e20726f6c6c6261636b2069662060448201527f746865206f757470757420686173206265656e2064656c6574656400000000006064820152608401610656565b6000818152600360205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517fe664672300000000000000000000000000000000000000000000000000000000815260048101869052602481018390526001600160a01b0384811660448301527f0000000000000000000000000000000000000000000000000000000000000000169063e664672390606401600060405180830381600087803b158015610a4f57600080fd5b505af1158015610a63573d6000803e3d6000fd5b50505050836001600160a01b0316857fdca9fa9b51a5ba03938c6a0cd5489011630370fc481ef2b0cb771ad904a7305342604051610aa391815260200190565b60405180910390a35050505050565b600054610100900460ff1615808015610ad25750600054600160ff909116105b80610aec5750303b158015610aec575060005460ff166001145b610b5e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610656565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610bbc57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610bc582612ee5565b8015610c2857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6040517f33727c4d0000000000000000000000000000000000000000000000000000000081526004810188905287907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190614ec8565b15610d695760405162461bcd60e51b815260206004820152604b60248201527f436f6c6f737365756d3a2063616e6e6f742070726f6772657373206368616c6c60448201527f656e67652070726f636573732061626f757420616c72656164792066696e616c60648201527f697a6564206f7574707574000000000000000000000000000000000000000000608482015260a401610656565b6000888152600260209081526040808320338452909152812090610d8c82612a0f565b6001830154909150610da9908b906001600160a01b031683613075565b15610db5575050611591565b6005816005811115610dc957610dc9614d35565b1480610de657506004816005811115610de457610de4614d35565b145b610e585760405162461bcd60e51b815260206004820152603a60248201527f436f6c6f737365756d3a20696d706f737369626c6520746f2070726f7665207460448201527f6865206661756c7420696e2063757272656e74207374617475730000000000006064820152608401610656565b6000610e71610e6c368b90038b018b614eea565b613406565b90506000610e8a610e6c368c90038c0160a08d01614eea565b9050610e9d8b8584848e60a081016134db565b610ec68a60a08101610eb3610140830183614f5a565b610ec16101608f018f614f98565b613697565b610ef8610ed76101c08c018c614fcc565b8c61018001358d6101a001358e60a001604001358f60a001602001356137db565b6000610f1560208c0135610f106101408e018e614f5a565b61394b565b60008181526003602052604090205490915060ff1615610fc35760405162461bcd60e51b815260206004820152604c60248201527f436f6c6f737365756d3a207075626c696320696e70757420746861742068617360448201527f20616c7265616479206265656e2076616c6964617465642063616e6e6f74206260648201527f65207573656420616761696e0000000000000000000000000000000000000000608482015260a401610656565b6040517f4292dc3e0000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634292dc3e90611030908d908d908d908d908890600401615083565b602060405180830381865afa15801561104d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110719190614ec8565b6110bd5760405162461bcd60e51b815260206004820152601860248201527f436f6c6f737365756d3a20696e76616c69642070726f6f6600000000000000006044820152606401610656565b60405142815233908e907f0431864ed2609170587bbc7c198abd8caee4c55943dfb16fd42ec6f59c91c5f79060200160405180910390a36040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018e90526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a25ae55790602401608060405180830381865afa158015611175573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111999190614e09565b905060006362fc00db60e01b8f338960000160099054906101000a90046001600160a01b03168560200151876040516024016112039594939291909485526001600160a01b0393841660208601529190921660408401526060830191909152608082015260a00190565b60408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009095169490941790935291840151606085015192517f080b91ee0000000000000000000000000000000000000000000000000000000081529193506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263080b91ee926112d592919086906004016150bd565b600060405180830381600087803b1580156112ef57600080fd5b505af1158015611303573d6000803e3d6000fd5b50505050505060016003600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600260008e81526020019081526020016000206000336001600160a01b03166001600160a01b03168152602001908152602001600020600080820160006101000a81549060ff02191690556000820160016101000a81549067ffffffffffffffff02191690556000820160096101000a8154906001600160a01b0302191690556001820160006101000a8154906001600160a01b0302191690556002820160006113df91906147fa565b5060006003820181905560049182018190556040517fe66467230000000000000000000000000000000000000000000000000000000081529182018f905260248201523360448201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e664672390606401600060405180830381600087803b15801561147657600080fd5b505af115801561148a573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151091906150f7565b6040517fdd215c5d000000000000000000000000000000000000000000000000000000008152600481018f90523360248201526001600160a01b03919091169063dd215c5d90604401600060405180830381600087803b15801561157357600080fd5b505af1158015611587573d6000803e3d6000fd5b5050505050505050505b5050505050505050565b60008281526002602090815260408083206001600160a01b038516845290915281206115c6816139fe565b9150505b92915050565b60008181526002602090815260408083203384529091528120906115f382612a0f565b9050600081600581111561160957611609614d35565b0361167c5760405162461bcd60e51b815260206004820152602760248201527f436f6c6f737365756d3a20746865206368616c6c656e676520646f6573206e6f60448201527f74206578697374000000000000000000000000000000000000000000000000006064820152608401610656565b60018201546116969084906001600160a01b031683613075565b6117085760405162461bcd60e51b815260206004820152602860248201527f436f6c6f737365756d3a206368616c6c656e67652063616e6e6f74206265206360448201527f616e63656c6c65640000000000000000000000000000000000000000000000006064820152608401610656565b505050565b6040517f33727c4d0000000000000000000000000000000000000000000000000000000081526004810186905285907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa15801561178d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b19190614ec8565b1561184a5760405162461bcd60e51b815260206004820152604b60248201527f436f6c6f737365756d3a2063616e6e6f742070726f6772657373206368616c6c60448201527f656e67652070726f636573732061626f757420616c72656164792066696e616c60648201527f697a6564206f7574707574000000000000000000000000000000000000000000608482015260a401610656565b60008681526002602090815260408083206001600160a01b038916845290915281209061187682612a0f565b60018301549091506118939089906001600160a01b031683613075565b1561189f575050611b29565b600060018260058111156118b5576118b5614d35565b036118ce575060018201546001600160a01b0316611901565b60028260058111156118e2576118e2614d35565b0361190157508154690100000000000000000090046001600160a01b03165b336001600160a01b038216146119595760405162461bcd60e51b815260206004820152601860248201527f436f6c6f737365756d3a206e6f7420796f7572207475726e00000000000000006044820152606401610656565b825460009061196c9060ff166001615114565b90506119f781856002018a8154811061198757611987615139565b9060005260206000200154866002018b60016119a39190614eb0565b815481106119b3576119b3615139565b90600052602060002001548a8a80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613a1292505050565b6000611a0285613bb8565b90506000611a10828b615168565b8660040154611a1f9190614eb0565b9050611a62868a8a80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250879150613be49050565b85547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8416178655611a9686613c0e565b6040805160ff851681524260208201526001600160a01b038d16918e917fcadef6622777415b0589e491bdbf6baf11242f676f77055fd03bf1658c17a145910160405180910390a3611ae7866139fe565b611b22576040516001600160a01b038c16908d907f5c4528cbb38a169d24837617d3fd3d5c70a47769a4e9af6f384720b359b716c890600090a35b5050505050505b505050505050565b6000600160ff83161015611b875760405162461bcd60e51b815260206004820152601760248201527f436f6c6f737365756d3a20696e76616c6964207475726e0000000000000000006044820152606401610656565b60016000611b9582856151a5565b60ff168152602001908152602001600020549050919050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611c4c5760405162461bcd60e51b815260206004820152602d60248201527f436f6c6f737365756d3a2073656e646572206973206e6f74207468652073656360448201527f757269747920636f756e63696c000000000000000000000000000000000000006064820152608401610656565b6040517f33727c4d0000000000000000000000000000000000000000000000000000000081526004810182905281907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa158015611ccc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf09190614ec8565b15611d895760405162461bcd60e51b815260206004820152604b60248201527f436f6c6f737365756d3a2063616e6e6f742070726f6772657373206368616c6c60448201527f656e67652070726f636573732061626f757420616c72656164792066696e616c60648201527f697a6564206f7574707574000000000000000000000000000000000000000000608482015260a401610656565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa158015611e0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2e9190614e09565b6020810151909150611ea85760405162461bcd60e51b815260206004820152602e60248201527f436f6c6f737365756d3a20746865206f75747075742068617320616c7265616460448201527f79206265656e2064656c657465640000000000000000000000000000000000006064820152608401610656565b6040517fe664672300000000000000000000000000000000000000000000000000000000815260048101849052600060248201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660448301527f0000000000000000000000000000000000000000000000000000000000000000169063e6646723906064015b600060405180830381600087803b158015611f5357600080fd5b505af1158015611f67573d6000803e3d6000fd5b50505050505050565b6040805160e0810182526000808252602082018190529181018290526060808201839052608082015260a0810182905260c081019190915260008381526002602081815260408084206001600160a01b03808816865290835293819020815160e081018352815460ff8116825267ffffffffffffffff6101008204168286015269010000000000000000009004861681840152600182015490951660608601529283018054825181850281018501909352808352608086019383018282801561205857602002820191906000526020600020905b815481526020019060010190808311612044575b5050505050815260200160038201548152602001600482015481525050905092915050565b60008281526002602090815260408083206001600160a01b038516845290915281206115c681612a0f565b6040517f33727c4d0000000000000000000000000000000000000000000000000000000081526004810186905285907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa158015612128573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214c9190614ec8565b156121e55760405162461bcd60e51b815260206004820152604b60248201527f436f6c6f737365756d3a2063616e6e6f742070726f6772657373206368616c6c60448201527f656e67652070726f636573732061626f757420616c72656164792066696e616c60648201527f697a6564206f7574707574000000000000000000000000000000000000000000608482015260a401610656565b6000861161225b5760405162461bcd60e51b815260206004820152603660248201527f436f6c6f737365756d3a206368616c6c656e676520666f722067656e6573697360448201527f206f7574707574206973206e6f7420616c6c6f776564000000000000000000006064820152608401610656565b600086815260026020908152604080832033845290915290208054600160ff9091161061234857600061228d82612a0f565b905060038160058111156122a3576122a3614d35565b1461233c5760405162461bcd60e51b815260206004820152604660248201527f436f6c6f737365756d3a20746865206368616c6c656e676520666f722067697660448201527f656e206f757470757420696e64657820697320616c726561647920696e20707260648201527f6f67726573730000000000000000000000000000000000000000000000000000608482015260a401610656565b6123468833612aec565b505b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018890526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa1580156123c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ed9190614e09565b9050427f000000000000000000000000000000000000000000000000000000000000000082604001516fffffffffffffffffffffffffffffffff166124329190614eb0565b10156124a65760405162461bcd60e51b815260206004820152603e60248201527f436f6c6f737365756d3a2063616e6e6f74206372656174652061206368616c6c60448201527f656e676520616674657220746865206372656174696f6e20706572696f6400006064820152608401610656565b602081015161251d5760405162461bcd60e51b815260206004820152603660248201527f436f6c6f737365756d3a206368616c6c656e676520666f722064656c6574656460448201527f206f7574707574206973206e6f7420616c6c6f776564000000000000000000006064820152608401610656565b80516001600160a01b0316330361259c5760405162461bcd60e51b815260206004820152603860248201527f436f6c6f737365756d3a2074686520617373657274657220616e64206368616c60448201527f6c656e676572206d75737420626520646966666572656e7400000000000000006064820152608401610656565b86158015906125ab5750854015155b1561264d578686401461264d5760405162461bcd60e51b8152602060048201526044602482018190527f436f6c6f737365756d3a20626c6f636b206861736820646f6573206e6f74206d908201527f617463682074686520686173682061742074686520657870656374656420686560648201527f6967687400000000000000000000000000000000000000000000000000000000608482015260a401610656565b60006001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a25ae55761268960018c6151c8565b6040518263ffffffff1660e01b81526004016126a791815260200190565b608060405180830381865afa1580156126c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e89190614e09565b60208101519091506127565761275160018787600081811061270c5761270c615139565b905060200201358460200151898980806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613a1292505050565b61279e565b61279e600182602001518460200151898980806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613a1292505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061282091906150f7565b6040517f5a544742000000000000000000000000000000000000000000000000000000008152600481018b90523360248201526001600160a01b039190911690635a54474290604401600060405180830381600087803b15801561288357600080fd5b505af1158015612897573d6000803e3d6000fd5b5050505061293a838787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505050606086015161291491507f0000000000000000000000000000000000000000000000000000000000000000906fffffffffffffffffffffffffffffffff166151c8565b7f0000000000000000000000000000000000000000000000000000000000000000613be4565b825482516001600160a01b03166901000000000000000000027fffffff0000000000000000000000000000000000000000ffffffffffffffff009091161760019081178455830180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790556129b283613c0e565b815160405142815233916001600160a01b0316908b907fd2f7931a802085b3d0234d4c320ce7ee0041da96678ce2bf5c93e8d3d7e65f529060200160405180910390a4505050505050505050565b6001600160a01b03163b151590565b8054600090600160ff9091161015612a2957506000919050565b8154600090612a3a9060ff16613caf565b8354909150610100900467ffffffffffffffff16421115612ac0578015612a645750600392915050565b8254612aa990612aa4907f000000000000000000000000000000000000000000000000000000000000000090610100900467ffffffffffffffff16614eb0565b421190565b15612ab75750600392915050565b50600492915050565b612ac9836139fe565b612ad65750600592915050565b80612ae2576002612ae5565b60015b9392505050565b60008281526002602081815260408084206001600160a01b0386168552909152822080547fffffff00000000000000000000000000000000000000000000000000000000001681556001810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690559190612b6c908301826147fa565b600382016000905560048201600090555050806001600160a01b0316827fbf4506ef5d06ecb6168f37bc9e69dd473089eb9e3f2675322d01b4d466cff05142604051612bba91815260200190565b60405180910390a36040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa158015612c40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c649190614ec8565b15612dea576040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa158015612cea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d0e9190614e09565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d9291906150f7565b81516040517f36b83469000000000000000000000000000000000000000000000000000000008152600481018690526001600160a01b03858116602483015291821660448201529116906336b8346990606401611f39565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e6c91906150f7565b6040517fdd215c5d000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b038381166024830152919091169063dd215c5d90604401600060405180830381600087803b158015612ed157600080fd5b505af1158015611b29573d6000803e3d6000fd5b60028151612ef3919061520e565b15612f665760405162461bcd60e51b815260206004820152603a60248201527f436f6c6f737365756d3a206c656e677468206f66207365676d656e7473206c6560448201527f6e677468732063616e6e6f74206265206f6464206e756d6265720000000000006064820152608401610656565b600160005b8251811015612fdf57828181518110612f8657612f86615139565b602002602001015160016000838152602001908152602001600020819055506001838281518110612fb957612fb9615139565b6020026020010151612fcb91906151c8565b612fd59083615168565b9150600101612f6b565b507f00000000000000000000000000000000000000000000000000000000000000008114610c285760405162461bcd60e51b815260206004820152602360248201527f436f6c6f737365756d3a20696e76616c6964207365676d656e7473206c656e6760448201527f74687300000000000000000000000000000000000000000000000000000000006064820152608401610656565b6040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810184905260009081906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a25ae55790602401608060405180830381865afa1580156130f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061311c9190614e09565b6020015190508015613132576000915050612ae5565b336001600160a01b038516146131b05760405162461bcd60e51b815260206004820152602560248201527f436f6c6f737365756d3a2073656e646572206973206e6f742061206368616c6c60448201527f656e6765720000000000000000000000000000000000000000000000000000006064820152608401610656565b60038360058111156131c4576131c4614d35565b03613239576040805162461bcd60e51b81526020600482015260248101919091527f436f6c6f737365756d3a206368616c6c656e67652063616e6e6f74206265206360448201527f616e63656c6c6564206966206368616c6c656e6765722074696d6564206f75746064820152608401610656565b6000858152600260208181526040808420338552909152822080547fffffff00000000000000000000000000000000000000000000000000000000001681556001810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905591906132b0908301826147fa565b50600060038201819055600490910155604051428152339086907f6f3468a095154788e69ed719ee418416c1e338ac2348ccb3531bb97a0ed6ed9d9060200160405180910390a37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613355573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061337991906150f7565b6040517f36b8346900000000000000000000000000000000000000000000000000000000815260048101879052336024820181905260448201526001600160a01b0391909116906336b8346990606401600060405180830381600087803b1580156133e357600080fd5b505af11580156133f7573d6000803e3d6000fd5b50600198975050505050505050565b80516000906134685781516020808401516040808601516060808801516080808a0151855180890199909952888601969096529187019290925285015260a0808501929092528051808503909201825260c090930190925281519101206115ca565b60405162461bcd60e51b815260206004820152602a60248201527f48617368696e673a20756e6b6e6f776e206f757470757420726f6f742070726f60448201527f6f662076657273696f6e000000000000000000000000000000000000000000006064820152608401610656565b919050565b838560020187815481106134f1576134f1615139565b90600052602060002001541461356f5760405162461bcd60e51b815260206004820152602d60248201527f436f6c6f737365756d3a2074686520736f75726365207365676d656e74206d7560448201527f7374206265206d617463686564000000000000000000000000000000000000006064820152608401610656565b613578856139fe565b61361a57826002860161358c886001614eb0565b8154811061359c5761359c615139565b90600052602060002001540361361a5760405162461bcd60e51b815260206004820152603660248201527f436f6c6f737365756d3a207468652064657374696e6174696f6e207365676d6560448201527f6e74206d757374206e6f74206265206d617463686564000000000000000000006064820152608401610656565b8060600135826080013514611b295760405162461bcd60e51b815260206004820152602960248201527f436f6c6f737365756d3a2074686520626c6f636b2068617368206d757374206260448201527f65206d61746368656400000000000000000000000000000000000000000000006064820152608401610656565b82602001358260e00135146137145760405162461bcd60e51b815260206004820152602960248201527f436f6c6f737365756d3a2074686520737461746520726f6f74206d757374206260448201527f65206d61746368656400000000000000000000000000000000000000000000006064820152608401610656565b600061018083013561373f5761373a61372c846152a0565b613735846153fa565b613cc6565b613759565b61375961374b846152a0565b613754846153fa565b613d6a565b9050808560800135146137d45760405162461bcd60e51b815260206004820152603b60248201527f436f6c6f737365756d3a2074686520626c6f636b20686173682066726f6d207060448201527f75626c696320696e707574206d757374206265206d61746368656400000000006064820152608401610656565b5050505050565b60408051600060208201528082018690526060810185905260808082018590528251808303909101815260a08201928390527f12e64a72000000000000000000000000000000000000000000000000000000009092527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906312e64a7290613898907f42000000000000000000000000000000000000030000000000000000000000009085908c908c90899060a40161559b565b602060405180830381865afa1580156138b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138d99190614ec8565b611f675760405162461bcd60e51b815260206004820152603660248201527f436f6c6f737365756d3a20696e76616c6964204c32546f4c314d65737361676560448201527f50617373657220696e636c7573696f6e2070726f6f66000000000000000000006064820152608401610656565b600060607f000000000000000000000000000000000000000000000000000000000000000061397e610120850185614fcc565b905010156139eb576139e87f00000000000000000000000000000000000000000000000000000000000000006139b8610120860186614fcc565b6139e391507f00000000000000000000000000000000000000000000000000000000000000006151c8565b613e7b565b90505b6115c6846139f8856152a0565b83613f07565b60006001613a0b83613bb8565b1192915050565b805180613a1e86611b31565b14613a915760405162461bcd60e51b815260206004820152602260248201527f436f6c6f737365756d3a20696e76616c6964207365676d656e7473206c656e6760448201527f74680000000000000000000000000000000000000000000000000000000000006064820152608401610656565b81600081518110613aa457613aa4615139565b60200260200101518414613b205760405162461bcd60e51b815260206004820152602c60248201527f436f6c6f737365756d3a20746865206669727374207365676d656e74206d757360448201527f74206265206d61746368656400000000000000000000000000000000000000006064820152608401610656565b81613b2c6001836151c8565b81518110613b3c57613b3c615139565b602002602001015183036137d45760405162461bcd60e51b815260206004820152602f60248201527f436f6c6f737365756d3a20746865206c617374207365676d656e74206d75737460448201527f206e6f74206265206d61746368656400000000000000000000000000000000006064820152608401610656565b805460009060ff166001613bcb82611b31565b613bd591906151c8565b8360030154612ae59190615676565b8251613bf99060028601906020860190614818565b50600484019190915560039092019190915550565b613c17816139fe565b613c8257613c457f000000000000000000000000000000000000000000000000000000000000000042614eb0565b815467ffffffffffffffff91909116610100027fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff90911617815550565b613c457f000000000000000000000000000000000000000000000000000000000000000042614eb0565b50565b6000613cbc60028361568a565b60ff161592915050565b6040805160118082526102408201909252600091829190816020015b6060815260200190600190039081613ce2579050509050613d04848483613f79565b613d33846101000151604051602001613d1f91815260200190565b60405160208183030381529060405261422c565b81601081518110613d4657613d46615139565b6020026020010181905250613d5a8161429b565b8051906020012091505092915050565b6040805160148082526102a08201909252600091829190816020015b6060815260200190600190039081613d86579050509050613da8848483613f79565b613dc3846101000151604051602001613d1f91815260200190565b81601081518110613dd657613dd6615139565b6020026020010181905250613df984610140015167ffffffffffffffff166142df565b81601181518110613e0c57613e0c615139565b6020026020010181905250613e2f84610160015167ffffffffffffffff166142df565b81601281518110613e4257613e42615139565b6020026020010181905250613e68846101800151604051602001613d1f91815260200190565b81601381518110613d4657613d46615139565b606060008267ffffffffffffffff811115613e9857613e98614993565b604051908082528060200260200182016040528015613ec1578160200160208202803683370190505b50905060005b83811015613eff5784828281518110613ee257613ee2615139565b602090810291909101015280613ef7816156ac565b915050613ec7565b509392505050565b6000838360e001516000801b85600001518660200151876060015188604001518960a001518a608001518b6101200151518c61012001518c604051602001613f5a9c9b9a99989796959493929190615717565b6040516020818303038152906040528051906020012090509392505050565b613f938360200151604051602001613d1f91815260200190565b81600081518110613fa657613fa6615139565b6020026020010181905250816000015181600181518110613fc957613fc9615139565b6020026020010181905250816020015181600281518110613fec57613fec615139565b60200260200101819052506140118360e00151604051602001613d1f91815260200190565b8160038151811061402457614024615139565b60200260200101819052506140498360c00151604051602001613d1f91815260200190565b8160048151811061405c5761405c615139565b602002602001018190525081604001518160058151811061407f5761407f615139565b60200260200101819052508160600151816006815181106140a2576140a2615139565b60200260200101819052508160800151816007815181106140c5576140c5615139565b60200260200101819052506140e7836060015167ffffffffffffffff166142df565b816008815181106140fa576140fa615139565b602002602001018190525061411c836080015167ffffffffffffffff166142df565b8160098151811061412f5761412f615139565b60200260200101819052508160a0015181600a8151811061415257614152615139565b6020026020010181905250614174836040015167ffffffffffffffff166142df565b81600b8151811061418757614187615139565b60200260200101819052508160c0015181600c815181106141aa576141aa615139565b60200260200101819052508160e0015181600d815181106141cd576141cd615139565b602002602001018190525081610100015181600e815181106141f1576141f1615139565b60200260200101819052506142098360a001516142df565b81600f8151811061421c5761421c615139565b6020026020010181905250505050565b6060808251600114801561425a575060808360008151811061425057614250615139565b016020015160f81c105b156142665750816115ca565b614272835160806142f2565b836040516020016142849291906157d0565b604051602081830303815290604052905092915050565b606060006142a8836144e8565b90506142b6815160c06142f2565b816040516020016142c89291906157d0565b604051602081830303815290604052915050919050565b60606115ca6142ed83614620565b61422c565b606080603884101561437157604080516001808252818301909252906020820181803683370190505090506143278385615114565b60f81b8160008151811061433d5761433d615139565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612ae5565b600060015b6143808187615676565b156143a6578161438f816156ac565b925061439f905061010082615168565b9050614376565b6143b1826001614eb0565b67ffffffffffffffff8111156143c9576143c9614993565b6040519080825280601f01601f1916602001820160405280156143f3576020820181803683370190505b5092506144008583615114565b61440b906037615114565b60f81b8360008151811061442157614421615139565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190505b8181116144df5761010061446982846151c8565b6144759061010061591f565b61447f9088615676565b614489919061520e565b60f81b83828151811061449e5761449e615139565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806144d7816156ac565b915050614455565b50509392505050565b6060815160000361450757505060408051600081526020810190915290565b6000805b835181101561454e5783818151811061452657614526615139565b6020026020010151518261453a9190614eb0565b915080614546816156ac565b91505061450b565b60008267ffffffffffffffff81111561456957614569614993565b6040519080825280601f01601f191660200182016040528015614593576020820181803683370190505b50600092509050602081015b85518310156146175760008684815181106145bc576145bc615139565b6020026020010151905060006020820190506145da8382845161477f565b8785815181106145ec576145ec615139565b602002602001015151836146009190614eb0565b92505050828061460f906156ac565b93505061459f565b50949350505050565b606060008260405160200161463791815260200190565b604051602081830303815290604052905060005b60208110156146a65781818151811061466657614666615139565b01602001517fff00000000000000000000000000000000000000000000000000000000000000166000036146a6578061469e816156ac565b91505061464b565b60006146b38260206151c8565b67ffffffffffffffff8111156146cb576146cb614993565b6040519080825280601f01601f1916602001820160405280156146f5576020820181803683370190505b50905060005b815181101561461757838361470f816156ac565b94508151811061472157614721615139565b602001015160f81c60f81b82828151811061473e5761473e615139565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080614777816156ac565b9150506146fb565b8282825b602081106147bb578151835261479a602084614eb0565b92506147a7602083614eb0565b91506147b46020826151c8565b9050614783565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052505050565b5080546000825590600052602060002090810190613cac9190614863565b828054828255906000526020600020908101928215614853579160200282015b82811115614853578251825591602001919060010190614838565b5061485f929150614863565b5090565b5b8082111561485f5760008155600101614864565b60006020828403121561488a57600080fd5b5035919050565b6001600160a01b0381168114613cac57600080fd5b600080604083850312156148b957600080fd5b8235915060208301356148cb81614891565b809150509250929050565b60005b838110156148f15781810151838201526020016148d9565b838111156106695750506000910152565b6000815180845261491a8160208601602086016148d6565b601f01601f19169290920160200192915050565b602081526000612ae56020830184614902565b600080600080600060a0868803121561495957600080fd5b85359450602086013561496b81614891565b9350604086013561497b81614891565b94979396509394606081013594506080013592915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516101a0810167ffffffffffffffff811182821017156149e6576149e6614993565b60405290565b604051610120810167ffffffffffffffff811182821017156149e6576149e6614993565b604051601f8201601f1916810167ffffffffffffffff81118282101715614a3957614a39614993565b604052919050565b600067ffffffffffffffff821115614a5b57614a5b614993565b5060051b60200190565b60006020808385031215614a7857600080fd5b823567ffffffffffffffff811115614a8f57600080fd5b8301601f81018513614aa057600080fd5b8035614ab3614aae82614a41565b614a10565b81815260059190911b82018301908381019087831115614ad257600080fd5b928401925b82841015614af057833582529284019290840190614ad7565b979650505050505050565b60008083601f840112614b0d57600080fd5b50813567ffffffffffffffff811115614b2557600080fd5b6020830191508360208260051b8501011115614b4057600080fd5b9250929050565b600080600080600080600060a0888a031215614b6257600080fd5b8735965060208801359550604088013567ffffffffffffffff80821115614b8857600080fd5b908901906101e0828c031215614b9d57600080fd5b90955060608901359080821115614bb357600080fd5b614bbf8b838c01614afb565b909650945060808a0135915080821115614bd857600080fd5b50614be58a828b01614afb565b989b979a50959850939692959293505050565b600080600080600060808688031215614c1057600080fd5b853594506020860135614c2281614891565b935060408601359250606086013567ffffffffffffffff811115614c4557600080fd5b614c5188828901614afb565b969995985093965092949392505050565b600060208284031215614c7457600080fd5b813560ff81168114612ae557600080fd5b60006020808352610100830160ff8551168285015267ffffffffffffffff8286015116604085015260408501516001600160a01b0380821660608701528060608801511660808701525050608085015160e060a0860152818151808452610120870191508483019350600092505b80831015614d135783518252928401926001929092019190840190614cf3565b5060a087015160c087015260c087015160e08701528094505050505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160068310614d9f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b600080600080600060808688031215614dbd57600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff811115614c4557600080fd5b80516fffffffffffffffffffffffffffffffff811681146134d657600080fd5b600060808284031215614e1b57600080fd5b6040516080810181811067ffffffffffffffff82111715614e3e57614e3e614993565b6040528251614e4c81614891565b815260208381015190820152614e6460408401614de9565b6040820152614e7560608401614de9565b60608201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115614ec357614ec3614e81565b500190565b600060208284031215614eda57600080fd5b81518015158114612ae557600080fd5b600060a08284031215614efc57600080fd5b60405160a0810181811067ffffffffffffffff82111715614f1f57614f1f614993565b806040525082358152602083013560208201526040830135604082015260608301356060820152608083013560808201528091505092915050565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe61833603018112614f8e57600080fd5b9190910192915050565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee1833603018112614f8e57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261500157600080fd5b83018035915067ffffffffffffffff82111561501c57600080fd5b6020019150600581901b3603821315614b4057600080fd5b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561506657600080fd5b8260051b8083602087013760009401602001938452509192915050565b606081526000615097606083018789615034565b82810360208401526150aa818688615034565b9150508260408301529695505050505050565b8381526fffffffffffffffffffffffffffffffff831660208201526060604082015260006150ee6060830184614902565b95945050505050565b60006020828403121561510957600080fd5b8151612ae581614891565b600060ff821660ff84168060ff0382111561513157615131614e81565b019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151a0576151a0614e81565b500290565b600060ff821660ff8416808210156151bf576151bf614e81565b90039392505050565b6000828210156151da576151da614e81565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261521d5761521d6151df565b500690565b803567ffffffffffffffff811681146134d657600080fd5b600082601f83011261524b57600080fd5b8135602061525b614aae83614a41565b82815260059290921b8401810191818101908684111561527a57600080fd5b8286015b84811015615295578035835291830191830161527e565b509695505050505050565b60006101a082360312156152b357600080fd5b6152bb6149c2565b82358152602083013560208201526152d560408401615222565b60408201526152e660608401615222565b60608201526152f760808401615222565b608082015260a083013560a082015260c083013560c082015260e083013560e08201526101008084013581830152506101208084013567ffffffffffffffff81111561534257600080fd5b61534e3682870161523a565b828401525050610140615362818501615222565b90820152610160615374848201615222565b9082015261018092830135928101929092525090565b600082601f83011261539b57600080fd5b813567ffffffffffffffff8111156153b5576153b5614993565b6153c86020601f19601f84011601614a10565b8181528460208386010111156153dd57600080fd5b816020850160208301376000918101602001919091529392505050565b6000610120823603121561540d57600080fd5b6154156149ec565b823567ffffffffffffffff8082111561542d57600080fd5b6154393683870161538a565b8352602085013591508082111561544f57600080fd5b61545b3683870161538a565b6020840152604085013591508082111561547457600080fd5b6154803683870161538a565b6040840152606085013591508082111561549957600080fd5b6154a53683870161538a565b606084015260808501359150808211156154be57600080fd5b6154ca3683870161538a565b608084015260a08501359150808211156154e357600080fd5b6154ef3683870161538a565b60a084015260c085013591508082111561550857600080fd5b6155143683870161538a565b60c084015260e085013591508082111561552d57600080fd5b6155393683870161538a565b60e08401526101009150818501358181111561555457600080fd5b6155603682880161538a565b8385015250505080915050919050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b858152600060206080818401526155b56080840188614902565b8381036040850152858152818101600587901b820183018860005b8981101561565d57601f1985840301845281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18c360301811261561357600080fd5b8b01868101903567ffffffffffffffff81111561562f57600080fd5b80360382131561563e57600080fd5b615649858284615570565b9588019594505050908501906001016155d0565b5050809450505050508260608301529695505050505050565b600082615685576156856151df565b500490565b600060ff83168061569d5761569d6151df565b8060ff84160691505092915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036156dd576156dd614e81565b5060010190565b60008151602080840160005b8381101561570c578151875295820195908201906001016156f0565b509495945050505050565b8c81528b60208201528a604082015289606082015288608082015260007fffffffffffffffff000000000000000000000000000000000000000000000000808a60c01b1660a0840152808960c01b1660a88401528760b0840152808760c01b1660d0840152507fffff0000000000000000000000000000000000000000000000000000000000008560f01b1660d88301526157be6157b860da8401866156e4565b846156e4565b9e9d5050505050505050505050505050565b600083516157e28184602088016148d6565b8351908301906157f68183602088016148d6565b01949350505050565b600181815b8085111561585857817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561583e5761583e614e81565b8085161561584b57918102915b93841c9390800290615804565b509250929050565b60008261586f575060016115ca565b8161587c575060006115ca565b8160018114615892576002811461589c576158b8565b60019150506115ca565b60ff8411156158ad576158ad614e81565b50506001821b6115ca565b5060208310610133831016604e8410600b84101617156158db575081810a6115ca565b6158e583836157ff565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561591757615917614e81565b029392505050565b6000612ae5838361586056fea164736f6c634300080f000a" +var ColosseumDeployedBin = "0x608060405234801561001057600080fd5b50600436106101ad5760003560e01c806380ab1313116100ee578063b3e7766d11610097578063d5145ebc11610071578063d5145ebc146105d7578063e39a219c146105fe578063e9371a2c14610611578063fc9d84df1461063157600080fd5b8063b3e7766d14610569578063cfb4474d14610589578063d2ee3075146105b057600080fd5b80639ded3952116100c85780639ded39521461051c578063a41483e314610543578063a6ade11f1461055657600080fd5b806380ab1313146104c25780638f3a6c88146104d55780638f86c803146104fc57600080fd5b8063461569b81161015b5780635865b607116101355780635865b607146103d05780635a6b011f146103f757806362fc00db1461049c5780636fe0e559146104af57600080fd5b8063461569b81461034d5780635375b8911461036057806354fd4d501461038757600080fd5b80632df27fa51161018c5780632df27fa51461023e57806336086417146102f15780634394c5841461031857600080fd5b80621c2ff6146101b25780631be4e27e146101f65780631db1b67214610229575b600080fd5b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b610219610204366004614e01565b60036020526000908152604090205460ff1681565b60405190151581526020016101ed565b61023c610237366004614e2f565b610644565b005b6102aa61024c366004614e2f565b6002602090815260009283526040808420909152908252902080546001820154600383015460049093015460ff83169367ffffffffffffffff610100850416936001600160a01b036901000000000000000000909104811693169186565b6040805160ff909716875267ffffffffffffffff90951660208701526001600160a01b039384169486019490945291166060840152608083015260a082015260c0016101ed565b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016101ed565b61021961035b366004614e01565b6106c7565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b6103c36040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516101ed9190614eb7565b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b61045a610405366004614e01565b6004602052600090815260409020805460018201546002909201546001600160a01b0390911691906fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041684565b604080516001600160a01b03909516855260208501939093526fffffffffffffffffffffffffffffffff918216928401929092521660608201526080016101ed565b61023c6104aa366004614eca565b6107a2565b61023c6104bd366004614fee565b610e96565b61023c6104d03660046150d0565b61113e565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b61033f61050a366004614e01565b60016020526000908152604090205481565b6101d97f000000000000000000000000000000000000000000000000000000000000000081565b61023c610551366004614e01565b611b3e565b61023c610564366004615181565b611baf565b61057c610577366004614e2f565b611e82565b6040516101ed91906151eb565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b61033f7f000000000000000000000000000000000000000000000000000000000000000081565b61023c61060c366004614e01565b611efa565b61062461061f366004614e2f565b612319565b6040516101ed919061525e565b61023c61063f36600461529f565b61234b565b600360008381526002602090815260408083206001600160a01b0386168452909152902061067190612dd9565b60058111156106825761068261522f565b146106b9576040517f744b348200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106c38282612eb7565b5050565b6000427f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a25ae557856040518263ffffffff1660e01b815260040161073991815260200190565b608060405180830381865afa158015610756573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077a9190615303565b604001516fffffffffffffffffffffffffffffffff1661079a91906153aa565b101592915050565b6107aa613513565b6107b385613577565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018690526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa158015610834573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108589190615303565b6020015114610893576040517f8796efdc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008581526004602052604090206001015482146108dd576040517f90e78fa500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018690527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0ea09a890602401602060405180830381865afa15801561095b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097f91906153c2565b6001600160a01b0316846001600160a01b03161415806109b957506000858152600460205260409020546001600160a01b03848116911614155b156109f0576040517f8036a47f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008181526003602052604090205460ff16610a38576040517f7458ca2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260036020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905587835260049182905280832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155600181018490556002019290925590517fe6646723000000000000000000000000000000000000000000000000000000008152908101869052602481018390526001600160a01b0384811660448301527f0000000000000000000000000000000000000000000000000000000000000000169063e664672390606401600060405180830381600087803b158015610b3757600080fd5b505af1158015610b4b573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd191906153c2565b6001600160a01b031663ad36d6cc866040518263ffffffff1660e01b8152600401610bfe91815260200190565b602060405180830381865afa158015610c1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3f91906153df565b15610e4b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc691906153c2565b6040517fab04b8aa000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b038581166024830152919091169063ab04b8aa90604401600060405180830381600087803b158015610d2b57600080fd5b505af1158015610d3f573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610da1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc591906153c2565b6040517fbe995dc2000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b0385811660248301528681166044830152919091169063be995dc290606401600060405180830381600087803b158015610e3257600080fd5b505af1158015610e46573d6000803e3d6000fd5b505050505b836001600160a01b0316857fdca9fa9b51a5ba03938c6a0cd5489011630370fc481ef2b0cb771ad904a7305342604051610e8791815260200190565b60405180910390a35050505050565b600054610100900460ff1615808015610eb65750600054600160ff909116105b80610ed05750303b158015610ed0575060005460ff166001145b610f61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610fbf57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60028251610fcd9190615430565b15611004576040517ffbb795f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160005b835181101561107d5783818151811061102457611024615444565b60200260200101516001600083815260200190815260200160002081905550600184828151811061105757611057615444565b60200260200101516110699190615473565b611073908361548a565b9150600101611009565b507f000000000000000000000000000000000000000000000000000000000000000081146110d7576040517ffbb795f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5080156106c357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b61114787613577565b600087815260026020908152604080832033845290915281209061116a82612dd9565b6001830154909150611187908a906001600160a01b031683613653565b15611193575050611b35565b60058160058111156111a7576111a761522f565b141580156111c7575060048160058111156111c4576111c461522f565b14155b156111fe576040517f744b348200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611239888361121a611215368c90038c018c6154c7565b613b72565b61122f611215368d90038d0160a08e016154c7565b8b60a08101613c61565b6112628760a0810161124f610140830183615537565b61125d6101608c018c615575565b613d69565b61128e6112736101c08901896155a9565b6101808a01356101a08b013560e08c013560c08d0135613e2e565b60006112ab60208901356112a66101408b018b615537565b613f62565b60008181526003602052604090205490915060ff16156112f7576040517f7458ca2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f4292dc3e0000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634292dc3e90611364908a908a908a908a908890600401615660565b602060405180830381865afa158015611381573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a591906153df565b6113db576040517f076490f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405142815233908b907f0431864ed2609170587bbc7c198abd8caee4c55943dfb16fd42ec6f59c91c5f79060200160405180910390a36040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018b90526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa158015611493573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b79190615303565b84546020820151604051602481018f905233604482015269010000000000000000009092046001600160a01b03166064830152608482015260a481018490529091506000907f62fc00db000000000000000000000000000000000000000000000000000000009060c40160408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009095169490941790935291840151606085015192517f080b91ee0000000000000000000000000000000000000000000000000000000081529193506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263080b91ee926115f3929190869060040161569a565b600060405180830381600087803b15801561160d57600080fd5b505af1158015611621573d6000803e3d6000fd5b50505060008d815260046020818152604092839020865181546001600160a01b039182167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116178255828801516001830155848801516060909801516fffffffffffffffffffffffffffffffff9081167001000000000000000000000000000000000298169790971760029091015582517fb98debbf00000000000000000000000000000000000000000000000000000000815292517f00000000000000000000000000000000000000000000000000000000000000009096169563b98debbf9550838301945090929091908290030181865afa158015611728573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174c91906153c2565b6001600160a01b031663ad36d6cc8b6040518263ffffffff1660e01b815260040161177991815260200190565b602060405180830381865afa158015611796573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ba91906153df565b156118d6577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561181d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184191906153c2565b83546040517fbe995dc2000000000000000000000000000000000000000000000000000000008152600481018d90523360248201526001600160a01b0369010000000000000000009092048216604482015291169063be995dc290606401600060405180830381600087803b1580156118b957600080fd5b505af11580156118cd573d6000803e3d6000fd5b505050506119d4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611934573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195891906153c2565b6040517fdd215c5d000000000000000000000000000000000000000000000000000000008152600481018c90523360248201526001600160a01b03919091169063dd215c5d90604401600060405180830381600087803b1580156119bb57600080fd5b505af11580156119cf573d6000803e3d6000fd5b505050505b600081815260036020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558d8452600280845282852033865290935290832080547fffffff000000000000000000000000000000000000000000000000000000000016815590810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690559190611a8290830182614d83565b5060006003820181905560049182018190556040517fe66467230000000000000000000000000000000000000000000000000000000081529182018c905260248201523360448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e664672390606401600060405180830381600087803b158015611b1957600080fd5b505af1158015611b2d573d6000803e3d6000fd5b505050505050505b50505050505050565b600081815260026020908152604080832033845290915290206001810154611b799083906001600160a01b0316611b7484612dd9565b613653565b6106c3576040517f4e9d86f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611bb885613577565b60008581526002602090815260408083206001600160a01b0388168452909152812090611be482612dd9565b6001830154909150611c019088906001600160a01b031683613653565b15611c0d575050611e7b565b60006001826005811115611c2357611c2361522f565b03611c3c575060018201546001600160a01b0316611c6f565b6002826005811115611c5057611c5061522f565b03611c6f57508154690100000000000000000090046001600160a01b03165b336001600160a01b03821614611cb1576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8254600090611cc49060ff1660016156d4565b9050611d4f81856002018981548110611cdf57611cdf615444565b9060005260206000200154866002018a6001611cfb91906153aa565b81548110611d0b57611d0b615444565b906000526020600020015489898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061401d92505050565b6000611d5a8561412e565b9050611db585888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611da092508691508d905061548a565b8860040154611daf91906153aa565b84614173565b84547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8316178555611de98561419d565b6040805160ff841681524260208201526001600160a01b038b16918c917fcadef6622777415b0589e491bdbf6baf11242f676f77055fd03bf1658c17a145910160405180910390a3611e3a8561423b565b611e75576040516001600160a01b038a16908b907f5c4528cbb38a169d24837617d3fd3d5c70a47769a4e9af6f384720b359b716c890600090a35b50505050505b5050505050565b60008281526002602081815260408084206001600160a01b0386168552825292839020909101805483518184028101840190945280845260609392830182828015611eec57602002820191906000526020600020905b815481526020019060010190808311611ed8575b505050505090505b92915050565b611f02613513565b611f0b81613577565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa158015611f8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb09190615303565b6020810151909150611fee576040517fe66309bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fe664672300000000000000000000000000000000000000000000000000000000815260048101839052600060248201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660448301527f0000000000000000000000000000000000000000000000000000000000000000169063e664672390606401600060405180830381600087803b15801561209857600080fd5b505af11580156120ac573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561210e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213291906153c2565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b815260040161215f91815260200190565b602060405180830381865afa15801561217c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a091906153df565b156122cd577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612203573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061222791906153c2565b81516040517fbe995dc2000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166024830152918216604482015291169063be995dc290606401600060405180830381600087803b1580156122b457600080fd5b505af11580156122c8573d6000803e3d6000fd5b505050505b80600001516001600160a01b0316827fa620f04b65b1d538481626bf41dc5ee321b5c48e0cc1a7daae213cf7c254b54e4260405161230d91815260200190565b60405180910390a35050565b60008281526002602090815260408083206001600160a01b0385168452909152812061234490612dd9565b9392505050565b84600003612385576040517f2604872b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240791906153c2565b6001600160a01b031663ad36d6cc866040518263ffffffff1660e01b815260040161243491815260200190565b602060405180830381865afa158015612451573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247591906153df565b156125b5577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124fc91906153c2565b6040517f9f8a13d70000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b039190911690639f8a13d790602401602060405180830381865afa15801561255b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257f91906153df565b6125b5576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600085815260026020908152604080832033845290915290208054600160ff909116106126395760036125e782612dd9565b60058111156125f8576125f861522f565b1461262f576040517f744b348200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126398633612eb7565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018790526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa1580156126ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126de9190615303565b9050427f000000000000000000000000000000000000000000000000000000000000000082604001516fffffffffffffffffffffffffffffffff1661272391906153aa565b101561275b576040517fa0388b4700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020810151612796576040517fe66309bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516001600160a01b031633036127d9576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85158015906127e85750844015155b156128275785854014612827576040517f72f1f56300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a25ae55761286360018b615473565b6040518263ffffffff1660e01b815260040161288191815260200190565b608060405180830381865afa15801561289e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c29190615303565b60208101519091506129305761292b6001868660008181106128e6576128e6615444565b90506020020135846020015188888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061401d92505050565b612978565b61297860018260200151846020015188888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061401d92505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129fa91906153c2565b6001600160a01b031663ad36d6cc896040518263ffffffff1660e01b8152600401612a2791815260200190565b602060405180830381865afa158015612a44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a6891906153df565b15612b68577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612acb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aef91906153c2565b6040517f8c1516c70000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b039190911690638c1516c790602401600060405180830381600087803b158015612b4b57600080fd5b505af1158015612b5f573d6000803e3d6000fd5b50505050612c66565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bea91906153c2565b6040517f5a544742000000000000000000000000000000000000000000000000000000008152600481018a90523360248201526001600160a01b039190911690635a54474290604401600060405180830381600087803b158015612c4d57600080fd5b505af1158015612c61573d6000803e3d6000fd5b505050505b612d058386868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050506060860151612cdf91507f0000000000000000000000000000000000000000000000000000000000000000906fffffffffffffffffffffffffffffffff16615473565b7f0000000000000000000000000000000000000000000000000000000000000000614173565b825482516001600160a01b03166901000000000000000000027fffffff0000000000000000000000000000000000000000ffffffffffffffff009091161760019081178455830180547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055612d7d8361419d565b815160405142815233916001600160a01b0316908a907fd2f7931a802085b3d0234d4c320ce7ee0041da96678ce2bf5c93e8d3d7e65f529060200160405180910390a45050505050505050565b6001600160a01b03163b151590565b8054600090600160ff9091161015612df357506000919050565b8154600090612e079060029060ff166156f9565b835460ff91909116159150610100900467ffffffffffffffff16421115612e8c578015612e375750600392915050565b8254612e73907f000000000000000000000000000000000000000000000000000000000000000090610100900467ffffffffffffffff166153aa565b421115612e835750600392915050565b50600492915050565b612e958361423b565b612ea25750600592915050565b80612eae576002612344565b60019392505050565b60008281526002602081815260408084206001600160a01b0386168552909152822080547fffffff00000000000000000000000000000000000000000000000000000000001681556001810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690559190612f3790830182614d83565b600382016000905560048201600090555050806001600160a01b0316827fbf4506ef5d06ecb6168f37bc9e69dd473089eb9e3f2675322d01b4d466cff05142604051612f8591815260200190565b60405180910390a37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612feb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061300f91906153c2565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b815260040161303c91815260200190565b602060405180830381865afa158015613059573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307d91906153df565b15613227577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061310491906153c2565b6001600160a01b031663be995dc2837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b0ea09a8866040518263ffffffff1660e01b815260040161316191815260200190565b602060405180830381865afa15801561317e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131a291906153c2565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526001600160a01b039081166024830152841660448201526064015b600060405180830381600087803b15801561320b57600080fd5b505af115801561321f573d6000803e3d6000fd5b505050505050565b6040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa1580156132a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132c991906153df565b15613441577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561332c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061335091906153c2565b6001600160a01b03166336b8346983837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b0ea09a8876040518263ffffffff1660e01b81526004016133ae91815260200190565b602060405180830381865afa1580156133cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133ef91906153c2565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526001600160a01b0391821660248401521660448201526064016131f1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561349f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134c391906153c2565b6040517fdd215c5d000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b038381166024830152919091169063dd215c5d906044016131f1565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614613575576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa1580156135f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061361991906153df565b15613650576040517f5c9d9a2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b6040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810184905260009081907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa1580156136d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136fa9190615303565b602001511461370b57506000612344565b336001600160a01b0384161461374d576040517f21e62a3f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260058111156137615761376161522f565b148061377e5750600382600581111561377c5761377c61522f565b145b156137b5576040517ff691b6e600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848152600260208181526040808420338552909152822080547fffffff00000000000000000000000000000000000000000000000000000000001681556001810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055919061382c90830182614d83565b50600060038201819055600490910155604051428152339085907f6f3468a095154788e69ed719ee418416c1e338ac2348ccb3531bb97a0ed6ed9d9060200160405180910390a37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138f591906153c2565b6001600160a01b031663ad36d6cc856040518263ffffffff1660e01b815260040161392291815260200190565b602060405180830381865afa15801561393f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061396391906153df565b15613a63577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139ea91906153c2565b6040517fa83871720000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03919091169063a838717290602401600060405180830381600087803b158015613a4657600080fd5b505af1158015613a5a573d6000803e3d6000fd5b50505050613b68565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ac1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ae591906153c2565b6040517f36b8346900000000000000000000000000000000000000000000000000000000815260048101869052336024820181905260448201526001600160a01b0391909116906336b8346990606401600060405180830381600087803b158015613b4f57600080fd5b505af1158015613b63573d6000803e3d6000fd5b505050505b5060019392505050565b8051600090613bd45781516020808401516040808601516060808801516080808a0151855180890199909952888601969096529187019290925285015260a0808501929092528051808503909201825260c09093019092528151910120611ef4565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f48617368696e673a20756e6b6e6f776e206f757470757420726f6f742070726f60448201527f6f662076657273696f6e000000000000000000000000000000000000000000006064820152608401610f58565b919050565b83856002018781548110613c7757613c77615444565b906000526020600020015414613cb9576040517f224dff3200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613cc28561423b565b613d28578260028601613cd68860016153aa565b81548110613ce657613ce6615444565b906000526020600020015403613d28576040517f87c1943200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806060013582608001351461321f576040517f3f126fab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82602001358260e0013514613daa576040517f4d9e774000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610180830135613dd557613dd0613dc284615799565b613dcb846158f3565b61424f565b613def565b613def613de184615799565b613dea846158f3565b6142f3565b905080856080013514611e7b576040517fb033950600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051600060208201528082018690526060810185905260808082018590528251808303909101815260a08201928390527f12e64a72000000000000000000000000000000000000000000000000000000009092527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906312e64a7290613eeb907f42000000000000000000000000000000000000030000000000000000000000009085908c908c90899060a401615a94565b602060405180830381865afa158015613f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f2c91906153df565b611b35576040517ff35959c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060607f0000000000000000000000000000000000000000000000000000000000000000613f956101208501856155a9565b9050101561400257613fff7f0000000000000000000000000000000000000000000000000000000000000000613fcf6101208601866155a9565b613ffa91507f0000000000000000000000000000000000000000000000000000000000000000615473565b614404565b90505b6140158461400f85615799565b83614490565b949350505050565b80516001600061402d8288615b6f565b60ff1681526020019081526020016000205414614076576040517ffbb795f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008151811061408957614089615444565b602002602001015183146140c9576040517f224dff3200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600182516140d89190615473565b815181106140e8576140e8615444565b60200260200101518203614128576040517f87c1943200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b80546000906001908190839061414890839060ff16615b6f565b60ff168152602001908152602001600020546141649190615473565b8260030154611ef49190615b92565b82516141889060028601906020860190614da1565b50600484019190915560039092019190915550565b6141a68161423b565b614211576141d47f0000000000000000000000000000000000000000000000000000000000000000426153aa565b815467ffffffffffffffff91909116610100027fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff90911617815550565b6141d47f0000000000000000000000000000000000000000000000000000000000000000426153aa565b600060016142488361412e565b1192915050565b6040805160118082526102408201909252600091829190816020015b606081526020019060019003908161426b57905050905061428d848483614502565b6142bc8461010001516040516020016142a891815260200190565b6040516020818303038152906040526147b5565b816010815181106142cf576142cf615444565b60200260200101819052506142e381614824565b8051906020012091505092915050565b6040805160148082526102a08201909252600091829190816020015b606081526020019060019003908161430f579050509050614331848483614502565b61434c8461010001516040516020016142a891815260200190565b8160108151811061435f5761435f615444565b602002602001018190525061438284610140015167ffffffffffffffff16614868565b8160118151811061439557614395615444565b60200260200101819052506143b884610160015167ffffffffffffffff16614868565b816012815181106143cb576143cb615444565b60200260200101819052506143f18461018001516040516020016142a891815260200190565b816013815181106142cf576142cf615444565b606060008267ffffffffffffffff81111561442157614421614f1c565b60405190808252806020026020018201604052801561444a578160200160208202803683370190505b50905060005b83811015614488578482828151811061446b5761446b615444565b60209081029190910101528061448081615ba6565b915050614450565b509392505050565b6000838360e001516000801b85600001518660200151876060015188604001518960a001518a608001518b6101200151518c61012001518c6040516020016144e39c9b9a99989796959493929190615c11565b6040516020818303038152906040528051906020012090509392505050565b61451c83602001516040516020016142a891815260200190565b8160008151811061452f5761452f615444565b602002602001018190525081600001518160018151811061455257614552615444565b602002602001018190525081602001518160028151811061457557614575615444565b602002602001018190525061459a8360e001516040516020016142a891815260200190565b816003815181106145ad576145ad615444565b60200260200101819052506145d28360c001516040516020016142a891815260200190565b816004815181106145e5576145e5615444565b602002602001018190525081604001518160058151811061460857614608615444565b602002602001018190525081606001518160068151811061462b5761462b615444565b602002602001018190525081608001518160078151811061464e5761464e615444565b6020026020010181905250614670836060015167ffffffffffffffff16614868565b8160088151811061468357614683615444565b60200260200101819052506146a5836080015167ffffffffffffffff16614868565b816009815181106146b8576146b8615444565b60200260200101819052508160a0015181600a815181106146db576146db615444565b60200260200101819052506146fd836040015167ffffffffffffffff16614868565b81600b8151811061471057614710615444565b60200260200101819052508160c0015181600c8151811061473357614733615444565b60200260200101819052508160e0015181600d8151811061475657614756615444565b602002602001018190525081610100015181600e8151811061477a5761477a615444565b60200260200101819052506147928360a00151614868565b81600f815181106147a5576147a5615444565b6020026020010181905250505050565b606080825160011480156147e357506080836000815181106147d9576147d9615444565b016020015160f81c105b156147ef575081611ef4565b6147fb8351608061487b565b8360405160200161480d929190615cca565b604051602081830303815290604052905092915050565b6060600061483183614a71565b905061483f815160c061487b565b81604051602001614851929190615cca565b604051602081830303815290604052915050919050565b6060611ef461487683614ba9565b6147b5565b60608060388410156148fa57604080516001808252818301909252906020820181803683370190505090506148b083856156d4565b60f81b816000815181106148c6576148c6615444565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612344565b600060015b6149098187615b92565b1561492f578161491881615ba6565b925061492890506101008261548a565b90506148ff565b61493a8260016153aa565b67ffffffffffffffff81111561495257614952614f1c565b6040519080825280601f01601f19166020018201604052801561497c576020820181803683370190505b50925061498985836156d4565b6149949060376156d4565b60f81b836000815181106149aa576149aa615444565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190505b818111614a68576101006149f28284615473565b6149fe90610100615e19565b614a089088615b92565b614a129190615430565b60f81b838281518110614a2757614a27615444565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080614a6081615ba6565b9150506149de565b50509392505050565b60608151600003614a9057505060408051600081526020810190915290565b6000805b8351811015614ad757838181518110614aaf57614aaf615444565b60200260200101515182614ac391906153aa565b915080614acf81615ba6565b915050614a94565b60008267ffffffffffffffff811115614af257614af2614f1c565b6040519080825280601f01601f191660200182016040528015614b1c576020820181803683370190505b50600092509050602081015b8551831015614ba0576000868481518110614b4557614b45615444565b602002602001015190506000602082019050614b6383828451614d08565b878581518110614b7557614b75615444565b60200260200101515183614b8991906153aa565b925050508280614b9890615ba6565b935050614b28565b50949350505050565b6060600082604051602001614bc091815260200190565b604051602081830303815290604052905060005b6020811015614c2f57818181518110614bef57614bef615444565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016600003614c2f5780614c2781615ba6565b915050614bd4565b6000614c3c826020615473565b67ffffffffffffffff811115614c5457614c54614f1c565b6040519080825280601f01601f191660200182016040528015614c7e576020820181803683370190505b50905060005b8151811015614ba0578383614c9881615ba6565b945081518110614caa57614caa615444565b602001015160f81c60f81b828281518110614cc757614cc7615444565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080614d0081615ba6565b915050614c84565b8282825b60208110614d445781518352614d236020846153aa565b9250614d306020836153aa565b9150614d3d602082615473565b9050614d0c565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052505050565b50805460008255906000526020600020908101906136509190614dec565b828054828255906000526020600020908101928215614ddc579160200282015b82811115614ddc578251825591602001919060010190614dc1565b50614de8929150614dec565b5090565b5b80821115614de85760008155600101614ded565b600060208284031215614e1357600080fd5b5035919050565b6001600160a01b038116811461365057600080fd5b60008060408385031215614e4257600080fd5b823591506020830135614e5481614e1a565b809150509250929050565b60005b83811015614e7a578181015183820152602001614e62565b838111156141285750506000910152565b60008151808452614ea3816020860160208601614e5f565b601f01601f19169290920160200192915050565b6020815260006123446020830184614e8b565b600080600080600060a08688031215614ee257600080fd5b853594506020860135614ef481614e1a565b93506040860135614f0481614e1a565b94979396509394606081013594506080013592915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516101a0810167ffffffffffffffff81118282101715614f6f57614f6f614f1c565b60405290565b604051610120810167ffffffffffffffff81118282101715614f6f57614f6f614f1c565b604051601f8201601f1916810167ffffffffffffffff81118282101715614fc257614fc2614f1c565b604052919050565b600067ffffffffffffffff821115614fe457614fe4614f1c565b5060051b60200190565b6000602080838503121561500157600080fd5b823567ffffffffffffffff81111561501857600080fd5b8301601f8101851361502957600080fd5b803561503c61503782614fca565b614f99565b81815260059190911b8201830190838101908783111561505b57600080fd5b928401925b8284101561507957833582529284019290840190615060565b979650505050505050565b60008083601f84011261509657600080fd5b50813567ffffffffffffffff8111156150ae57600080fd5b6020830191508360208260051b85010111156150c957600080fd5b9250929050565b600080600080600080600060a0888a0312156150eb57600080fd5b8735965060208801359550604088013567ffffffffffffffff8082111561511157600080fd5b908901906101e0828c03121561512657600080fd5b9095506060890135908082111561513c57600080fd5b6151488b838c01615084565b909650945060808a013591508082111561516157600080fd5b5061516e8a828b01615084565b989b979a50959850939692959293505050565b60008060008060006080868803121561519957600080fd5b8535945060208601356151ab81614e1a565b935060408601359250606086013567ffffffffffffffff8111156151ce57600080fd5b6151da88828901615084565b969995985093965092949392505050565b6020808252825182820181905260009190848201906040850190845b8181101561522357835183529284019291840191600101615207565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160068310615299577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806000806000608086880312156152b757600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff8111156151ce57600080fd5b80516fffffffffffffffffffffffffffffffff81168114613c5c57600080fd5b60006080828403121561531557600080fd5b6040516080810181811067ffffffffffffffff8211171561533857615338614f1c565b604052825161534681614e1a565b81526020838101519082015261535e604084016152e3565b604082015261536f606084016152e3565b60608201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156153bd576153bd61537b565b500190565b6000602082840312156153d457600080fd5b815161234481614e1a565b6000602082840312156153f157600080fd5b8151801515811461234457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261543f5761543f615401565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000828210156154855761548561537b565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156154c2576154c261537b565b500290565b600060a082840312156154d957600080fd5b60405160a0810181811067ffffffffffffffff821117156154fc576154fc614f1c565b806040525082358152602083013560208201526040830135604082015260608301356060820152608083013560808201528091505092915050565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6183360301811261556b57600080fd5b9190910192915050565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee183360301811261556b57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126155de57600080fd5b83018035915067ffffffffffffffff8211156155f957600080fd5b6020019150600581901b36038213156150c957600080fd5b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561564357600080fd5b8260051b8083602087013760009401602001938452509192915050565b606081526000615674606083018789615611565b8281036020840152615687818688615611565b9150508260408301529695505050505050565b8381526fffffffffffffffffffffffffffffffff831660208201526060604082015260006156cb6060830184614e8b565b95945050505050565b600060ff821660ff84168060ff038211156156f1576156f161537b565b019392505050565b600060ff83168061570c5761570c615401565b8060ff84160691505092915050565b803567ffffffffffffffff81168114613c5c57600080fd5b600082601f83011261574457600080fd5b8135602061575461503783614fca565b82815260059290921b8401810191818101908684111561577357600080fd5b8286015b8481101561578e5780358352918301918301615777565b509695505050505050565b60006101a082360312156157ac57600080fd5b6157b4614f4b565b82358152602083013560208201526157ce6040840161571b565b60408201526157df6060840161571b565b60608201526157f06080840161571b565b608082015260a083013560a082015260c083013560c082015260e083013560e08201526101008084013581830152506101208084013567ffffffffffffffff81111561583b57600080fd5b61584736828701615733565b82840152505061014061585b81850161571b565b9082015261016061586d84820161571b565b9082015261018092830135928101929092525090565b600082601f83011261589457600080fd5b813567ffffffffffffffff8111156158ae576158ae614f1c565b6158c16020601f19601f84011601614f99565b8181528460208386010111156158d657600080fd5b816020850160208301376000918101602001919091529392505050565b6000610120823603121561590657600080fd5b61590e614f75565b823567ffffffffffffffff8082111561592657600080fd5b61593236838701615883565b8352602085013591508082111561594857600080fd5b61595436838701615883565b6020840152604085013591508082111561596d57600080fd5b61597936838701615883565b6040840152606085013591508082111561599257600080fd5b61599e36838701615883565b606084015260808501359150808211156159b757600080fd5b6159c336838701615883565b608084015260a08501359150808211156159dc57600080fd5b6159e836838701615883565b60a084015260c0850135915080821115615a0157600080fd5b615a0d36838701615883565b60c084015260e0850135915080821115615a2657600080fd5b615a3236838701615883565b60e084015261010091508185013581811115615a4d57600080fd5b615a5936828801615883565b8385015250505080915050919050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b85815260006020608081840152615aae6080840188614e8b565b8381036040850152858152818101600587901b820183018860005b89811015615b5657601f1985840301845281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18c3603018112615b0c57600080fd5b8b01868101903567ffffffffffffffff811115615b2857600080fd5b803603821315615b3757600080fd5b615b42858284615a69565b958801959450505090850190600101615ac9565b5050809450505050508260608301529695505050505050565b600060ff821660ff841680821015615b8957615b8961537b565b90039392505050565b600082615ba157615ba1615401565b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615bd757615bd761537b565b5060010190565b60008151602080840160005b83811015615c0657815187529582019590820190600101615bea565b509495945050505050565b8c81528b60208201528a604082015289606082015288608082015260007fffffffffffffffff000000000000000000000000000000000000000000000000808a60c01b1660a0840152808960c01b1660a88401528760b0840152808760c01b1660d0840152507fffff0000000000000000000000000000000000000000000000000000000000008560f01b1660d8830152615cb8615cb260da840186615bde565b84615bde565b9e9d5050505050505050505050505050565b60008351615cdc818460208801614e5f565b835190830190615cf0818360208801614e5f565b01949350505050565b600181815b80851115615d5257817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615d3857615d3861537b565b80851615615d4557918102915b93841c9390800290615cfe565b509250929050565b600082615d6957506001611ef4565b81615d7657506000611ef4565b8160018114615d8c5760028114615d9657615db2565b6001915050611ef4565b60ff841115615da757615da761537b565b50506001821b611ef4565b5060208310610133831016604e8410600b8410161715615dd5575081810a611ef4565b615ddf8383615cf9565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615e1157615e1161537b565b029392505050565b60006123448383615d5a56fea164736f6c634300080f000a" func init() { diff --git a/kroma-bindings/bindings/governancetoken.go b/kroma-bindings/bindings/governancetoken.go index 3adacd1f69..097653e00e 100644 --- a/kroma-bindings/bindings/governancetoken.go +++ b/kroma-bindings/bindings/governancetoken.go @@ -37,8 +37,8 @@ type ERC20VotesCheckpoint struct { // GovernanceTokenMetaData contains all meta data concerning the GovernanceToken contract. var GovernanceTokenMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_bridge\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_remoteToken\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"BRIDGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"REMOTE_TOKEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burn\",\"inputs\":[{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burn\",\"inputs\":[{\"name\":\"_from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"burnFrom\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"checkpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pos\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structERC20Votes.Checkpoint\",\"components\":[{\"name\":\"fromBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"votes\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint48\",\"internalType\":\"uint48\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegate\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateBySig\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegates\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eip712Domain\",\"inputs\":[],\"outputs\":[{\"name\":\"fields\",\"type\":\"bytes1\",\"internalType\":\"bytes1\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extensions\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"inputs\":[{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"_account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permit\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deadline\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"_interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Burn\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateChanged\",\"inputs\":[{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"fromDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"toDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"name\":\"delegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"previousBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EIP712DomainChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Mint\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]}]", - Bin: "0x6101a06040523480156200001257600080fd5b50604051620032633803806200326383398101604081905262000035916200025f565b604051806040016040528060058152602001644b726f6d6160d81b81525080604051806040016040528060018152602001603160f81b8152508484604051806020016040528060008152506040518060200160405280600081525081818160039081620000a391906200033c565b506004620000b282826200033c565b505050506001600160a01b03918216608052501660a052620000e2826005620001a3602090811b6200109e17901c565b61016052620000ff816006620001a3602090811b6200109e17901c565b61018052815160208084019190912061012052815190820120610140524660e0526200018f6101205161014051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60c052505030610100525062000485915050565b6000602083511015620001c357620001bb83620001f3565b9050620001ed565b82620001da836200023f60201b620010cf1760201c565b90620001e790826200033c565b5060ff90505b92915050565b600080829050601f815111156200022a578260405163305a27a960e01b815260040162000221919062000408565b60405180910390fd5b8051620002378262000460565b179392505050565b90565b80516001600160a01b03811681146200025a57600080fd5b919050565b600080604083850312156200027357600080fd5b6200027e8362000242565b91506200028e6020840162000242565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620002c257607f821691505b602082108103620002e357634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200033757600081815260208120601f850160051c81016020861015620003125750805b601f850160051c820191505b8181101562000333578281556001016200031e565b5050505b505050565b81516001600160401b0381111562000358576200035862000297565b6200037081620003698454620002ad565b84620002e9565b602080601f831160018114620003a857600084156200038f5750858301515b600019600386901b1c1916600185901b17855562000333565b600085815260208120601f198616915b82811015620003d957888601518255948401946001909101908401620003b8565b5085821015620003f85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208083528351808285015260005b81811015620004375785810183015185820160400152820162000419565b818111156200044a576000604083870101525b50601f01601f1916929092016040019392505050565b80516020808301519190811015620002e35760001960209190910360031b1b16919050565b60805160a05160c05160e0516101005161012051610140516101605161018051612d5f620005046000396000610a12015260006109e7015260006115fe015260006115d6015260006115310152600061155b015260006115850152600081816105ba0152818161081a0152610bd20152600061023d0152612d5f6000f3fe608060405234801561001057600080fd5b506004361061020b5760003560e01c80636fcfff451161012a5780639ab24eb0116100bd578063c3cda5201161008c578063dd62ed3e11610071578063dd62ed3e1461056f578063ee9a31a2146105b5578063f1127ed8146105dc57600080fd5b8063c3cda52014610549578063d505accf1461055c57600080fd5b80639ab24eb0146104fd5780639dc29fac14610510578063a457c2d714610523578063a9059cbb1461053657600080fd5b806384b0196e116100f957806384b0196e146104775780638e539e8c1461049257806391ddadf4146104a557806395d89b41146104c457600080fd5b80636fcfff45146103f357806370a082311461041b57806379cc6790146104515780637ecebe001461046457600080fd5b806339509351116101a25780634bf5d7e9116101715780634bf5d7e91461036357806354fd4d501461036b578063587cde1e146103a75780635c19a95c146103e057600080fd5b806339509351146103155780633a46b1a81461032857806340c10f191461033b57806342966c681461035057600080fd5b806318160ddd116101de57806318160ddd146102d957806323b872dd146102eb578063313ce567146102fe5780633644e5151461030d57600080fd5b806301ffc9a714610210578063033964be1461023857806306fdde0314610284578063095ea7b3146102c6575b600080fd5b61022361021e3660046126d8565b61062e565b60405190151581526020015b60405180910390f35b61025f7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161022f565b60408051808201909152600581527f4b726f6d6100000000000000000000000000000000000000000000000000000060208201525b60405161022f9190612785565b6102236102d43660046127c1565b6106ce565b6002545b60405190815260200161022f565b6102236102f93660046127eb565b6106e8565b6040516012815260200161022f565b6102dd61070c565b6102236103233660046127c1565b61071b565b6102dd6103363660046127c1565b610767565b61034e6103493660046127c1565b610802565b005b61034e61035e366004612827565b6108bb565b6102b96108c8565b6102b96040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b61025f6103b5366004612840565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600960205260409020541690565b61034e6103ee366004612840565b610960565b610406610401366004612840565b61096a565b60405163ffffffff909116815260200161022f565b6102dd610429366004612840565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61034e61045f3660046127c1565b610999565b6102dd610472366004612840565b6109ae565b61047f6109d9565b60405161022f979695949392919061285b565b6102dd6104a0366004612827565b610a7e565b6104ad610ae9565b60405165ffffffffffff909116815260200161022f565b60408051808201909152600381527f4b524f000000000000000000000000000000000000000000000000000000000060208201526102b9565b6102dd61050b366004612840565b610af4565b61034e61051e3660046127c1565b610bba565b6102236105313660046127c1565b610c65565b6102236105443660046127c1565b610d1c565b61034e61055736600461292b565b610d2a565b61034e61056a366004612983565b610e6d565b6102dd61057d3660046129ed565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b61025f7f000000000000000000000000000000000000000000000000000000000000000081565b6105ef6105ea366004612a20565b610ff8565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16928101929092520161022f565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f30a0c5a9000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084168214806106c657507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b6000336106dc8185856110d2565b60019150505b92915050565b6000336106f6858285611251565b6107018585856112f0565b506001949350505050565b6000610716611517565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906106dc9082908690610762908790612a8f565b6110d2565b6000610771610ae9565b65ffffffffffff1682106107cc5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20667574757265206c6f6f6b75700000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600a602052604090206107fb908361164f565b9392505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146108ad5760405162461bcd60e51b815260206004820152602560248201527f476f7665726e616e6365546f6b656e3a206f6e6c79206d696e7465722063616e60448201527f206d696e7400000000000000000000000000000000000000000000000000000060648201526084016107c3565b6108b78282611762565b5050565b6108c5338261176c565b50565b6060436108d3610ae9565b65ffffffffffff16146109285760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a2062726f6b656e20636c6f636b206d6f646500000060448201526064016107c3565b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b6108c53382611776565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a60205260408120546106e290611814565b6109a4823383611251565b6108b7828261176c565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600760205260408120546106e2565b600060608082808083610a0d7f00000000000000000000000000000000000000000000000000000000000000006005611894565b610a387f00000000000000000000000000000000000000000000000000000000000000006006611894565b604080516000808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6000610a88610ae9565b65ffffffffffff168210610ade5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20667574757265206c6f6f6b75700000000000000060448201526064016107c3565b6106e2600b8361164f565b600061071643611938565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a60205260408120548015610b925773ffffffffffffffffffffffffffffffffffffffff83166000908152600a6020526040902080546000198301908110610b5b57610b5b612ad6565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610b95565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146109a45760405162461bcd60e51b815260206004820152603160248201527f4b726f6d614d696e7461626c6545524332303a206f6e6c79206272696467652060448201527f63616e206d696e7420616e64206275726e00000000000000000000000000000060648201526084016107c3565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610d0f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016107c3565b61070182868684036110d2565b6000336106dc8185856112f0565b83421115610d7a5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e6174757265206578706972656400000060448201526064016107c3565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf602082015273ffffffffffffffffffffffffffffffffffffffff8816918101919091526060810186905260808101859052600090610e0190610df99060a001604051602081830303815290604052805190602001206119b6565b8585856119fe565b9050610e0c81611a26565b8614610e5a5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e63650000000000000060448201526064016107c3565b610e648188611776565b50505050505050565b83421115610ebd5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e6500000060448201526064016107c3565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610eec8c611a26565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610f54826119b6565b90506000610f64828787876119fe565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fe15760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e6174757265000060448201526064016107c3565b610fec8a8a8a6110d2565b50505050505050505050565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff83166000908152600a60205260409020805463ffffffff841690811061104957611049612ad6565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b60006020835110156110ba576110b383611a5b565b90506106e2565b816110c58482612ba0565b5060ff90506106e2565b90565b73ffffffffffffffffffffffffffffffffffffffff831661115a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016107c3565b73ffffffffffffffffffffffffffffffffffffffff82166111e35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016107c3565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff83811660009081526001602090815260408083209386168352929052205460001981146112ea57818110156112dd5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016107c3565b6112ea84848484036110d2565b50505050565b73ffffffffffffffffffffffffffffffffffffffff83166113795760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016107c3565b73ffffffffffffffffffffffffffffffffffffffff82166114025760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016107c3565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260409020548181101561149e5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016107c3565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36112ea848484611ab7565b60003073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614801561157d57507f000000000000000000000000000000000000000000000000000000000000000046145b156115a757507f000000000000000000000000000000000000000000000000000000000000000090565b610716604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b8154600090818160058111156116a957600061166a84611ac2565b6116749085612c7e565b600088815260209020909150869082015463ffffffff161115611699578091506116a7565b6116a4816001612a8f565b92505b505b808210156116f65760006116bd8383611baa565b600088815260209020909150869082015463ffffffff1611156116e2578091506116f0565b6116ed816001612a8f565b92505b506116a9565b8015611737576000868152602090208101600019015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661173a565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169695505050505050565b6108b78282611bc5565b6108b78282611c71565b73ffffffffffffffffffffffffffffffffffffffff8281166000818152600960208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46112ea828483611c89565b600063ffffffff8211156118905760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f322062697473000000000000000000000000000000000000000000000000000060648201526084016107c3565b5090565b606060ff83146118a7576110b383611e2e565b8180546118b390612b05565b80601f01602080910402602001604051908101604052809291908181526020018280546118df90612b05565b801561192c5780601f106119015761010080835404028352916020019161192c565b820191906000526020600020905b81548152906001019060200180831161190f57829003601f168201915b505050505090506106e2565b600065ffffffffffff8211156118905760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201527f382062697473000000000000000000000000000000000000000000000000000060648201526084016107c3565b60006106e26119c3611517565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6000806000611a0f87878787611e6d565b91509150611a1c81611f5c565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604090208054600181018255905b50919050565b600080829050601f81511115611a9f57826040517f305a27a90000000000000000000000000000000000000000000000000000000081526004016107c39190612785565b8051611aaa82612c95565b179392505050565b505050565b611ab28383836120c1565b600081600003611ad457506000919050565b60006001611ae184612100565b901c6001901b90506001818481611afa57611afa612cb9565b048201901c90506001818481611b1257611b12612cb9565b048201901c90506001818481611b2a57611b2a612cb9565b048201901c90506001818481611b4257611b42612cb9565b048201901c90506001818481611b5a57611b5a612cb9565b048201901c90506001818481611b7257611b72612cb9565b048201901c90506001818481611b8a57611b8a612cb9565b048201901c90506107fb81828581611ba457611ba4612cb9565b04612194565b6000611bb96002848418612ce8565b6107fb90848416612a8f565b611bcf82826121aa565b6002547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1015611c635760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f7465730000000000000000000000000000000060648201526084016107c3565b6112ea600b61228b83612297565b611c7b8282612460565b6112ea600b6125f783612297565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611cc55750600081115b15611ab25773ffffffffffffffffffffffffffffffffffffffff831615611d7a5773ffffffffffffffffffffffffffffffffffffffff83166000908152600a602052604081208190611d1a906125f785612297565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611d6f929190918252602082015260400190565b60405180910390a250505b73ffffffffffffffffffffffffffffffffffffffff821615611ab25773ffffffffffffffffffffffffffffffffffffffff82166000908152600a602052604081208190611dca9061228b85612297565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611e1f929190918252602082015260400190565b60405180910390a25050505050565b60606000611e3b83612603565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611ea45750600090506003611f53565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611ef8573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611f4c57600060019250925050611f53565b9150600090505b94509492505050565b6000816004811115611f7057611f70612d23565b03611f785750565b6001816004811115611f8c57611f8c612d23565b03611fd95760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016107c3565b6002816004811115611fed57611fed612d23565b0361203a5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016107c3565b600381600481111561204e5761204e612d23565b036108c55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016107c3565b73ffffffffffffffffffffffffffffffffffffffff838116600090815260096020526040808220548584168352912054611ab292918216911683611c89565b600080608083901c1561211557608092831c92015b604083901c1561212757604092831c92015b602083901c1561213957602092831c92015b601083901c1561214b57601092831c92015b600883901c1561215d57600892831c92015b600483901c1561216f57600492831c92015b600283901c1561218157600292831c92015b600183901c156106e25760010192915050565b60008183106121a357816107fb565b5090919050565b73ffffffffffffffffffffffffffffffffffffffff821661220d5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016107c3565b806002600082825461221f9190612a8f565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36108b760008383611ab7565b60006107fb8284612a8f565b825460009081908181156122f95760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16602082015261230e565b60408051808201909152600080825260208201525b905080602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16935061234384868863ffffffff16565b925060008211801561236d5750612358610ae9565b65ffffffffffff16816000015163ffffffff16145b156123c75761237b83612644565b60008881526020902083016000190180547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092166401000000000263ffffffff909216919091179055612456565b8660405180604001604052806123eb6123de610ae9565b65ffffffffffff16611814565b63ffffffff1681526020016123ff86612644565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b73ffffffffffffffffffffffffffffffffffffffff82166124e95760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016107c3565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156125855760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016107c3565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611ab283600084611ab7565b60006107fb8284612c7e565b600060ff8216601f8111156106e2576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8211156118905760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f323420626974730000000000000000000000000000000000000000000000000060648201526084016107c3565b6000602082840312156126ea57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146107fb57600080fd5b6000815180845260005b8181101561274057602081850181015186830182015201612724565b81811115612752576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006107fb602083018461271a565b803573ffffffffffffffffffffffffffffffffffffffff811681146127bc57600080fd5b919050565b600080604083850312156127d457600080fd5b6127dd83612798565b946020939093013593505050565b60008060006060848603121561280057600080fd5b61280984612798565b925061281760208501612798565b9150604084013590509250925092565b60006020828403121561283957600080fd5b5035919050565b60006020828403121561285257600080fd5b6107fb82612798565b7fff00000000000000000000000000000000000000000000000000000000000000881681526000602060e08184015261289760e084018a61271a565b83810360408501526128a9818a61271a565b6060850189905273ffffffffffffffffffffffffffffffffffffffff8816608086015260a0850187905284810360c0860152855180825283870192509083019060005b81811015612908578351835292840192918401916001016128ec565b50909c9b505050505050505050505050565b803560ff811681146127bc57600080fd5b60008060008060008060c0878903121561294457600080fd5b61294d87612798565b955060208701359450604087013593506129696060880161291a565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561299e57600080fd5b6129a788612798565b96506129b560208901612798565b955060408801359450606088013593506129d16080890161291a565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612a0057600080fd5b612a0983612798565b9150612a1760208401612798565b90509250929050565b60008060408385031215612a3357600080fd5b612a3c83612798565b9150602083013563ffffffff81168114612a5557600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612aa257612aa2612a60565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c90821680612b1957607f821691505b602082108103611a55577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f821115611ab257600081815260208120601f850160051c81016020861015612b795750805b601f850160051c820191505b81811015612b9857828155600101612b85565b505050505050565b815167ffffffffffffffff811115612bba57612bba612aa7565b612bce81612bc88454612b05565b84612b52565b602080601f831160018114612c035760008415612beb5750858301515b600019600386901b1c1916600185901b178555612b98565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015612c5057888601518255948401946001909101908401612c31565b5085821015612c6e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600082821015612c9057612c90612a60565b500390565b80516020808301519190811015611a555760001960209190910360031b1b16919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612d1e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_bridge\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_remoteToken\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"BRIDGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"CLOCK_MODE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"DOMAIN_SEPARATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"REMOTE_TOKEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"allowance\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"approve\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"burn\",\"inputs\":[{\"name\":\"_from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"checkpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"pos\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structERC20Votes.Checkpoint\",\"components\":[{\"name\":\"fromBlock\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"votes\",\"type\":\"uint224\",\"internalType\":\"uint224\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"clock\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint48\",\"internalType\":\"uint48\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decimals\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"decreaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"subtractedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegate\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegateBySig\",\"inputs\":[{\"name\":\"delegatee\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"expiry\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"delegates\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"eip712Domain\",\"inputs\":[],\"outputs\":[{\"name\":\"fields\",\"type\":\"bytes1\",\"internalType\":\"bytes1\"},{\"name\":\"name\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"version\",\"type\":\"string\",\"internalType\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"salt\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"extensions\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastTotalSupply\",\"inputs\":[{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPastVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"timepoint\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getVotes\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseAllowance\",\"inputs\":[{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"addedValue\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"name\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"nonces\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"numCheckpoints\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"permit\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"deadline\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"supportsInterface\",\"inputs\":[{\"name\":\"_interfaceId\",\"type\":\"bytes4\",\"internalType\":\"bytes4\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"symbol\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"pure\"},{\"type\":\"function\",\"name\":\"totalSupply\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transfer\",\"inputs\":[{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferFrom\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Approval\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"spender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Burn\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateChanged\",\"inputs\":[{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"fromDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"toDelegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegateVotesChanged\",\"inputs\":[{\"name\":\"delegate\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"previousBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"newBalance\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"EIP712DomainChanged\",\"inputs\":[],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Mint\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Transfer\",\"inputs\":[{\"name\":\"from\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"to\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"value\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidShortString\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"StringTooLong\",\"inputs\":[{\"name\":\"str\",\"type\":\"string\",\"internalType\":\"string\"}]}]", + Bin: "0x6101a06040523480156200001257600080fd5b506040516200369838038062003698833981016040819052620000359162000321565b604051806040016040528060058152602001644b726f6d6160d81b81525080604051806040016040528060018152602001603160f81b8152508484604051806020016040528060008152506040518060200160405280600081525081818160039081620000a39190620003fe565b506004620000b28282620003fe565b505050506001600160a01b03918216608052501660a052620000e2826005620001ac602090811b620012fb17901c565b61016052620000ff816006620001ac602090811b620012fb17901c565b61018052815160208084019190912061012052815190820120610140524660e0526200018f6101205161014051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60c0525050306101005250620001a4620001fc565b505062000547565b6000602083511015620001cc57620001c483620002be565b9050620001f6565b82620001e3836200030160201b6200132c1760201c565b90620001f09082620003fe565b5060ff90505b92915050565b600c54610100900460ff16156200026a5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084015b60405180910390fd5b600c5460ff90811614620002bc57600c805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b600080829050601f81511115620002ec578260405163305a27a960e01b8152600401620002619190620004ca565b8051620002f98262000522565b179392505050565b90565b80516001600160a01b03811681146200031c57600080fd5b919050565b600080604083850312156200033557600080fd5b620003408362000304565b9150620003506020840162000304565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200038457607f821691505b602082108103620003a557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003f957600081815260208120601f850160051c81016020861015620003d45750805b601f850160051c820191505b81811015620003f557828155600101620003e0565b5050505b505050565b81516001600160401b038111156200041a576200041a62000359565b62000432816200042b84546200036f565b84620003ab565b602080601f8311600181146200046a5760008415620004515750858301515b600019600386901b1c1916600185901b178555620003f5565b600085815260208120601f198616915b828110156200049b578886015182559484019460019091019084016200047a565b5085821015620004ba5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208083528351808285015260005b81811015620004f957858101830151858201604001528201620004db565b818111156200050c576000604083870101525b50601f01601f1916929092016040019392505050565b80516020808301519190811015620003a55760001960209190910360031b1b16919050565b60805160a05160c05160e05161010051610120516101405161016051610180516130d2620005c66000396000610ad001526000610aa5015260006117e6015260006117be01526000611719015260006117430152600061176d0152600081816106110152818161085d0152610c69015260006102a901526130d26000f3fe608060405234801561001057600080fd5b50600436106102775760003560e01c806379ba509711610160578063a457c2d7116100d8578063dd62ed3e1161008c578063ee9a31a211610071578063ee9a31a21461060c578063f1127ed814610633578063f2fde38b1461068557600080fd5b8063dd62ed3e146105c2578063e30c3978146105fb57600080fd5b8063c3cda520116100bd578063c3cda52014610589578063c4d66de81461059c578063d505accf146105af57600080fd5b8063a457c2d714610563578063a9059cbb1461057657600080fd5b80638e539e8c1161012f57806395d89b411161011457806395d89b41146105045780639ab24eb01461053d5780639dc29fac1461055057600080fd5b80638e539e8c146104d257806391ddadf4146104e557600080fd5b806379ba50971461048b5780637ecebe001461049357806384b0196e146104a65780638da5cb5b146104c157600080fd5b80633a46b1a8116101f3578063587cde1e116101c25780636fcfff45116101a75780636fcfff451461043257806370a082311461045a578063715018a61461048357600080fd5b8063587cde1e146103f35780635c19a95c1461041f57600080fd5b80633a46b1a81461038757806340c10f191461039a5780634bf5d7e9146103af57806354fd4d50146103b757600080fd5b806318160ddd1161024a578063313ce5671161022f578063313ce5671461035d5780633644e5151461036c578063395093511461037457600080fd5b806318160ddd1461033857806323b872dd1461034a57600080fd5b806301ffc9a71461027c578063033964be146102a457806306fdde03146102e3578063095ea7b314610325575b600080fd5b61028f61028a366004612a65565b610698565b60405190151581526020015b60405180910390f35b6102cb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161029b565b60408051808201909152600581527f4b726f6d6100000000000000000000000000000000000000000000000000000060208201525b60405161029b9190612b12565b61028f610333366004612b41565b610738565b6002545b60405190815260200161029b565b61028f610358366004612b6b565b610752565b6040516012815260200161029b565b61033c610776565b61028f610382366004612b41565b610785565b61033c610395366004612b41565b6107c4565b6103ad6103a8366004612b41565b610852565b005b610318610913565b6103186040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6102cb610401366004612ba7565b6001600160a01b039081166000908152600960205260409020541690565b6103ad61042d366004612ba7565b6109ab565b610445610440366004612ba7565b6109b8565b60405163ffffffff909116815260200161029b565b61033c610468366004612ba7565b6001600160a01b031660009081526020819052604090205490565b6103ad6109da565b6103ad6109ee565b61033c6104a1366004612ba7565b610a79565b6104ae610a97565b60405161029b9796959493929190612bc2565b603f546001600160a01b03166102cb565b61033c6104e0366004612c74565b610b3c565b6104ed610ba7565b60405165ffffffffffff909116815260200161029b565b60408051808201909152600381527f4b524f00000000000000000000000000000000000000000000000000000000006020820152610318565b61033c61054b366004612ba7565b610bb2565b6103ad61055e366004612b41565b610c5e565b61028f610571366004612b41565b610d06565b61028f610584366004612b41565b610db0565b6103ad610597366004612c9e565b610dbe565b6103ad6105aa366004612ba7565b610ef4565b6103ad6105bd366004612cf6565b611075565b61033c6105d0366004612d60565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6071546001600160a01b03166102cb565b6102cb7f000000000000000000000000000000000000000000000000000000000000000081565b610646610641366004612d93565b6111d9565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16928101929092520161029b565b6103ad610693366004612ba7565b611272565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f30a0c5a9000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000841682148061073057507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b60003361074681858561132f565b60019150505b92915050565b600033610760858285611487565b61076b858585611519565b506001949350505050565b600061078061170c565b905090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919061074690829086906107bf908790612e02565b61132f565b60006107ce610ba7565b65ffffffffffff1682106108295760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20667574757265206c6f6f6b75700000000000000060448201526064015b60405180910390fd5b6001600160a01b0383166000908152600a6020526040902061084b9083611837565b9392505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108935750603f546001600160a01b031633145b6109055760405162461bcd60e51b815260206004820152602e60248201527f476f7665726e616e6365546f6b656e3a206f6e6c7920627269646765206f722060448201527f6f776e65722063616e206d696e740000000000000000000000000000000000006064820152608401610820565b61090f828261194a565b5050565b60604361091e610ba7565b65ffffffffffff16146109735760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a2062726f6b656e20636c6f636b206d6f64650000006044820152606401610820565b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b6109b5338261199b565b50565b6001600160a01b0381166000908152600a602052604081205461074c90611a2c565b6109e2611aac565b6109ec6000611b06565b565b60715433906001600160a01b03168114610a705760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610820565b6109b581611b06565b6001600160a01b03811660009081526007602052604081205461074c565b600060608082808083610acb7f00000000000000000000000000000000000000000000000000000000000000006005611b37565b610af67f00000000000000000000000000000000000000000000000000000000000000006006611b37565b604080516000808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6000610b46610ba7565b65ffffffffffff168210610b9c5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20667574757265206c6f6f6b7570000000000000006044820152606401610820565b61074c600b83611837565b600061078043611bdb565b6001600160a01b0381166000908152600a60205260408120548015610c36576001600160a01b0383166000908152600a6020526040902080546000198301908110610bff57610bff612e49565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610c39565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cfc5760405162461bcd60e51b815260206004820152603160248201527f4b726f6d614d696e7461626c6545524332303a206f6e6c79206272696467652060448201527f63616e206d696e7420616e64206275726e0000000000000000000000000000006064820152608401610820565b61090f8282611c59565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919083811015610da35760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610820565b61076b828686840361132f565b600033610746818585611519565b83421115610e0e5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610820565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610e8890610e809060a00160405160208183030381529060405280519060200120611c9e565b858585611ce6565b9050610e9381611d0e565b8614610ee15760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610820565b610eeb818861199b565b50505050505050565b600c54610100900460ff1615808015610f145750600c54600160ff909116105b80610f2e5750303b158015610f2e5750600c5460ff166001145b610fa05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610820565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610ffe57600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b611006611d36565b61100f82611272565b801561090f57600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b834211156110c55760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610820565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886110f48c611d0e565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061114f82611c9e565b9050600061115f82878787611ce6565b9050896001600160a01b0316816001600160a01b0316146111c25760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610820565b6111cd8a8a8a61132f565b50505050505050505050565b60408051808201909152600080825260208201526001600160a01b0383166000908152600a60205260409020805463ffffffff841690811061121d5761121d612e49565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b61127a611aac565b607180546001600160a01b0383167fffffffffffffffffffffffff000000000000000000000000000000000000000090911681179091556112c3603f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60006020835110156113175761131083611dbb565b905061074c565b816113228482612f13565b5060ff905061074c565b90565b6001600160a01b0383166113aa5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166114265760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461151357818110156115065760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610820565b611513848484840361132f565b50505050565b6001600160a01b0383166115955760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166116115760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b038316600090815260208190526040902054818110156116a05760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611513848484611e17565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561176557507f000000000000000000000000000000000000000000000000000000000000000046145b1561178f57507f000000000000000000000000000000000000000000000000000000000000000090565b610780604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b81546000908181600581111561189157600061185284611e22565b61185c9085612ff1565b600088815260209020909150869082015463ffffffff1611156118815780915061188f565b61188c816001612e02565b92505b505b808210156118de5760006118a58383611f0a565b600088815260209020909150869082015463ffffffff1611156118ca578091506118d8565b6118d5816001612e02565b92505b50611891565b801561191f576000868152602090208101600019015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611922565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169695505050505050565b6119548282611f25565b816001600160a01b03167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161198f91815260200190565b60405180910390a25050565b6001600160a01b038281166000818152600960208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611513828483611fd1565b600063ffffffff821115611aa85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610820565b5090565b603f546001600160a01b031633146109ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610820565b607180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556109b58161210e565b606060ff8314611b4a5761131083612178565b818054611b5690612e78565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8290612e78565b8015611bcf5780601f10611ba457610100808354040283529160200191611bcf565b820191906000526020600020905b815481529060010190602001808311611bb257829003601f168201915b5050505050905061074c565b600065ffffffffffff821115611aa85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201527f38206269747300000000000000000000000000000000000000000000000000006064820152608401610820565b611c6382826121b7565b816001600160a01b03167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161198f91815260200190565b600061074c611cab61170c565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6000806000611cf7878787876121cf565b91509150611d04816122b1565b5095945050505050565b6001600160a01b03811660009081526007602052604090208054600181018255905b50919050565b600c54610100900460ff16611db35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610820565b6109ec612416565b600080829050601f81511115611dff57826040517f305a27a90000000000000000000000000000000000000000000000000000000081526004016108209190612b12565b8051611e0a82613008565b179392505050565b505050565b611e1283838361249c565b600081600003611e3457506000919050565b60006001611e41846124ce565b901c6001901b90506001818481611e5a57611e5a61302c565b048201901c90506001818481611e7257611e7261302c565b048201901c90506001818481611e8a57611e8a61302c565b048201901c90506001818481611ea257611ea261302c565b048201901c90506001818481611eba57611eba61302c565b048201901c90506001818481611ed257611ed261302c565b048201901c90506001818481611eea57611eea61302c565b048201901c905061084b81828581611f0457611f0461302c565b04612562565b6000611f19600284841861305b565b61084b90848416612e02565b611f2f8282612578565b6002547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1015611fc35760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610820565b611513600b61263f8361264b565b816001600160a01b0316836001600160a01b031614158015611ff35750600081115b15611e12576001600160a01b03831615612081576001600160a01b0383166000908152600a60205260408120819061202e906128148561264b565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612076929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611e12576001600160a01b0382166000908152600a6020526040812081906120b79061263f8561264b565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516120ff929190918252602082015260400190565b60405180910390a25050505050565b603f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060600061218583612820565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b6121c18282612861565b611513600b6128148361264b565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561220657506000905060036122a8565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561225a573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b0381166122a1576000600192509250506122a8565b9150600090505b94509492505050565b60008160048111156122c5576122c5613096565b036122cd5750565b60018160048111156122e1576122e1613096565b0361232e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610820565b600281600481111561234257612342613096565b0361238f5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610820565b60038160048111156123a3576123a3613096565b036109b55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610820565b600c54610100900460ff166124935760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610820565b6109ec33611b06565b6001600160a01b03838116600090815260096020526040808220548584168352912054611e1292918216911683611fd1565b600080608083901c156124e357608092831c92015b604083901c156124f557604092831c92015b602083901c1561250757602092831c92015b601083901c1561251957601092831c92015b600883901c1561252b57600892831c92015b600483901c1561253d57600492831c92015b600283901c1561254f57600292831c92015b600183901c1561074c5760010192915050565b6000818310612571578161084b565b5090919050565b6001600160a01b0382166125ce5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610820565b80600260008282546125e09190612e02565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361090f60008383611e17565b600061084b8284612e02565b825460009081908181156126ad5760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660208201526126c2565b60408051808201909152600080825260208201525b905080602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1693506126f784868863ffffffff16565b9250600082118015612721575061270c610ba7565b65ffffffffffff16816000015163ffffffff16145b1561277b5761272f836129d1565b60008881526020902083016000190180547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092166401000000000263ffffffff90921691909117905561280a565b86604051806040016040528061279f612792610ba7565b65ffffffffffff16611a2c565b63ffffffff1681526020016127b3866129d1565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b600061084b8284612ff1565b600060ff8216601f81111561074c576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166128dd5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166000908152602081905260409020548181101561296c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611e1283600084611e17565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821115611aa85760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610820565b600060208284031215612a7757600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461084b57600080fd5b6000815180845260005b81811015612acd57602081850181015186830182015201612ab1565b81811115612adf576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061084b6020830184612aa7565b80356001600160a01b0381168114612b3c57600080fd5b919050565b60008060408385031215612b5457600080fd5b612b5d83612b25565b946020939093013593505050565b600080600060608486031215612b8057600080fd5b612b8984612b25565b9250612b9760208501612b25565b9150604084013590509250925092565b600060208284031215612bb957600080fd5b61084b82612b25565b7fff00000000000000000000000000000000000000000000000000000000000000881681526000602060e081840152612bfe60e084018a612aa7565b8381036040850152612c10818a612aa7565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b81811015612c6257835183529284019291840191600101612c46565b50909c9b505050505050505050505050565b600060208284031215612c8657600080fd5b5035919050565b803560ff81168114612b3c57600080fd5b60008060008060008060c08789031215612cb757600080fd5b612cc087612b25565b95506020870135945060408701359350612cdc60608801612c8d565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a031215612d1157600080fd5b612d1a88612b25565b9650612d2860208901612b25565b95506040880135945060608801359350612d4460808901612c8d565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612d7357600080fd5b612d7c83612b25565b9150612d8a60208401612b25565b90509250929050565b60008060408385031215612da657600080fd5b612daf83612b25565b9150602083013563ffffffff81168114612dc857600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612e1557612e15612dd3565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c90821680612e8c57607f821691505b602082108103611d30577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f821115611e1257600081815260208120601f850160051c81016020861015612eec5750805b601f850160051c820191505b81811015612f0b57828155600101612ef8565b505050505050565b815167ffffffffffffffff811115612f2d57612f2d612e1a565b612f4181612f3b8454612e78565b84612ec5565b602080601f831160018114612f765760008415612f5e5750858301515b600019600386901b1c1916600185901b178555612f0b565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015612fc357888601518255948401946001909101908401612fa4565b5085821015612fe15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008282101561300357613003612dd3565b500390565b80516020808301519190811015611d305760001960209190910360031b1b16919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613091577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a", } // GovernanceTokenABI is the input ABI used to generate the binding from. @@ -774,6 +774,68 @@ func (_GovernanceToken *GovernanceTokenCallerSession) NumCheckpoints(account com return _GovernanceToken.Contract.NumCheckpoints(&_GovernanceToken.CallOpts, account) } +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_GovernanceToken *GovernanceTokenCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _GovernanceToken.contract.Call(opts, &out, "owner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_GovernanceToken *GovernanceTokenSession) Owner() (common.Address, error) { + return _GovernanceToken.Contract.Owner(&_GovernanceToken.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_GovernanceToken *GovernanceTokenCallerSession) Owner() (common.Address, error) { + return _GovernanceToken.Contract.Owner(&_GovernanceToken.CallOpts) +} + +// PendingOwner is a free data retrieval call binding the contract method 0xe30c3978. +// +// Solidity: function pendingOwner() view returns(address) +func (_GovernanceToken *GovernanceTokenCaller) PendingOwner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _GovernanceToken.contract.Call(opts, &out, "pendingOwner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// PendingOwner is a free data retrieval call binding the contract method 0xe30c3978. +// +// Solidity: function pendingOwner() view returns(address) +func (_GovernanceToken *GovernanceTokenSession) PendingOwner() (common.Address, error) { + return _GovernanceToken.Contract.PendingOwner(&_GovernanceToken.CallOpts) +} + +// PendingOwner is a free data retrieval call binding the contract method 0xe30c3978. +// +// Solidity: function pendingOwner() view returns(address) +func (_GovernanceToken *GovernanceTokenCallerSession) PendingOwner() (common.Address, error) { + return _GovernanceToken.Contract.PendingOwner(&_GovernanceToken.CallOpts) +} + // SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. // // Solidity: function supportsInterface(bytes4 _interfaceId) pure returns(bool) @@ -898,6 +960,27 @@ func (_GovernanceToken *GovernanceTokenCallerSession) Version() (string, error) return _GovernanceToken.Contract.Version(&_GovernanceToken.CallOpts) } +// AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. +// +// Solidity: function acceptOwnership() returns() +func (_GovernanceToken *GovernanceTokenTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _GovernanceToken.contract.Transact(opts, "acceptOwnership") +} + +// AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. +// +// Solidity: function acceptOwnership() returns() +func (_GovernanceToken *GovernanceTokenSession) AcceptOwnership() (*types.Transaction, error) { + return _GovernanceToken.Contract.AcceptOwnership(&_GovernanceToken.TransactOpts) +} + +// AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. +// +// Solidity: function acceptOwnership() returns() +func (_GovernanceToken *GovernanceTokenTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _GovernanceToken.Contract.AcceptOwnership(&_GovernanceToken.TransactOpts) +} + // Approve is a paid mutator transaction binding the contract method 0x095ea7b3. // // Solidity: function approve(address spender, uint256 amount) returns(bool) @@ -919,67 +1002,25 @@ func (_GovernanceToken *GovernanceTokenTransactorSession) Approve(spender common return _GovernanceToken.Contract.Approve(&_GovernanceToken.TransactOpts, spender, amount) } -// Burn is a paid mutator transaction binding the contract method 0x42966c68. -// -// Solidity: function burn(uint256 amount) returns() -func (_GovernanceToken *GovernanceTokenTransactor) Burn(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error) { - return _GovernanceToken.contract.Transact(opts, "burn", amount) -} - -// Burn is a paid mutator transaction binding the contract method 0x42966c68. -// -// Solidity: function burn(uint256 amount) returns() -func (_GovernanceToken *GovernanceTokenSession) Burn(amount *big.Int) (*types.Transaction, error) { - return _GovernanceToken.Contract.Burn(&_GovernanceToken.TransactOpts, amount) -} - -// Burn is a paid mutator transaction binding the contract method 0x42966c68. -// -// Solidity: function burn(uint256 amount) returns() -func (_GovernanceToken *GovernanceTokenTransactorSession) Burn(amount *big.Int) (*types.Transaction, error) { - return _GovernanceToken.Contract.Burn(&_GovernanceToken.TransactOpts, amount) -} - -// Burn0 is a paid mutator transaction binding the contract method 0x9dc29fac. +// Burn is a paid mutator transaction binding the contract method 0x9dc29fac. // // Solidity: function burn(address _from, uint256 _amount) returns() -func (_GovernanceToken *GovernanceTokenTransactor) Burn0(opts *bind.TransactOpts, _from common.Address, _amount *big.Int) (*types.Transaction, error) { - return _GovernanceToken.contract.Transact(opts, "burn0", _from, _amount) +func (_GovernanceToken *GovernanceTokenTransactor) Burn(opts *bind.TransactOpts, _from common.Address, _amount *big.Int) (*types.Transaction, error) { + return _GovernanceToken.contract.Transact(opts, "burn", _from, _amount) } -// Burn0 is a paid mutator transaction binding the contract method 0x9dc29fac. +// Burn is a paid mutator transaction binding the contract method 0x9dc29fac. // // Solidity: function burn(address _from, uint256 _amount) returns() -func (_GovernanceToken *GovernanceTokenSession) Burn0(_from common.Address, _amount *big.Int) (*types.Transaction, error) { - return _GovernanceToken.Contract.Burn0(&_GovernanceToken.TransactOpts, _from, _amount) +func (_GovernanceToken *GovernanceTokenSession) Burn(_from common.Address, _amount *big.Int) (*types.Transaction, error) { + return _GovernanceToken.Contract.Burn(&_GovernanceToken.TransactOpts, _from, _amount) } -// Burn0 is a paid mutator transaction binding the contract method 0x9dc29fac. +// Burn is a paid mutator transaction binding the contract method 0x9dc29fac. // // Solidity: function burn(address _from, uint256 _amount) returns() -func (_GovernanceToken *GovernanceTokenTransactorSession) Burn0(_from common.Address, _amount *big.Int) (*types.Transaction, error) { - return _GovernanceToken.Contract.Burn0(&_GovernanceToken.TransactOpts, _from, _amount) -} - -// BurnFrom is a paid mutator transaction binding the contract method 0x79cc6790. -// -// Solidity: function burnFrom(address account, uint256 amount) returns() -func (_GovernanceToken *GovernanceTokenTransactor) BurnFrom(opts *bind.TransactOpts, account common.Address, amount *big.Int) (*types.Transaction, error) { - return _GovernanceToken.contract.Transact(opts, "burnFrom", account, amount) -} - -// BurnFrom is a paid mutator transaction binding the contract method 0x79cc6790. -// -// Solidity: function burnFrom(address account, uint256 amount) returns() -func (_GovernanceToken *GovernanceTokenSession) BurnFrom(account common.Address, amount *big.Int) (*types.Transaction, error) { - return _GovernanceToken.Contract.BurnFrom(&_GovernanceToken.TransactOpts, account, amount) -} - -// BurnFrom is a paid mutator transaction binding the contract method 0x79cc6790. -// -// Solidity: function burnFrom(address account, uint256 amount) returns() -func (_GovernanceToken *GovernanceTokenTransactorSession) BurnFrom(account common.Address, amount *big.Int) (*types.Transaction, error) { - return _GovernanceToken.Contract.BurnFrom(&_GovernanceToken.TransactOpts, account, amount) +func (_GovernanceToken *GovernanceTokenTransactorSession) Burn(_from common.Address, _amount *big.Int) (*types.Transaction, error) { + return _GovernanceToken.Contract.Burn(&_GovernanceToken.TransactOpts, _from, _amount) } // DecreaseAllowance is a paid mutator transaction binding the contract method 0xa457c2d7. @@ -1066,25 +1107,46 @@ func (_GovernanceToken *GovernanceTokenTransactorSession) IncreaseAllowance(spen return _GovernanceToken.Contract.IncreaseAllowance(&_GovernanceToken.TransactOpts, spender, addedValue) } +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address _owner) returns() +func (_GovernanceToken *GovernanceTokenTransactor) Initialize(opts *bind.TransactOpts, _owner common.Address) (*types.Transaction, error) { + return _GovernanceToken.contract.Transact(opts, "initialize", _owner) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address _owner) returns() +func (_GovernanceToken *GovernanceTokenSession) Initialize(_owner common.Address) (*types.Transaction, error) { + return _GovernanceToken.Contract.Initialize(&_GovernanceToken.TransactOpts, _owner) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address _owner) returns() +func (_GovernanceToken *GovernanceTokenTransactorSession) Initialize(_owner common.Address) (*types.Transaction, error) { + return _GovernanceToken.Contract.Initialize(&_GovernanceToken.TransactOpts, _owner) +} + // Mint is a paid mutator transaction binding the contract method 0x40c10f19. // -// Solidity: function mint(address _account, uint256 _amount) returns() -func (_GovernanceToken *GovernanceTokenTransactor) Mint(opts *bind.TransactOpts, _account common.Address, _amount *big.Int) (*types.Transaction, error) { - return _GovernanceToken.contract.Transact(opts, "mint", _account, _amount) +// Solidity: function mint(address _to, uint256 _amount) returns() +func (_GovernanceToken *GovernanceTokenTransactor) Mint(opts *bind.TransactOpts, _to common.Address, _amount *big.Int) (*types.Transaction, error) { + return _GovernanceToken.contract.Transact(opts, "mint", _to, _amount) } // Mint is a paid mutator transaction binding the contract method 0x40c10f19. // -// Solidity: function mint(address _account, uint256 _amount) returns() -func (_GovernanceToken *GovernanceTokenSession) Mint(_account common.Address, _amount *big.Int) (*types.Transaction, error) { - return _GovernanceToken.Contract.Mint(&_GovernanceToken.TransactOpts, _account, _amount) +// Solidity: function mint(address _to, uint256 _amount) returns() +func (_GovernanceToken *GovernanceTokenSession) Mint(_to common.Address, _amount *big.Int) (*types.Transaction, error) { + return _GovernanceToken.Contract.Mint(&_GovernanceToken.TransactOpts, _to, _amount) } // Mint is a paid mutator transaction binding the contract method 0x40c10f19. // -// Solidity: function mint(address _account, uint256 _amount) returns() -func (_GovernanceToken *GovernanceTokenTransactorSession) Mint(_account common.Address, _amount *big.Int) (*types.Transaction, error) { - return _GovernanceToken.Contract.Mint(&_GovernanceToken.TransactOpts, _account, _amount) +// Solidity: function mint(address _to, uint256 _amount) returns() +func (_GovernanceToken *GovernanceTokenTransactorSession) Mint(_to common.Address, _amount *big.Int) (*types.Transaction, error) { + return _GovernanceToken.Contract.Mint(&_GovernanceToken.TransactOpts, _to, _amount) } // Permit is a paid mutator transaction binding the contract method 0xd505accf. @@ -1108,6 +1170,27 @@ func (_GovernanceToken *GovernanceTokenTransactorSession) Permit(owner common.Ad return _GovernanceToken.Contract.Permit(&_GovernanceToken.TransactOpts, owner, spender, value, deadline, v, r, s) } +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_GovernanceToken *GovernanceTokenTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _GovernanceToken.contract.Transact(opts, "renounceOwnership") +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_GovernanceToken *GovernanceTokenSession) RenounceOwnership() (*types.Transaction, error) { + return _GovernanceToken.Contract.RenounceOwnership(&_GovernanceToken.TransactOpts) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_GovernanceToken *GovernanceTokenTransactorSession) RenounceOwnership() (*types.Transaction, error) { + return _GovernanceToken.Contract.RenounceOwnership(&_GovernanceToken.TransactOpts) +} + // Transfer is a paid mutator transaction binding the contract method 0xa9059cbb. // // Solidity: function transfer(address to, uint256 amount) returns(bool) @@ -1150,6 +1233,27 @@ func (_GovernanceToken *GovernanceTokenTransactorSession) TransferFrom(from comm return _GovernanceToken.Contract.TransferFrom(&_GovernanceToken.TransactOpts, from, to, amount) } +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_GovernanceToken *GovernanceTokenTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { + return _GovernanceToken.contract.Transact(opts, "transferOwnership", newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_GovernanceToken *GovernanceTokenSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _GovernanceToken.Contract.TransferOwnership(&_GovernanceToken.TransactOpts, newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_GovernanceToken *GovernanceTokenTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _GovernanceToken.Contract.TransferOwnership(&_GovernanceToken.TransactOpts, newOwner) +} + // GovernanceTokenApprovalIterator is returned from FilterApproval and is used to iterate over the raw logs and unpacked data for Approval events raised by the GovernanceToken contract. type GovernanceTokenApprovalIterator struct { Event *GovernanceTokenApproval // Event containing the contract specifics and raw log @@ -1890,6 +1994,140 @@ func (_GovernanceToken *GovernanceTokenFilterer) ParseEIP712DomainChanged(log ty return event, nil } +// GovernanceTokenInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the GovernanceToken contract. +type GovernanceTokenInitializedIterator struct { + Event *GovernanceTokenInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GovernanceTokenInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GovernanceTokenInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GovernanceTokenInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GovernanceTokenInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovernanceTokenInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovernanceTokenInitialized represents a Initialized event raised by the GovernanceToken contract. +type GovernanceTokenInitialized struct { + Version uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_GovernanceToken *GovernanceTokenFilterer) FilterInitialized(opts *bind.FilterOpts) (*GovernanceTokenInitializedIterator, error) { + + logs, sub, err := _GovernanceToken.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &GovernanceTokenInitializedIterator{contract: _GovernanceToken.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_GovernanceToken *GovernanceTokenFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *GovernanceTokenInitialized) (event.Subscription, error) { + + logs, sub, err := _GovernanceToken.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GovernanceTokenInitialized) + if err := _GovernanceToken.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_GovernanceToken *GovernanceTokenFilterer) ParseInitialized(log types.Log) (*GovernanceTokenInitialized, error) { + event := new(GovernanceTokenInitialized) + if err := _GovernanceToken.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // GovernanceTokenMintIterator is returned from FilterMint and is used to iterate over the raw logs and unpacked data for Mint events raised by the GovernanceToken contract. type GovernanceTokenMintIterator struct { Event *GovernanceTokenMint // Event containing the contract specifics and raw log @@ -2035,6 +2273,312 @@ func (_GovernanceToken *GovernanceTokenFilterer) ParseMint(log types.Log) (*Gove return event, nil } +// GovernanceTokenOwnershipTransferStartedIterator is returned from FilterOwnershipTransferStarted and is used to iterate over the raw logs and unpacked data for OwnershipTransferStarted events raised by the GovernanceToken contract. +type GovernanceTokenOwnershipTransferStartedIterator struct { + Event *GovernanceTokenOwnershipTransferStarted // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GovernanceTokenOwnershipTransferStartedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GovernanceTokenOwnershipTransferStarted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GovernanceTokenOwnershipTransferStarted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GovernanceTokenOwnershipTransferStartedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovernanceTokenOwnershipTransferStartedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovernanceTokenOwnershipTransferStarted represents a OwnershipTransferStarted event raised by the GovernanceToken contract. +type GovernanceTokenOwnershipTransferStarted struct { + PreviousOwner common.Address + NewOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnershipTransferStarted is a free log retrieval operation binding the contract event 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700. +// +// Solidity: event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner) +func (_GovernanceToken *GovernanceTokenFilterer) FilterOwnershipTransferStarted(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*GovernanceTokenOwnershipTransferStartedIterator, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _GovernanceToken.contract.FilterLogs(opts, "OwnershipTransferStarted", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return &GovernanceTokenOwnershipTransferStartedIterator{contract: _GovernanceToken.contract, event: "OwnershipTransferStarted", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransferStarted is a free log subscription operation binding the contract event 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700. +// +// Solidity: event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner) +func (_GovernanceToken *GovernanceTokenFilterer) WatchOwnershipTransferStarted(opts *bind.WatchOpts, sink chan<- *GovernanceTokenOwnershipTransferStarted, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _GovernanceToken.contract.WatchLogs(opts, "OwnershipTransferStarted", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GovernanceTokenOwnershipTransferStarted) + if err := _GovernanceToken.contract.UnpackLog(event, "OwnershipTransferStarted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOwnershipTransferStarted is a log parse operation binding the contract event 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700. +// +// Solidity: event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner) +func (_GovernanceToken *GovernanceTokenFilterer) ParseOwnershipTransferStarted(log types.Log) (*GovernanceTokenOwnershipTransferStarted, error) { + event := new(GovernanceTokenOwnershipTransferStarted) + if err := _GovernanceToken.contract.UnpackLog(event, "OwnershipTransferStarted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// GovernanceTokenOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the GovernanceToken contract. +type GovernanceTokenOwnershipTransferredIterator struct { + Event *GovernanceTokenOwnershipTransferred // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GovernanceTokenOwnershipTransferredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GovernanceTokenOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GovernanceTokenOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GovernanceTokenOwnershipTransferredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GovernanceTokenOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GovernanceTokenOwnershipTransferred represents a OwnershipTransferred event raised by the GovernanceToken contract. +type GovernanceTokenOwnershipTransferred struct { + PreviousOwner common.Address + NewOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_GovernanceToken *GovernanceTokenFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*GovernanceTokenOwnershipTransferredIterator, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _GovernanceToken.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return &GovernanceTokenOwnershipTransferredIterator{contract: _GovernanceToken.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_GovernanceToken *GovernanceTokenFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *GovernanceTokenOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _GovernanceToken.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GovernanceTokenOwnershipTransferred) + if err := _GovernanceToken.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_GovernanceToken *GovernanceTokenFilterer) ParseOwnershipTransferred(log types.Log) (*GovernanceTokenOwnershipTransferred, error) { + event := new(GovernanceTokenOwnershipTransferred) + if err := _GovernanceToken.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // GovernanceTokenTransferIterator is returned from FilterTransfer and is used to iterate over the raw logs and unpacked data for Transfer events raised by the GovernanceToken contract. type GovernanceTokenTransferIterator struct { Event *GovernanceTokenTransfer // Event containing the contract specifics and raw log diff --git a/kroma-bindings/bindings/governancetoken_more.go b/kroma-bindings/bindings/governancetoken_more.go index ef2c9c5861..5aa431f5d4 100644 --- a/kroma-bindings/bindings/governancetoken_more.go +++ b/kroma-bindings/bindings/governancetoken_more.go @@ -9,11 +9,11 @@ import ( "github.com/ethereum-optimism/optimism/op-bindings/solc" ) -const GovernanceTokenStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_balances\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_mapping(t_address,t_uint256)\"},{\"astId\":1001,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_allowances\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_mapping(t_address,t_mapping(t_address,t_uint256))\"},{\"astId\":1002,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_totalSupply\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_uint256\"},{\"astId\":1003,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_name\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_string_storage\"},{\"astId\":1004,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_symbol\",\"offset\":0,\"slot\":\"4\",\"type\":\"t_string_storage\"},{\"astId\":1005,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_nameFallback\",\"offset\":0,\"slot\":\"5\",\"type\":\"t_string_storage\"},{\"astId\":1006,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_versionFallback\",\"offset\":0,\"slot\":\"6\",\"type\":\"t_string_storage\"},{\"astId\":1007,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_nonces\",\"offset\":0,\"slot\":\"7\",\"type\":\"t_mapping(t_address,t_struct(Counter)1013_storage)\"},{\"astId\":1008,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_PERMIT_TYPEHASH_DEPRECATED_SLOT\",\"offset\":0,\"slot\":\"8\",\"type\":\"t_bytes32\"},{\"astId\":1009,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_delegates\",\"offset\":0,\"slot\":\"9\",\"type\":\"t_mapping(t_address,t_address)\"},{\"astId\":1010,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_checkpoints\",\"offset\":0,\"slot\":\"10\",\"type\":\"t_mapping(t_address,t_array(t_struct(Checkpoint)1012_storage)dyn_storage)\"},{\"astId\":1011,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_totalSupplyCheckpoints\",\"offset\":0,\"slot\":\"11\",\"type\":\"t_array(t_struct(Checkpoint)1012_storage)dyn_storage\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_struct(Checkpoint)1012_storage)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"struct ERC20Votes.Checkpoint[]\",\"numberOfBytes\":\"32\",\"base\":\"t_struct(Checkpoint)1012_storage\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_address,t_address)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e address)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_address\"},\"t_mapping(t_address,t_array(t_struct(Checkpoint)1012_storage)dyn_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e struct ERC20Votes.Checkpoint[])\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_array(t_struct(Checkpoint)1012_storage)dyn_storage\"},\"t_mapping(t_address,t_mapping(t_address,t_uint256))\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e mapping(address =\u003e uint256))\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_mapping(t_address,t_uint256)\"},\"t_mapping(t_address,t_struct(Counter)1013_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e struct Counters.Counter)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_struct(Counter)1013_storage\"},\"t_mapping(t_address,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint256\"},\"t_string_storage\":{\"encoding\":\"bytes\",\"label\":\"string\",\"numberOfBytes\":\"32\"},\"t_struct(Checkpoint)1012_storage\":{\"encoding\":\"inplace\",\"label\":\"struct ERC20Votes.Checkpoint\",\"numberOfBytes\":\"32\"},\"t_struct(Counter)1013_storage\":{\"encoding\":\"inplace\",\"label\":\"struct Counters.Counter\",\"numberOfBytes\":\"32\"},\"t_uint224\":{\"encoding\":\"inplace\",\"label\":\"uint224\",\"numberOfBytes\":\"28\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint32\":{\"encoding\":\"inplace\",\"label\":\"uint32\",\"numberOfBytes\":\"4\"}}}" +const GovernanceTokenStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_balances\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_mapping(t_address,t_uint256)\"},{\"astId\":1001,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_allowances\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_mapping(t_address,t_mapping(t_address,t_uint256))\"},{\"astId\":1002,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_totalSupply\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_uint256\"},{\"astId\":1003,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_name\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_string_storage\"},{\"astId\":1004,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_symbol\",\"offset\":0,\"slot\":\"4\",\"type\":\"t_string_storage\"},{\"astId\":1005,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_nameFallback\",\"offset\":0,\"slot\":\"5\",\"type\":\"t_string_storage\"},{\"astId\":1006,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_versionFallback\",\"offset\":0,\"slot\":\"6\",\"type\":\"t_string_storage\"},{\"astId\":1007,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_nonces\",\"offset\":0,\"slot\":\"7\",\"type\":\"t_mapping(t_address,t_struct(Counter)1020_storage)\"},{\"astId\":1008,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_PERMIT_TYPEHASH_DEPRECATED_SLOT\",\"offset\":0,\"slot\":\"8\",\"type\":\"t_bytes32\"},{\"astId\":1009,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_delegates\",\"offset\":0,\"slot\":\"9\",\"type\":\"t_mapping(t_address,t_address)\"},{\"astId\":1010,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_checkpoints\",\"offset\":0,\"slot\":\"10\",\"type\":\"t_mapping(t_address,t_array(t_struct(Checkpoint)1019_storage)dyn_storage)\"},{\"astId\":1011,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_totalSupplyCheckpoints\",\"offset\":0,\"slot\":\"11\",\"type\":\"t_array(t_struct(Checkpoint)1019_storage)dyn_storage\"},{\"astId\":1012,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"12\",\"type\":\"t_uint8\"},{\"astId\":1013,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"12\",\"type\":\"t_bool\"},{\"astId\":1014,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"13\",\"type\":\"t_array(t_uint256)50_storage\"},{\"astId\":1015,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"63\",\"type\":\"t_address\"},{\"astId\":1016,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"64\",\"type\":\"t_array(t_uint256)49_storage\"},{\"astId\":1017,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"_pendingOwner\",\"offset\":0,\"slot\":\"113\",\"type\":\"t_address\"},{\"astId\":1018,\"contract\":\"contracts/governance/GovernanceToken.sol:GovernanceToken\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"114\",\"type\":\"t_array(t_uint256)49_storage\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_struct(Checkpoint)1019_storage)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"struct ERC20Votes.Checkpoint[]\",\"numberOfBytes\":\"32\",\"base\":\"t_struct(Checkpoint)1019_storage\"},\"t_array(t_uint256)49_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\",\"base\":\"t_uint256\"},\"t_array(t_uint256)50_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\",\"base\":\"t_uint256\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_address,t_address)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e address)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_address\"},\"t_mapping(t_address,t_array(t_struct(Checkpoint)1019_storage)dyn_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e struct ERC20Votes.Checkpoint[])\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_array(t_struct(Checkpoint)1019_storage)dyn_storage\"},\"t_mapping(t_address,t_mapping(t_address,t_uint256))\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e mapping(address =\u003e uint256))\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_mapping(t_address,t_uint256)\"},\"t_mapping(t_address,t_struct(Counter)1020_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e struct Counters.Counter)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_struct(Counter)1020_storage\"},\"t_mapping(t_address,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint256\"},\"t_string_storage\":{\"encoding\":\"bytes\",\"label\":\"string\",\"numberOfBytes\":\"32\"},\"t_struct(Checkpoint)1019_storage\":{\"encoding\":\"inplace\",\"label\":\"struct ERC20Votes.Checkpoint\",\"numberOfBytes\":\"32\"},\"t_struct(Counter)1020_storage\":{\"encoding\":\"inplace\",\"label\":\"struct Counters.Counter\",\"numberOfBytes\":\"32\"},\"t_uint224\":{\"encoding\":\"inplace\",\"label\":\"uint224\",\"numberOfBytes\":\"28\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint32\":{\"encoding\":\"inplace\",\"label\":\"uint32\",\"numberOfBytes\":\"4\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" var GovernanceTokenStorageLayout = new(solc.StorageLayout) -var GovernanceTokenDeployedBin = "0x608060405234801561001057600080fd5b506004361061020b5760003560e01c80636fcfff451161012a5780639ab24eb0116100bd578063c3cda5201161008c578063dd62ed3e11610071578063dd62ed3e1461056f578063ee9a31a2146105b5578063f1127ed8146105dc57600080fd5b8063c3cda52014610549578063d505accf1461055c57600080fd5b80639ab24eb0146104fd5780639dc29fac14610510578063a457c2d714610523578063a9059cbb1461053657600080fd5b806384b0196e116100f957806384b0196e146104775780638e539e8c1461049257806391ddadf4146104a557806395d89b41146104c457600080fd5b80636fcfff45146103f357806370a082311461041b57806379cc6790146104515780637ecebe001461046457600080fd5b806339509351116101a25780634bf5d7e9116101715780634bf5d7e91461036357806354fd4d501461036b578063587cde1e146103a75780635c19a95c146103e057600080fd5b806339509351146103155780633a46b1a81461032857806340c10f191461033b57806342966c681461035057600080fd5b806318160ddd116101de57806318160ddd146102d957806323b872dd146102eb578063313ce567146102fe5780633644e5151461030d57600080fd5b806301ffc9a714610210578063033964be1461023857806306fdde0314610284578063095ea7b3146102c6575b600080fd5b61022361021e3660046126d8565b61062e565b60405190151581526020015b60405180910390f35b61025f7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161022f565b60408051808201909152600581527f4b726f6d6100000000000000000000000000000000000000000000000000000060208201525b60405161022f9190612785565b6102236102d43660046127c1565b6106ce565b6002545b60405190815260200161022f565b6102236102f93660046127eb565b6106e8565b6040516012815260200161022f565b6102dd61070c565b6102236103233660046127c1565b61071b565b6102dd6103363660046127c1565b610767565b61034e6103493660046127c1565b610802565b005b61034e61035e366004612827565b6108bb565b6102b96108c8565b6102b96040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b61025f6103b5366004612840565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600960205260409020541690565b61034e6103ee366004612840565b610960565b610406610401366004612840565b61096a565b60405163ffffffff909116815260200161022f565b6102dd610429366004612840565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61034e61045f3660046127c1565b610999565b6102dd610472366004612840565b6109ae565b61047f6109d9565b60405161022f979695949392919061285b565b6102dd6104a0366004612827565b610a7e565b6104ad610ae9565b60405165ffffffffffff909116815260200161022f565b60408051808201909152600381527f4b524f000000000000000000000000000000000000000000000000000000000060208201526102b9565b6102dd61050b366004612840565b610af4565b61034e61051e3660046127c1565b610bba565b6102236105313660046127c1565b610c65565b6102236105443660046127c1565b610d1c565b61034e61055736600461292b565b610d2a565b61034e61056a366004612983565b610e6d565b6102dd61057d3660046129ed565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b61025f7f000000000000000000000000000000000000000000000000000000000000000081565b6105ef6105ea366004612a20565b610ff8565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16928101929092520161022f565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f30a0c5a9000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084168214806106c657507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b6000336106dc8185856110d2565b60019150505b92915050565b6000336106f6858285611251565b6107018585856112f0565b506001949350505050565b6000610716611517565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906106dc9082908690610762908790612a8f565b6110d2565b6000610771610ae9565b65ffffffffffff1682106107cc5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20667574757265206c6f6f6b75700000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600a602052604090206107fb908361164f565b9392505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146108ad5760405162461bcd60e51b815260206004820152602560248201527f476f7665726e616e6365546f6b656e3a206f6e6c79206d696e7465722063616e60448201527f206d696e7400000000000000000000000000000000000000000000000000000060648201526084016107c3565b6108b78282611762565b5050565b6108c5338261176c565b50565b6060436108d3610ae9565b65ffffffffffff16146109285760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a2062726f6b656e20636c6f636b206d6f646500000060448201526064016107c3565b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b6108c53382611776565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a60205260408120546106e290611814565b6109a4823383611251565b6108b7828261176c565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600760205260408120546106e2565b600060608082808083610a0d7f00000000000000000000000000000000000000000000000000000000000000006005611894565b610a387f00000000000000000000000000000000000000000000000000000000000000006006611894565b604080516000808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6000610a88610ae9565b65ffffffffffff168210610ade5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20667574757265206c6f6f6b75700000000000000060448201526064016107c3565b6106e2600b8361164f565b600061071643611938565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a60205260408120548015610b925773ffffffffffffffffffffffffffffffffffffffff83166000908152600a6020526040902080546000198301908110610b5b57610b5b612ad6565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610b95565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146109a45760405162461bcd60e51b815260206004820152603160248201527f4b726f6d614d696e7461626c6545524332303a206f6e6c79206272696467652060448201527f63616e206d696e7420616e64206275726e00000000000000000000000000000060648201526084016107c3565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610d0f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016107c3565b61070182868684036110d2565b6000336106dc8185856112f0565b83421115610d7a5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e6174757265206578706972656400000060448201526064016107c3565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf602082015273ffffffffffffffffffffffffffffffffffffffff8816918101919091526060810186905260808101859052600090610e0190610df99060a001604051602081830303815290604052805190602001206119b6565b8585856119fe565b9050610e0c81611a26565b8614610e5a5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e63650000000000000060448201526064016107c3565b610e648188611776565b50505050505050565b83421115610ebd5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e6500000060448201526064016107c3565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610eec8c611a26565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610f54826119b6565b90506000610f64828787876119fe565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fe15760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e6174757265000060448201526064016107c3565b610fec8a8a8a6110d2565b50505050505050505050565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff83166000908152600a60205260409020805463ffffffff841690811061104957611049612ad6565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b60006020835110156110ba576110b383611a5b565b90506106e2565b816110c58482612ba0565b5060ff90506106e2565b90565b73ffffffffffffffffffffffffffffffffffffffff831661115a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016107c3565b73ffffffffffffffffffffffffffffffffffffffff82166111e35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016107c3565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff83811660009081526001602090815260408083209386168352929052205460001981146112ea57818110156112dd5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016107c3565b6112ea84848484036110d2565b50505050565b73ffffffffffffffffffffffffffffffffffffffff83166113795760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016107c3565b73ffffffffffffffffffffffffffffffffffffffff82166114025760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016107c3565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260409020548181101561149e5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016107c3565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36112ea848484611ab7565b60003073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614801561157d57507f000000000000000000000000000000000000000000000000000000000000000046145b156115a757507f000000000000000000000000000000000000000000000000000000000000000090565b610716604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b8154600090818160058111156116a957600061166a84611ac2565b6116749085612c7e565b600088815260209020909150869082015463ffffffff161115611699578091506116a7565b6116a4816001612a8f565b92505b505b808210156116f65760006116bd8383611baa565b600088815260209020909150869082015463ffffffff1611156116e2578091506116f0565b6116ed816001612a8f565b92505b506116a9565b8015611737576000868152602090208101600019015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661173a565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169695505050505050565b6108b78282611bc5565b6108b78282611c71565b73ffffffffffffffffffffffffffffffffffffffff8281166000818152600960208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46112ea828483611c89565b600063ffffffff8211156118905760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f322062697473000000000000000000000000000000000000000000000000000060648201526084016107c3565b5090565b606060ff83146118a7576110b383611e2e565b8180546118b390612b05565b80601f01602080910402602001604051908101604052809291908181526020018280546118df90612b05565b801561192c5780601f106119015761010080835404028352916020019161192c565b820191906000526020600020905b81548152906001019060200180831161190f57829003601f168201915b505050505090506106e2565b600065ffffffffffff8211156118905760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201527f382062697473000000000000000000000000000000000000000000000000000060648201526084016107c3565b60006106e26119c3611517565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6000806000611a0f87878787611e6d565b91509150611a1c81611f5c565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604090208054600181018255905b50919050565b600080829050601f81511115611a9f57826040517f305a27a90000000000000000000000000000000000000000000000000000000081526004016107c39190612785565b8051611aaa82612c95565b179392505050565b505050565b611ab28383836120c1565b600081600003611ad457506000919050565b60006001611ae184612100565b901c6001901b90506001818481611afa57611afa612cb9565b048201901c90506001818481611b1257611b12612cb9565b048201901c90506001818481611b2a57611b2a612cb9565b048201901c90506001818481611b4257611b42612cb9565b048201901c90506001818481611b5a57611b5a612cb9565b048201901c90506001818481611b7257611b72612cb9565b048201901c90506001818481611b8a57611b8a612cb9565b048201901c90506107fb81828581611ba457611ba4612cb9565b04612194565b6000611bb96002848418612ce8565b6107fb90848416612a8f565b611bcf82826121aa565b6002547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1015611c635760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f7465730000000000000000000000000000000060648201526084016107c3565b6112ea600b61228b83612297565b611c7b8282612460565b6112ea600b6125f783612297565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611cc55750600081115b15611ab25773ffffffffffffffffffffffffffffffffffffffff831615611d7a5773ffffffffffffffffffffffffffffffffffffffff83166000908152600a602052604081208190611d1a906125f785612297565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611d6f929190918252602082015260400190565b60405180910390a250505b73ffffffffffffffffffffffffffffffffffffffff821615611ab25773ffffffffffffffffffffffffffffffffffffffff82166000908152600a602052604081208190611dca9061228b85612297565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611e1f929190918252602082015260400190565b60405180910390a25050505050565b60606000611e3b83612603565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611ea45750600090506003611f53565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611ef8573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611f4c57600060019250925050611f53565b9150600090505b94509492505050565b6000816004811115611f7057611f70612d23565b03611f785750565b6001816004811115611f8c57611f8c612d23565b03611fd95760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016107c3565b6002816004811115611fed57611fed612d23565b0361203a5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016107c3565b600381600481111561204e5761204e612d23565b036108c55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016107c3565b73ffffffffffffffffffffffffffffffffffffffff838116600090815260096020526040808220548584168352912054611ab292918216911683611c89565b600080608083901c1561211557608092831c92015b604083901c1561212757604092831c92015b602083901c1561213957602092831c92015b601083901c1561214b57601092831c92015b600883901c1561215d57600892831c92015b600483901c1561216f57600492831c92015b600283901c1561218157600292831c92015b600183901c156106e25760010192915050565b60008183106121a357816107fb565b5090919050565b73ffffffffffffffffffffffffffffffffffffffff821661220d5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016107c3565b806002600082825461221f9190612a8f565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36108b760008383611ab7565b60006107fb8284612a8f565b825460009081908181156122f95760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16602082015261230e565b60408051808201909152600080825260208201525b905080602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16935061234384868863ffffffff16565b925060008211801561236d5750612358610ae9565b65ffffffffffff16816000015163ffffffff16145b156123c75761237b83612644565b60008881526020902083016000190180547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092166401000000000263ffffffff909216919091179055612456565b8660405180604001604052806123eb6123de610ae9565b65ffffffffffff16611814565b63ffffffff1681526020016123ff86612644565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b73ffffffffffffffffffffffffffffffffffffffff82166124e95760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016107c3565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156125855760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016107c3565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611ab283600084611ab7565b60006107fb8284612c7e565b600060ff8216601f8111156106e2576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8211156118905760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f323420626974730000000000000000000000000000000000000000000000000060648201526084016107c3565b6000602082840312156126ea57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146107fb57600080fd5b6000815180845260005b8181101561274057602081850181015186830182015201612724565b81811115612752576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006107fb602083018461271a565b803573ffffffffffffffffffffffffffffffffffffffff811681146127bc57600080fd5b919050565b600080604083850312156127d457600080fd5b6127dd83612798565b946020939093013593505050565b60008060006060848603121561280057600080fd5b61280984612798565b925061281760208501612798565b9150604084013590509250925092565b60006020828403121561283957600080fd5b5035919050565b60006020828403121561285257600080fd5b6107fb82612798565b7fff00000000000000000000000000000000000000000000000000000000000000881681526000602060e08184015261289760e084018a61271a565b83810360408501526128a9818a61271a565b6060850189905273ffffffffffffffffffffffffffffffffffffffff8816608086015260a0850187905284810360c0860152855180825283870192509083019060005b81811015612908578351835292840192918401916001016128ec565b50909c9b505050505050505050505050565b803560ff811681146127bc57600080fd5b60008060008060008060c0878903121561294457600080fd5b61294d87612798565b955060208701359450604087013593506129696060880161291a565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561299e57600080fd5b6129a788612798565b96506129b560208901612798565b955060408801359450606088013593506129d16080890161291a565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612a0057600080fd5b612a0983612798565b9150612a1760208401612798565b90509250929050565b60008060408385031215612a3357600080fd5b612a3c83612798565b9150602083013563ffffffff81168114612a5557600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612aa257612aa2612a60565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c90821680612b1957607f821691505b602082108103611a55577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f821115611ab257600081815260208120601f850160051c81016020861015612b795750805b601f850160051c820191505b81811015612b9857828155600101612b85565b505050505050565b815167ffffffffffffffff811115612bba57612bba612aa7565b612bce81612bc88454612b05565b84612b52565b602080601f831160018114612c035760008415612beb5750858301515b600019600386901b1c1916600185901b178555612b98565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015612c5057888601518255948401946001909101908401612c31565b5085821015612c6e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600082821015612c9057612c90612a60565b500390565b80516020808301519190811015611a555760001960209190910360031b1b16919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612d1e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a" +var GovernanceTokenDeployedBin = "0x608060405234801561001057600080fd5b50600436106102775760003560e01c806379ba509711610160578063a457c2d7116100d8578063dd62ed3e1161008c578063ee9a31a211610071578063ee9a31a21461060c578063f1127ed814610633578063f2fde38b1461068557600080fd5b8063dd62ed3e146105c2578063e30c3978146105fb57600080fd5b8063c3cda520116100bd578063c3cda52014610589578063c4d66de81461059c578063d505accf146105af57600080fd5b8063a457c2d714610563578063a9059cbb1461057657600080fd5b80638e539e8c1161012f57806395d89b411161011457806395d89b41146105045780639ab24eb01461053d5780639dc29fac1461055057600080fd5b80638e539e8c146104d257806391ddadf4146104e557600080fd5b806379ba50971461048b5780637ecebe001461049357806384b0196e146104a65780638da5cb5b146104c157600080fd5b80633a46b1a8116101f3578063587cde1e116101c25780636fcfff45116101a75780636fcfff451461043257806370a082311461045a578063715018a61461048357600080fd5b8063587cde1e146103f35780635c19a95c1461041f57600080fd5b80633a46b1a81461038757806340c10f191461039a5780634bf5d7e9146103af57806354fd4d50146103b757600080fd5b806318160ddd1161024a578063313ce5671161022f578063313ce5671461035d5780633644e5151461036c578063395093511461037457600080fd5b806318160ddd1461033857806323b872dd1461034a57600080fd5b806301ffc9a71461027c578063033964be146102a457806306fdde03146102e3578063095ea7b314610325575b600080fd5b61028f61028a366004612a65565b610698565b60405190151581526020015b60405180910390f35b6102cb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161029b565b60408051808201909152600581527f4b726f6d6100000000000000000000000000000000000000000000000000000060208201525b60405161029b9190612b12565b61028f610333366004612b41565b610738565b6002545b60405190815260200161029b565b61028f610358366004612b6b565b610752565b6040516012815260200161029b565b61033c610776565b61028f610382366004612b41565b610785565b61033c610395366004612b41565b6107c4565b6103ad6103a8366004612b41565b610852565b005b610318610913565b6103186040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6102cb610401366004612ba7565b6001600160a01b039081166000908152600960205260409020541690565b6103ad61042d366004612ba7565b6109ab565b610445610440366004612ba7565b6109b8565b60405163ffffffff909116815260200161029b565b61033c610468366004612ba7565b6001600160a01b031660009081526020819052604090205490565b6103ad6109da565b6103ad6109ee565b61033c6104a1366004612ba7565b610a79565b6104ae610a97565b60405161029b9796959493929190612bc2565b603f546001600160a01b03166102cb565b61033c6104e0366004612c74565b610b3c565b6104ed610ba7565b60405165ffffffffffff909116815260200161029b565b60408051808201909152600381527f4b524f00000000000000000000000000000000000000000000000000000000006020820152610318565b61033c61054b366004612ba7565b610bb2565b6103ad61055e366004612b41565b610c5e565b61028f610571366004612b41565b610d06565b61028f610584366004612b41565b610db0565b6103ad610597366004612c9e565b610dbe565b6103ad6105aa366004612ba7565b610ef4565b6103ad6105bd366004612cf6565b611075565b61033c6105d0366004612d60565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6071546001600160a01b03166102cb565b6102cb7f000000000000000000000000000000000000000000000000000000000000000081565b610646610641366004612d93565b6111d9565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16928101929092520161029b565b6103ad610693366004612ba7565b611272565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f30a0c5a9000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000841682148061073057507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b60003361074681858561132f565b60019150505b92915050565b600033610760858285611487565b61076b858585611519565b506001949350505050565b600061078061170c565b905090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919061074690829086906107bf908790612e02565b61132f565b60006107ce610ba7565b65ffffffffffff1682106108295760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20667574757265206c6f6f6b75700000000000000060448201526064015b60405180910390fd5b6001600160a01b0383166000908152600a6020526040902061084b9083611837565b9392505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108935750603f546001600160a01b031633145b6109055760405162461bcd60e51b815260206004820152602e60248201527f476f7665726e616e6365546f6b656e3a206f6e6c7920627269646765206f722060448201527f6f776e65722063616e206d696e740000000000000000000000000000000000006064820152608401610820565b61090f828261194a565b5050565b60604361091e610ba7565b65ffffffffffff16146109735760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a2062726f6b656e20636c6f636b206d6f64650000006044820152606401610820565b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b6109b5338261199b565b50565b6001600160a01b0381166000908152600a602052604081205461074c90611a2c565b6109e2611aac565b6109ec6000611b06565b565b60715433906001600160a01b03168114610a705760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610820565b6109b581611b06565b6001600160a01b03811660009081526007602052604081205461074c565b600060608082808083610acb7f00000000000000000000000000000000000000000000000000000000000000006005611b37565b610af67f00000000000000000000000000000000000000000000000000000000000000006006611b37565b604080516000808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6000610b46610ba7565b65ffffffffffff168210610b9c5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20667574757265206c6f6f6b7570000000000000006044820152606401610820565b61074c600b83611837565b600061078043611bdb565b6001600160a01b0381166000908152600a60205260408120548015610c36576001600160a01b0383166000908152600a6020526040902080546000198301908110610bff57610bff612e49565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610c39565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cfc5760405162461bcd60e51b815260206004820152603160248201527f4b726f6d614d696e7461626c6545524332303a206f6e6c79206272696467652060448201527f63616e206d696e7420616e64206275726e0000000000000000000000000000006064820152608401610820565b61090f8282611c59565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919083811015610da35760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610820565b61076b828686840361132f565b600033610746818585611519565b83421115610e0e5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610820565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610e8890610e809060a00160405160208183030381529060405280519060200120611c9e565b858585611ce6565b9050610e9381611d0e565b8614610ee15760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610820565b610eeb818861199b565b50505050505050565b600c54610100900460ff1615808015610f145750600c54600160ff909116105b80610f2e5750303b158015610f2e5750600c5460ff166001145b610fa05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610820565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610ffe57600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b611006611d36565b61100f82611272565b801561090f57600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b834211156110c55760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610820565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886110f48c611d0e565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061114f82611c9e565b9050600061115f82878787611ce6565b9050896001600160a01b0316816001600160a01b0316146111c25760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610820565b6111cd8a8a8a61132f565b50505050505050505050565b60408051808201909152600080825260208201526001600160a01b0383166000908152600a60205260409020805463ffffffff841690811061121d5761121d612e49565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b61127a611aac565b607180546001600160a01b0383167fffffffffffffffffffffffff000000000000000000000000000000000000000090911681179091556112c3603f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60006020835110156113175761131083611dbb565b905061074c565b816113228482612f13565b5060ff905061074c565b90565b6001600160a01b0383166113aa5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166114265760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461151357818110156115065760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610820565b611513848484840361132f565b50505050565b6001600160a01b0383166115955760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166116115760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b038316600090815260208190526040902054818110156116a05760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611513848484611e17565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561176557507f000000000000000000000000000000000000000000000000000000000000000046145b1561178f57507f000000000000000000000000000000000000000000000000000000000000000090565b610780604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b81546000908181600581111561189157600061185284611e22565b61185c9085612ff1565b600088815260209020909150869082015463ffffffff1611156118815780915061188f565b61188c816001612e02565b92505b505b808210156118de5760006118a58383611f0a565b600088815260209020909150869082015463ffffffff1611156118ca578091506118d8565b6118d5816001612e02565b92505b50611891565b801561191f576000868152602090208101600019015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611922565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169695505050505050565b6119548282611f25565b816001600160a01b03167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161198f91815260200190565b60405180910390a25050565b6001600160a01b038281166000818152600960208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611513828483611fd1565b600063ffffffff821115611aa85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610820565b5090565b603f546001600160a01b031633146109ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610820565b607180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556109b58161210e565b606060ff8314611b4a5761131083612178565b818054611b5690612e78565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8290612e78565b8015611bcf5780601f10611ba457610100808354040283529160200191611bcf565b820191906000526020600020905b815481529060010190602001808311611bb257829003601f168201915b5050505050905061074c565b600065ffffffffffff821115611aa85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201527f38206269747300000000000000000000000000000000000000000000000000006064820152608401610820565b611c6382826121b7565b816001600160a01b03167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161198f91815260200190565b600061074c611cab61170c565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6000806000611cf7878787876121cf565b91509150611d04816122b1565b5095945050505050565b6001600160a01b03811660009081526007602052604090208054600181018255905b50919050565b600c54610100900460ff16611db35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610820565b6109ec612416565b600080829050601f81511115611dff57826040517f305a27a90000000000000000000000000000000000000000000000000000000081526004016108209190612b12565b8051611e0a82613008565b179392505050565b505050565b611e1283838361249c565b600081600003611e3457506000919050565b60006001611e41846124ce565b901c6001901b90506001818481611e5a57611e5a61302c565b048201901c90506001818481611e7257611e7261302c565b048201901c90506001818481611e8a57611e8a61302c565b048201901c90506001818481611ea257611ea261302c565b048201901c90506001818481611eba57611eba61302c565b048201901c90506001818481611ed257611ed261302c565b048201901c90506001818481611eea57611eea61302c565b048201901c905061084b81828581611f0457611f0461302c565b04612562565b6000611f19600284841861305b565b61084b90848416612e02565b611f2f8282612578565b6002547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1015611fc35760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610820565b611513600b61263f8361264b565b816001600160a01b0316836001600160a01b031614158015611ff35750600081115b15611e12576001600160a01b03831615612081576001600160a01b0383166000908152600a60205260408120819061202e906128148561264b565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612076929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611e12576001600160a01b0382166000908152600a6020526040812081906120b79061263f8561264b565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516120ff929190918252602082015260400190565b60405180910390a25050505050565b603f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060600061218583612820565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b6121c18282612861565b611513600b6128148361264b565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561220657506000905060036122a8565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561225a573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b0381166122a1576000600192509250506122a8565b9150600090505b94509492505050565b60008160048111156122c5576122c5613096565b036122cd5750565b60018160048111156122e1576122e1613096565b0361232e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610820565b600281600481111561234257612342613096565b0361238f5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610820565b60038160048111156123a3576123a3613096565b036109b55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610820565b600c54610100900460ff166124935760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610820565b6109ec33611b06565b6001600160a01b03838116600090815260096020526040808220548584168352912054611e1292918216911683611fd1565b600080608083901c156124e357608092831c92015b604083901c156124f557604092831c92015b602083901c1561250757602092831c92015b601083901c1561251957601092831c92015b600883901c1561252b57600892831c92015b600483901c1561253d57600492831c92015b600283901c1561254f57600292831c92015b600183901c1561074c5760010192915050565b6000818310612571578161084b565b5090919050565b6001600160a01b0382166125ce5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610820565b80600260008282546125e09190612e02565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361090f60008383611e17565b600061084b8284612e02565b825460009081908181156126ad5760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660208201526126c2565b60408051808201909152600080825260208201525b905080602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1693506126f784868863ffffffff16565b9250600082118015612721575061270c610ba7565b65ffffffffffff16816000015163ffffffff16145b1561277b5761272f836129d1565b60008881526020902083016000190180547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092166401000000000263ffffffff90921691909117905561280a565b86604051806040016040528061279f612792610ba7565b65ffffffffffff16611a2c565b63ffffffff1681526020016127b3866129d1565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b600061084b8284612ff1565b600060ff8216601f81111561074c576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166128dd5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166000908152602081905260409020548181101561296c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611e1283600084611e17565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821115611aa85760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610820565b600060208284031215612a7757600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461084b57600080fd5b6000815180845260005b81811015612acd57602081850181015186830182015201612ab1565b81811115612adf576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061084b6020830184612aa7565b80356001600160a01b0381168114612b3c57600080fd5b919050565b60008060408385031215612b5457600080fd5b612b5d83612b25565b946020939093013593505050565b600080600060608486031215612b8057600080fd5b612b8984612b25565b9250612b9760208501612b25565b9150604084013590509250925092565b600060208284031215612bb957600080fd5b61084b82612b25565b7fff00000000000000000000000000000000000000000000000000000000000000881681526000602060e081840152612bfe60e084018a612aa7565b8381036040850152612c10818a612aa7565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b81811015612c6257835183529284019291840191600101612c46565b50909c9b505050505050505050505050565b600060208284031215612c8657600080fd5b5035919050565b803560ff81168114612b3c57600080fd5b60008060008060008060c08789031215612cb757600080fd5b612cc087612b25565b95506020870135945060408701359350612cdc60608801612c8d565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a031215612d1157600080fd5b612d1a88612b25565b9650612d2860208901612b25565b95506040880135945060608801359350612d4460808901612c8d565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612d7357600080fd5b612d7c83612b25565b9150612d8a60208401612b25565b90509250929050565b60008060408385031215612da657600080fd5b612daf83612b25565b9150602083013563ffffffff81168114612dc857600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612e1557612e15612dd3565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c90821680612e8c57607f821691505b602082108103611d30577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f821115611e1257600081815260208120601f850160051c81016020861015612eec5750805b601f850160051c820191505b81811015612f0b57828155600101612ef8565b505050505050565b815167ffffffffffffffff811115612f2d57612f2d612e1a565b612f4181612f3b8454612e78565b84612ec5565b602080601f831160018114612f765760008415612f5e5750858301515b600019600386901b1c1916600185901b178555612f0b565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015612fc357888601518255948401946001909101908401612fa4565b5085821015612fe15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008282101561300357613003612dd3565b500390565b80516020808301519190811015611d305760001960209190910360031b1b16919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613091577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a" func init() { diff --git a/kroma-bindings/bindings/l2outputoracle.go b/kroma-bindings/bindings/l2outputoracle.go index 963d77f3f2..2d2093c29e 100644 --- a/kroma-bindings/bindings/l2outputoracle.go +++ b/kroma-bindings/bindings/l2outputoracle.go @@ -31,8 +31,8 @@ var ( // L2OutputOracleMetaData contains all meta data concerning the L2OutputOracle contract. var L2OutputOracleMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_validatorPool\",\"type\":\"address\",\"internalType\":\"contractValidatorPool\"},{\"name\":\"_colosseum\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_submissionInterval\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_l2BlockTime\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_startingBlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_startingTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_finalizationPeriodSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"COLOSSEUM\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"FINALIZATION_PERIOD_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"L2_BLOCK_TIME\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"SUBMISSION_INTERVAL\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_POOL\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractValidatorPool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"computeL2Timestamp\",\"inputs\":[{\"name\":\"_l2BlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"finalizedAt\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getL2Output\",\"inputs\":[{\"name\":\"_l2OutputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTypes.CheckpointOutput\",\"components\":[{\"name\":\"submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"outputRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"timestamp\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"l2BlockNumber\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getL2OutputAfter\",\"inputs\":[{\"name\":\"_l2BlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTypes.CheckpointOutput\",\"components\":[{\"name\":\"submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"outputRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"timestamp\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"l2BlockNumber\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getL2OutputIndexAfter\",\"inputs\":[{\"name\":\"_l2BlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSubmitter\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_startingBlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_startingTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isFinalized\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestBlockNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestOutputIndex\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextBlockNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextOutputIndex\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"replaceL2Output\",\"inputs\":[{\"name\":\"_l2OutputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_newOutputRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"startingBlockNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"startingTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitL2Output\",\"inputs\":[{\"name\":\"_outputRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_l2BlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_l1BlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_l1BlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OutputReplaced\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"newOutputRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OutputSubmitted\",\"inputs\":[{\"name\":\"outputRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"l2OutputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"l2BlockNumber\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"l1Timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", - Bin: "0x6101206040523480156200001257600080fd5b5060405162001c9838038062001c98833981016040819052620000359162000343565b60008411620000b15760405162461bcd60e51b815260206004820152603460248201527f4c324f75747075744f7261636c653a204c3220626c6f636b2074696d65206d7560448201527f73742062652067726561746572207468616e203000000000000000000000000060648201526084015b60405180910390fd5b60008511620001295760405162461bcd60e51b815260206004820152603a60248201527f4c324f75747075744f7261636c653a207375626d697373696f6e20696e74657260448201527f76616c206d7573742062652067726561746572207468616e20300000000000006064820152608401620000a8565b6001600160a01b03808816608052861660a05260c085905260e084905261010081905262000158838362000165565b50505050505050620003af565b600054610100900460ff1615808015620001865750600054600160ff909116105b80620001b65750620001a3306200031b60201b620015d51760201c565b158015620001b6575060005460ff166001145b6200021b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620000a8565b6000805460ff1916600117905580156200023f576000805461ff0019166101001790555b42821115620002c55760405162461bcd60e51b8152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201526374696d6560e01b608482015260a401620000a8565b60028290556001839055801562000316576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6001600160a01b03163b151590565b6001600160a01b03811681146200034057600080fd5b50565b600080600080600080600060e0888a0312156200035f57600080fd5b87516200036c816200032a565b60208901519097506200037f816200032a565b604089015160608a015160808b015160a08c015160c0909c01519a9d939c50919a90999198509650945092505050565b60805160a05160c05160e05161010051611865620004336000396000818161050d0152818161053401528181610b6a01528181610eca015261148001526000818161018b0152610fb7015260008181610217015261100801526000818161032c0152611272015260008181610444015281816106140152610b3f01526118656000f3fe6080604052600436106101745760003560e01c80639e45e8f4116100cb578063cf8e5cf01161007f578063e4a3011611610059578063e4a30116146104bb578063e6646723146104db578063f4daa291146104fb57600080fd5b8063cf8e5cf014610466578063d1de856c14610486578063dcec3348146104a657600080fd5b8063a48ea6de116100b0578063a48ea6de146103f2578063b0ea09a814610412578063b98debbf1461043257600080fd5b80639e45e8f41461031a578063a25ae5571461037357600080fd5b80635a045f781161012d57806370872aa51161010757806370872aa5146102ce5780637f006420146102e4578063887862721461030457600080fd5b80635a045f781461028f57806369f16eec146102a45780636abcf563146102b957600080fd5b80634599c7881161015e5780634599c788146101f0578063529933df1461020557806354fd4d501461023957600080fd5b80622134cc1461017957806333727c4d146101c0575b600080fd5b34801561018557600080fd5b506101ad7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b3480156101cc57600080fd5b506101e06101db3660046115f1565b61052f565b60405190151581526020016101b7565b3480156101fc57600080fd5b506101ad61059d565b34801561021157600080fd5b506101ad7f000000000000000000000000000000000000000000000000000000000000000081565b34801561024557600080fd5b506102826040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516101b7919061160a565b6102a261029d36600461167d565b610610565b005b3480156102b057600080fd5b506101ad610c17565b3480156102c557600080fd5b506003546101ad565b3480156102da57600080fd5b506101ad60015481565b3480156102f057600080fd5b506101ad6102ff3660046115f1565b610c29565b34801561031057600080fd5b506101ad60025481565b34801561032657600080fd5b5061034e7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b7565b34801561037f57600080fd5b5061039361038e3660046115f1565b610e09565b60408051825173ffffffffffffffffffffffffffffffffffffffff16815260208084015190820152828201516fffffffffffffffffffffffffffffffff90811692820192909252606092830151909116918101919091526080016101b7565b3480156103fe57600080fd5b506101ad61040d3660046115f1565b610ec6565b34801561041e57600080fd5b5061034e61042d3660046115f1565b610f32565b34801561043e57600080fd5b5061034e7f000000000000000000000000000000000000000000000000000000000000000081565b34801561047257600080fd5b506103936104813660046115f1565b610f74565b34801561049257600080fd5b506101ad6104a13660046115f1565b610fb3565b3480156104b257600080fd5b506101ad610ffb565b3480156104c757600080fd5b506102a26104d63660046116af565b611041565b3480156104e757600080fd5b506102a26104f63660046116f6565b61125a565b34801561050757600080fd5b506101ad7f000000000000000000000000000000000000000000000000000000000000000081565b6000427f0000000000000000000000000000000000000000000000000000000000000000600384815481106105665761056661172f565b600091825260209091206002600390920201015461059691906fffffffffffffffffffffffffffffffff1661178d565b1092915050565b6003546000901561060757600380546105b8906001906117a5565b815481106105c8576105c861172f565b600091825260209091206003909102016002015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16919050565b6001545b905090565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a5490466040518163ffffffff1660e01b8152600401602060405180830381865afa15801561067d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a191906117bc565b905073ffffffffffffffffffffffffffffffffffffffff80821614610776573373ffffffffffffffffffffffffffffffffffffffff8216146107765760405162461bcd60e51b815260206004820152604260248201527f4c324f75747075744f7261636c653a206f6e6c7920746865206e65787420736560448201527f6c65637465642076616c696461746f722063616e207375626d6974206f75747060648201527f7574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b61077e610ffb565b84146108185760405162461bcd60e51b815260206004820152604860248201527f4c324f75747075744f7261636c653a20626c6f636b206e756d626572206d757360448201527f7420626520657175616c20746f206e65787420657870656374656420626c6f6360648201527f6b206e756d626572000000000000000000000000000000000000000000000000608482015260a40161076d565b4261082285610fb3565b106108955760405162461bcd60e51b815260206004820152603560248201527f4c324f75747075744f7261636c653a2063616e6e6f74207375626d6974204c3260448201527f206f757470757420696e20746865206675747572650000000000000000000000606482015260840161076d565b846109085760405162461bcd60e51b815260206004820152603c60248201527f4c324f75747075744f7261636c653a204c3220636865636b706f696e74206f7560448201527f747075742063616e6e6f7420626520746865207a65726f206861736800000000606482015260840161076d565b82158015906109175750814015155b156109b857828240146109b85760405162461bcd60e51b815260206004820152604960248201527f4c324f75747075744f7261636c653a20626c6f636b206861736820646f65732060448201527f6e6f74206d61746368207468652068617368206174207468652065787065637460648201527f6564206865696768740000000000000000000000000000000000000000000000608482015260a40161076d565b60006109c360035490565b60408051608081018252338152602081018981526fffffffffffffffffffffffffffffffff428181168486019081528b831660608601908152600380546001810182556000829052965196027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b8101805473ffffffffffffffffffffffffffffffffffffffff989098167fffffffffffffffffffffffff00000000000000000000000000000000000000009098169790971790965593517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c86015551925182167001000000000000000000000000000000000292909116919091177fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d9092019190915590519192508691839189917f457b4388026260019ae0b0b4f16c98235d74fe7359be469bdcba16e6d0d4968991610b209190815260200190565b60405180910390a473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663d38dc7ee82610b8f7f00000000000000000000000000000000000000000000000000000000000000004261178d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526fffffffffffffffffffffffffffffffff166024820152604401600060405180830381600087803b158015610bf757600080fd5b505af1158015610c0b573d6000803e3d6000fd5b50505050505050505050565b60035460009061060b906001906117a5565b6000610c3361059d565b821115610cce5760405162461bcd60e51b815260206004820152604960248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f7420666f72206120626c6f636b207468617420686173206e6f74206265656e2060648201527f7375626d69747465640000000000000000000000000000000000000000000000608482015260a40161076d565b600354610d695760405162461bcd60e51b815260206004820152604760248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f74206173206e6f206f7574707574732068617665206265656e207375626d697460648201527f7465642079657400000000000000000000000000000000000000000000000000608482015260a40161076d565b6003546000905b80821015610e025760006002610d86838561178d565b610d9091906117e0565b90508460038281548110610da657610da661172f565b600091825260209091206003909102016002015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff161015610df857610df181600161178d565b9250610dfc565b8091505b50610d70565b5092915050565b60408051608081018252600080825260208201819052918101829052606081019190915260038281548110610e4057610e4061172f565b6000918252602091829020604080516080810182526003909302909101805473ffffffffffffffffffffffffffffffffffffffff1683526001810154938301939093526002909201546fffffffffffffffffffffffffffffffff808216938301939093527001000000000000000000000000000000009004909116606082015292915050565b60007f000000000000000000000000000000000000000000000000000000000000000060038381548110610efc57610efc61172f565b6000918252602090912060026003909202010154610f2c91906fffffffffffffffffffffffffffffffff1661178d565b92915050565b600060038281548110610f4757610f4761172f565b600091825260209091206003909102015473ffffffffffffffffffffffffffffffffffffffff1692915050565b6040805160808101825260008082526020820181905291810182905260608101919091526003610fa383610c29565b81548110610e4057610e4061172f565b60007f000000000000000000000000000000000000000000000000000000000000000060015483610fe491906117a5565b610fee919061181b565b600254610f2c919061178d565b60035460009015611039577f000000000000000000000000000000000000000000000000000000000000000061102f61059d565b61060b919061178d565b61060b61059d565b600054610100900460ff16158080156110615750600054600160ff909116105b8061107b5750303b15801561107b575060005460ff166001145b6110ed5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161076d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561114b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b428211156111e85760405162461bcd60e51b8152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201527f74696d6500000000000000000000000000000000000000000000000000000000608482015260a40161076d565b60028290556001839055801561125557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461132b5760405162461bcd60e51b815260206004820152604160248201527f4c324f75747075744f7261636c653a206f6e6c792074686520636f6c6f73736560448201527f756d20636f6e74726163742063616e207265706c61636520616e206f7574707560648201527f7400000000000000000000000000000000000000000000000000000000000000608482015260a40161076d565b73ffffffffffffffffffffffffffffffffffffffff81166113b45760405162461bcd60e51b815260206004820152603060248201527f4c324f75747075744f7261636c653a207375626d69747465722061646472657360448201527f732063616e6e6f74206265207a65726f00000000000000000000000000000000606482015260840161076d565b60035483106114515760405162461bcd60e51b815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f74207265706c616365206160448201527f6e206f757470757420616674657220746865206c6174657374206f757470757460648201527f20696e6465780000000000000000000000000000000000000000000000000000608482015260a40161076d565b6000600384815481106114665761146661172f565b6000918252602090912060039091020160028101549091507f0000000000000000000000000000000000000000000000000000000000000000906114bc906fffffffffffffffffffffffffffffffff16426117a5565b106115555760405162461bcd60e51b815260206004820152604860248201527f4c324f75747075744f7261636c653a2063616e6e6f74207265706c616365206160448201527f6e206f757470757420746861742068617320616c7265616479206265656e206660648201527f696e616c697a6564000000000000000000000000000000000000000000000000608482015260a40161076d565b6001810183905580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831617815560405183815284907fa1b831bb8b6b242db6d0988a6d21f869c610de9f703a5e45e1b7d3dc3137b9069060200160405180910390a250505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60006020828403121561160357600080fd5b5035919050565b600060208083528351808285015260005b818110156116375785810183015185820160400152820161161b565b81811115611649576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000806000806080858703121561169357600080fd5b5050823594602084013594506040840135936060013592509050565b600080604083850312156116c257600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff811681146116f357600080fd5b50565b60008060006060848603121561170b57600080fd5b83359250602084013591506040840135611724816116d1565b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156117a0576117a061175e565b500190565b6000828210156117b7576117b761175e565b500390565b6000602082840312156117ce57600080fd5b81516117d9816116d1565b9392505050565b600082611816577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156118535761185361175e565b50029056fea164736f6c634300080f000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_validatorPool\",\"type\":\"address\",\"internalType\":\"contractValidatorPool\"},{\"name\":\"_validatorManager\",\"type\":\"address\",\"internalType\":\"contractIValidatorManager\"},{\"name\":\"_colosseum\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_submissionInterval\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_l2BlockTime\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_startingBlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_startingTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_finalizationPeriodSeconds\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"COLOSSEUM\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"FINALIZATION_PERIOD_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"L2_BLOCK_TIME\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"SUBMISSION_INTERVAL\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_MANAGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIValidatorManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VALIDATOR_POOL\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractValidatorPool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"computeL2Timestamp\",\"inputs\":[{\"name\":\"_l2BlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"finalizedAt\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getL2Output\",\"inputs\":[{\"name\":\"_l2OutputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTypes.CheckpointOutput\",\"components\":[{\"name\":\"submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"outputRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"timestamp\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"l2BlockNumber\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getL2OutputAfter\",\"inputs\":[{\"name\":\"_l2BlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTypes.CheckpointOutput\",\"components\":[{\"name\":\"submitter\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"outputRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"timestamp\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"l2BlockNumber\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getL2OutputIndexAfter\",\"inputs\":[{\"name\":\"_l2BlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getSubmitter\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_startingBlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_startingTimestamp\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isFinalized\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestBlockNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"latestOutputIndex\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextBlockNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextFinalizeOutputIndex\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextOutputIndex\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextOutputMinL2Timestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"replaceL2Output\",\"inputs\":[{\"name\":\"_l2OutputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_newOutputRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_submitter\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNextFinalizeOutputIndex\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"startingBlockNumber\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"startingTimestamp\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitL2Output\",\"inputs\":[{\"name\":\"_outputRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_l2BlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_l1BlockHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_l1BlockNumber\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OutputReplaced\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"newSubmitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOutputRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OutputSubmitted\",\"inputs\":[{\"name\":\"outputRoot\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"l2OutputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"l2BlockNumber\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"l1Timestamp\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", + Bin: "0x6101406040523480156200001257600080fd5b50604051620021da380380620021da83398101604081905262000035916200034b565b60008411620000b15760405162461bcd60e51b815260206004820152603460248201527f4c324f75747075744f7261636c653a204c3220626c6f636b2074696d65206d7560448201527f73742062652067726561746572207468616e203000000000000000000000000060648201526084015b60405180910390fd5b60008511620001295760405162461bcd60e51b815260206004820152603a60248201527f4c324f75747075744f7261636c653a207375626d697373696f6e20696e74657260448201527f76616c206d7573742062652067726561746572207468616e20300000000000006064820152608401620000a8565b6001600160a01b0380891660805287811660a052861660c05260e08590526101008490526101208190526200015f83836200016d565b5050505050505050620003cf565b600054610100900460ff16158080156200018e5750600054600160ff909116105b80620001be5750620001ab306200032360201b62001aa71760201c565b158015620001be575060005460ff166001145b620002235760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620000a8565b6000805460ff19166001179055801562000247576000805461ff0019166101001790555b42821115620002cd5760405162461bcd60e51b8152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201526374696d6560e01b608482015260a401620000a8565b6002829055600183905580156200031e576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b6001600160a01b03163b151590565b6001600160a01b03811681146200034857600080fd5b50565b600080600080600080600080610100898b0312156200036957600080fd5b8851620003768162000332565b60208a0151909850620003898162000332565b60408a01519097506200039c8162000332565b60608a015160808b015160a08c015160c08d015160e0909d01519b9e9a9d50929b919a9099929850909650945092505050565b60805160a05160c05160e0516101005161012051611d5962000481600039600081816105b801528181610dce0152818161139a01526119500152600081816101b7015261148701526000818161024301526114d801526000818161038d01526117420152600081816104850152818161075901528181610d16015261114a0152600081816104d9015281816106b6015281816107cf01528181610da30152818161109e01526112200152611d596000f3fe6080604052600436106101a05760003560e01c80639e45e8f4116100e1578063cf8e5cf01161008a578063e4a3011611610064578063e4a3011614610550578063e664672314610570578063f403838d14610590578063f4daa291146105a657600080fd5b8063cf8e5cf0146104fb578063d1de856c1461051b578063dcec33481461053b57600080fd5b8063ae9483e0116100bb578063ae9483e014610473578063b0ea09a8146104a7578063b98debbf146104c757600080fd5b80639e45e8f41461037b578063a25ae557146103d4578063a48ea6de1461045357600080fd5b806369f16eec1161014e5780637f006420116101285780637f0064201461031057806380446bd21461033057806388786272146103455780639902cdc01461035b57600080fd5b806369f16eec146102d05780636abcf563146102e557806370872aa5146102fa57600080fd5b8063529933df1161017f578063529933df1461023157806354fd4d50146102655780635a045f78146102bb57600080fd5b80622134cc146101a557806333727c4d146101ec5780634599c7881461021c575b600080fd5b3480156101b157600080fd5b506101d97f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b3480156101f857600080fd5b5061020c610207366004611ac3565b6105da565b60405190151581526020016101e3565b34801561022857600080fd5b506101d96105ee565b34801561023d57600080fd5b506101d97f000000000000000000000000000000000000000000000000000000000000000081565b34801561027157600080fd5b506102ae6040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516101e39190611adc565b6102ce6102c9366004611b4f565b610661565b005b3480156102dc57600080fd5b506101d9610e7d565b3480156102f157600080fd5b506003546101d9565b34801561030657600080fd5b506101d960015481565b34801561031c57600080fd5b506101d961032b366004611ac3565b610e8f565b34801561033c57600080fd5b506101d961106f565b34801561035157600080fd5b506101d960025481565b34801561036757600080fd5b506102ce610376366004611ac3565b611087565b34801561038757600080fd5b506103af7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101e3565b3480156103e057600080fd5b506103f46103ef366004611ac3565b6112d9565b60408051825173ffffffffffffffffffffffffffffffffffffffff16815260208084015190820152828201516fffffffffffffffffffffffffffffffff90811692820192909252606092830151909116918101919091526080016101e3565b34801561045f57600080fd5b506101d961046e366004611ac3565b611396565b34801561047f57600080fd5b506103af7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b357600080fd5b506103af6104c2366004611ac3565b611402565b3480156104d357600080fd5b506103af7f000000000000000000000000000000000000000000000000000000000000000081565b34801561050757600080fd5b506103f4610516366004611ac3565b611444565b34801561052757600080fd5b506101d9610536366004611ac3565b611483565b34801561054757600080fd5b506101d96114cb565b34801561055c57600080fd5b506102ce61056b366004611b81565b611511565b34801561057c57600080fd5b506102ce61058b366004611bc8565b61172a565b34801561059c57600080fd5b506101d960045481565b3480156105b257600080fd5b506101d97f000000000000000000000000000000000000000000000000000000000000000081565b6000426105e683611396565b111592915050565b60035460009015610658576003805461060990600190611c30565b8154811061061957610619611c47565b600091825260209091206003909102016002015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16919050565b6001545b905090565b600061066c60035490565b6040517fad36d6cc0000000000000000000000000000000000000000000000000000000081526004810182905290915060009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063ad36d6cc90602401602060405180830381865afa1580156106fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107219190611c76565b9050600081156107cd576040517f891aab740000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063891aab749060240160006040518083038186803b1580156107b057600080fd5b505afa1580156107c4573d6000803e3d6000fd5b5050505061085f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a5490466040518163ffffffff1660e01b8152600401602060405180830381865afa158015610838573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085c9190611c9f565b90505b81158015610883575073ffffffffffffffffffffffffffffffffffffffff81811614155b1561093e573373ffffffffffffffffffffffffffffffffffffffff82161461093e5760405162461bcd60e51b815260206004820152604260248201527f4c324f75747075744f7261636c653a206f6e6c7920746865206e65787420736560448201527f6c65637465642076616c696461746f722063616e207375626d6974206f75747060648201527f7574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b6109466114cb565b86146109e05760405162461bcd60e51b815260206004820152604860248201527f4c324f75747075744f7261636c653a20626c6f636b206e756d626572206d757360448201527f7420626520657175616c20746f206e65787420657870656374656420626c6f6360648201527f6b206e756d626572000000000000000000000000000000000000000000000000608482015260a401610935565b426109e961106f565b1115610a5d5760405162461bcd60e51b815260206004820152603560248201527f4c324f75747075744f7261636c653a2063616e6e6f74207375626d6974204c3260448201527f206f757470757420696e207468652066757475726500000000000000000000006064820152608401610935565b86610ad05760405162461bcd60e51b815260206004820152603c60248201527f4c324f75747075744f7261636c653a204c3220636865636b706f696e74206f7560448201527f747075742063616e6e6f7420626520746865207a65726f2068617368000000006064820152608401610935565b8415801590610adf5750834015155b15610b805784844014610b805760405162461bcd60e51b815260206004820152604960248201527f4c324f75747075744f7261636c653a20626c6f636b206861736820646f65732060448201527f6e6f74206d61746368207468652068617368206174207468652065787065637460648201527f6564206865696768740000000000000000000000000000000000000000000000608482015260a401610935565b60408051608081018252338152602081018981526fffffffffffffffffffffffffffffffff428181168486019081528b831660608601908152600380546001810182556000829052965196027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b8101805473ffffffffffffffffffffffffffffffffffffffff989098167fffffffffffffffffffffffff00000000000000000000000000000000000000009098169790971790965593517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c86015551925182167001000000000000000000000000000000000292909116919091177fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d909201919091559051879185918a917f457b4388026260019ae0b0b4f16c98235d74fe7359be469bdcba16e6d0d4968991610cd991815260200190565b60405180910390a48115610d8c576040517fbe119347000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063be11934790602401600060405180830381600087803b158015610d6f57600080fd5b505af1158015610d83573d6000803e3d6000fd5b50505050610e74565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663d38dc7ee84610df37f000000000000000000000000000000000000000000000000000000000000000042611cbc565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526fffffffffffffffffffffffffffffffff166024820152604401600060405180830381600087803b158015610e5b57600080fd5b505af1158015610e6f573d6000803e3d6000fd5b505050505b50505050505050565b60035460009061065c90600190611c30565b6000610e996105ee565b821115610f345760405162461bcd60e51b815260206004820152604960248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f7420666f72206120626c6f636b207468617420686173206e6f74206265656e2060648201527f7375626d69747465640000000000000000000000000000000000000000000000608482015260a401610935565b600354610fcf5760405162461bcd60e51b815260206004820152604760248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f74206173206e6f206f7574707574732068617665206265656e207375626d697460648201527f7465642079657400000000000000000000000000000000000000000000000000608482015260a401610935565b6003546000905b808210156110685760006002610fec8385611cbc565b610ff69190611cd4565b9050846003828154811061100c5761100c611c47565b600091825260209091206003909102016002015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16101561105e57611057816001611cbc565b9250611062565b8091505b50610fd6565b5092915050565b600061065c61107c6114cb565b610536906001611cbc565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663ad36d6cc6110ce600184611c30565b6040518263ffffffff1660e01b81526004016110ec91815260200190565b602060405180830381865afa158015611109573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112d9190611c76565b15611208573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146112035760405162461bcd60e51b815260206004820152605660248201527f4c324f75747075744f7261636c653a206f6e6c79207468652076616c6964617460448201527f6f72206d616e6167657220636f6e74726163742063616e20736574206e65787460648201527f2066696e616c697a65206f757470757420696e64657800000000000000000000608482015260a401610935565b600455565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146112035760405162461bcd60e51b815260206004820152605360248201527f4c324f75747075744f7261636c653a206f6e6c79207468652076616c6964617460448201527f6f7220706f6f6c20636f6e74726163742063616e20736574206e65787420666960648201527f6e616c697a65206f757470757420696e64657800000000000000000000000000608482015260a401610935565b6040805160808101825260008082526020820181905291810182905260608101919091526003828154811061131057611310611c47565b6000918252602091829020604080516080810182526003909302909101805473ffffffffffffffffffffffffffffffffffffffff1683526001810154938301939093526002909201546fffffffffffffffffffffffffffffffff808216938301939093527001000000000000000000000000000000009004909116606082015292915050565b60007f0000000000000000000000000000000000000000000000000000000000000000600383815481106113cc576113cc611c47565b60009182526020909120600260039092020101546113fc91906fffffffffffffffffffffffffffffffff16611cbc565b92915050565b60006003828154811061141757611417611c47565b600091825260209091206003909102015473ffffffffffffffffffffffffffffffffffffffff1692915050565b604080516080810182526000808252602082018190529181018290526060810191909152600361147383610e8f565b8154811061131057611310611c47565b60007f0000000000000000000000000000000000000000000000000000000000000000600154836114b49190611c30565b6114be9190611d0f565b6002546113fc9190611cbc565b60035460009015611509577f00000000000000000000000000000000000000000000000000000000000000006114ff6105ee565b61065c9190611cbc565b61065c6105ee565b600054610100900460ff16158080156115315750600054600160ff909116105b8061154b5750303b15801561154b575060005460ff166001145b6115bd5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610935565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561161b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b428211156116b85760405162461bcd60e51b8152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201527f74696d6500000000000000000000000000000000000000000000000000000000608482015260a401610935565b60028290556001839055801561172557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146117fb5760405162461bcd60e51b815260206004820152604160248201527f4c324f75747075744f7261636c653a206f6e6c792074686520636f6c6f73736560448201527f756d20636f6e74726163742063616e207265706c61636520616e206f7574707560648201527f7400000000000000000000000000000000000000000000000000000000000000608482015260a401610935565b73ffffffffffffffffffffffffffffffffffffffff81166118845760405162461bcd60e51b815260206004820152603060248201527f4c324f75747075744f7261636c653a207375626d69747465722061646472657360448201527f732063616e6e6f74206265207a65726f000000000000000000000000000000006064820152608401610935565b60035483106119215760405162461bcd60e51b815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f74207265706c616365206160448201527f6e206f757470757420616674657220746865206c6174657374206f757470757460648201527f20696e6465780000000000000000000000000000000000000000000000000000608482015260a401610935565b60006003848154811061193657611936611c47565b6000918252602090912060039091020160028101549091507f00000000000000000000000000000000000000000000000000000000000000009061198c906fffffffffffffffffffffffffffffffff1642611c30565b10611a255760405162461bcd60e51b815260206004820152604860248201527f4c324f75747075744f7261636c653a2063616e6e6f74207265706c616365206160448201527f6e206f757470757420746861742068617320616c7265616479206265656e206660648201527f696e616c697a6564000000000000000000000000000000000000000000000000608482015260a401610935565b6001810183905580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405184815285907f1ec0d63ba3dd4b277ece3e578c4c9587edfa0d855192704c88f9a1d74316624f9060200160405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600060208284031215611ad557600080fd5b5035919050565b600060208083528351808285015260005b81811015611b0957858101830151858201604001528201611aed565b81811115611b1b576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60008060008060808587031215611b6557600080fd5b5050823594602084013594506040840135936060013592509050565b60008060408385031215611b9457600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114611bc557600080fd5b50565b600080600060608486031215611bdd57600080fd5b83359250602084013591506040840135611bf681611ba3565b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611c4257611c42611c01565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215611c8857600080fd5b81518015158114611c9857600080fd5b9392505050565b600060208284031215611cb157600080fd5b8151611c9881611ba3565b60008219821115611ccf57611ccf611c01565b500190565b600082611d0a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611d4757611d47611c01565b50029056fea164736f6c634300080f000a", } // L2OutputOracleABI is the input ABI used to generate the binding from. @@ -44,7 +44,7 @@ var L2OutputOracleABI = L2OutputOracleMetaData.ABI var L2OutputOracleBin = L2OutputOracleMetaData.Bin // DeployL2OutputOracle deploys a new Ethereum contract, binding an instance of L2OutputOracle to it. -func DeployL2OutputOracle(auth *bind.TransactOpts, backend bind.ContractBackend, _validatorPool common.Address, _colosseum common.Address, _submissionInterval *big.Int, _l2BlockTime *big.Int, _startingBlockNumber *big.Int, _startingTimestamp *big.Int, _finalizationPeriodSeconds *big.Int) (common.Address, *types.Transaction, *L2OutputOracle, error) { +func DeployL2OutputOracle(auth *bind.TransactOpts, backend bind.ContractBackend, _validatorPool common.Address, _validatorManager common.Address, _colosseum common.Address, _submissionInterval *big.Int, _l2BlockTime *big.Int, _startingBlockNumber *big.Int, _startingTimestamp *big.Int, _finalizationPeriodSeconds *big.Int) (common.Address, *types.Transaction, *L2OutputOracle, error) { parsed, err := L2OutputOracleMetaData.GetAbi() if err != nil { return common.Address{}, nil, nil, err @@ -53,7 +53,7 @@ func DeployL2OutputOracle(auth *bind.TransactOpts, backend bind.ContractBackend, return common.Address{}, nil, nil, errors.New("GetABI returned nil") } - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(L2OutputOracleBin), backend, _validatorPool, _colosseum, _submissionInterval, _l2BlockTime, _startingBlockNumber, _startingTimestamp, _finalizationPeriodSeconds) + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(L2OutputOracleBin), backend, _validatorPool, _validatorManager, _colosseum, _submissionInterval, _l2BlockTime, _startingBlockNumber, _startingTimestamp, _finalizationPeriodSeconds) if err != nil { return common.Address{}, nil, nil, err } @@ -326,6 +326,37 @@ func (_L2OutputOracle *L2OutputOracleCallerSession) SUBMISSIONINTERVAL() (*big.I return _L2OutputOracle.Contract.SUBMISSIONINTERVAL(&_L2OutputOracle.CallOpts) } +// VALIDATORMANAGER is a free data retrieval call binding the contract method 0xae9483e0. +// +// Solidity: function VALIDATOR_MANAGER() view returns(address) +func (_L2OutputOracle *L2OutputOracleCaller) VALIDATORMANAGER(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _L2OutputOracle.contract.Call(opts, &out, "VALIDATOR_MANAGER") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// VALIDATORMANAGER is a free data retrieval call binding the contract method 0xae9483e0. +// +// Solidity: function VALIDATOR_MANAGER() view returns(address) +func (_L2OutputOracle *L2OutputOracleSession) VALIDATORMANAGER() (common.Address, error) { + return _L2OutputOracle.Contract.VALIDATORMANAGER(&_L2OutputOracle.CallOpts) +} + +// VALIDATORMANAGER is a free data retrieval call binding the contract method 0xae9483e0. +// +// Solidity: function VALIDATOR_MANAGER() view returns(address) +func (_L2OutputOracle *L2OutputOracleCallerSession) VALIDATORMANAGER() (common.Address, error) { + return _L2OutputOracle.Contract.VALIDATORMANAGER(&_L2OutputOracle.CallOpts) +} + // VALIDATORPOOL is a free data retrieval call binding the contract method 0xb98debbf. // // Solidity: function VALIDATOR_POOL() view returns(address) @@ -667,6 +698,37 @@ func (_L2OutputOracle *L2OutputOracleCallerSession) NextBlockNumber() (*big.Int, return _L2OutputOracle.Contract.NextBlockNumber(&_L2OutputOracle.CallOpts) } +// NextFinalizeOutputIndex is a free data retrieval call binding the contract method 0xf403838d. +// +// Solidity: function nextFinalizeOutputIndex() view returns(uint256) +func (_L2OutputOracle *L2OutputOracleCaller) NextFinalizeOutputIndex(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _L2OutputOracle.contract.Call(opts, &out, "nextFinalizeOutputIndex") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// NextFinalizeOutputIndex is a free data retrieval call binding the contract method 0xf403838d. +// +// Solidity: function nextFinalizeOutputIndex() view returns(uint256) +func (_L2OutputOracle *L2OutputOracleSession) NextFinalizeOutputIndex() (*big.Int, error) { + return _L2OutputOracle.Contract.NextFinalizeOutputIndex(&_L2OutputOracle.CallOpts) +} + +// NextFinalizeOutputIndex is a free data retrieval call binding the contract method 0xf403838d. +// +// Solidity: function nextFinalizeOutputIndex() view returns(uint256) +func (_L2OutputOracle *L2OutputOracleCallerSession) NextFinalizeOutputIndex() (*big.Int, error) { + return _L2OutputOracle.Contract.NextFinalizeOutputIndex(&_L2OutputOracle.CallOpts) +} + // NextOutputIndex is a free data retrieval call binding the contract method 0x6abcf563. // // Solidity: function nextOutputIndex() view returns(uint256) @@ -698,6 +760,37 @@ func (_L2OutputOracle *L2OutputOracleCallerSession) NextOutputIndex() (*big.Int, return _L2OutputOracle.Contract.NextOutputIndex(&_L2OutputOracle.CallOpts) } +// NextOutputMinL2Timestamp is a free data retrieval call binding the contract method 0x80446bd2. +// +// Solidity: function nextOutputMinL2Timestamp() view returns(uint256) +func (_L2OutputOracle *L2OutputOracleCaller) NextOutputMinL2Timestamp(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _L2OutputOracle.contract.Call(opts, &out, "nextOutputMinL2Timestamp") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// NextOutputMinL2Timestamp is a free data retrieval call binding the contract method 0x80446bd2. +// +// Solidity: function nextOutputMinL2Timestamp() view returns(uint256) +func (_L2OutputOracle *L2OutputOracleSession) NextOutputMinL2Timestamp() (*big.Int, error) { + return _L2OutputOracle.Contract.NextOutputMinL2Timestamp(&_L2OutputOracle.CallOpts) +} + +// NextOutputMinL2Timestamp is a free data retrieval call binding the contract method 0x80446bd2. +// +// Solidity: function nextOutputMinL2Timestamp() view returns(uint256) +func (_L2OutputOracle *L2OutputOracleCallerSession) NextOutputMinL2Timestamp() (*big.Int, error) { + return _L2OutputOracle.Contract.NextOutputMinL2Timestamp(&_L2OutputOracle.CallOpts) +} + // StartingBlockNumber is a free data retrieval call binding the contract method 0x70872aa5. // // Solidity: function startingBlockNumber() view returns(uint256) @@ -833,6 +926,27 @@ func (_L2OutputOracle *L2OutputOracleTransactorSession) ReplaceL2Output(_l2Outpu return _L2OutputOracle.Contract.ReplaceL2Output(&_L2OutputOracle.TransactOpts, _l2OutputIndex, _newOutputRoot, _submitter) } +// SetNextFinalizeOutputIndex is a paid mutator transaction binding the contract method 0x9902cdc0. +// +// Solidity: function setNextFinalizeOutputIndex(uint256 _outputIndex) returns() +func (_L2OutputOracle *L2OutputOracleTransactor) SetNextFinalizeOutputIndex(opts *bind.TransactOpts, _outputIndex *big.Int) (*types.Transaction, error) { + return _L2OutputOracle.contract.Transact(opts, "setNextFinalizeOutputIndex", _outputIndex) +} + +// SetNextFinalizeOutputIndex is a paid mutator transaction binding the contract method 0x9902cdc0. +// +// Solidity: function setNextFinalizeOutputIndex(uint256 _outputIndex) returns() +func (_L2OutputOracle *L2OutputOracleSession) SetNextFinalizeOutputIndex(_outputIndex *big.Int) (*types.Transaction, error) { + return _L2OutputOracle.Contract.SetNextFinalizeOutputIndex(&_L2OutputOracle.TransactOpts, _outputIndex) +} + +// SetNextFinalizeOutputIndex is a paid mutator transaction binding the contract method 0x9902cdc0. +// +// Solidity: function setNextFinalizeOutputIndex(uint256 _outputIndex) returns() +func (_L2OutputOracle *L2OutputOracleTransactorSession) SetNextFinalizeOutputIndex(_outputIndex *big.Int) (*types.Transaction, error) { + return _L2OutputOracle.Contract.SetNextFinalizeOutputIndex(&_L2OutputOracle.TransactOpts, _outputIndex) +} + // SubmitL2Output is a paid mutator transaction binding the contract method 0x5a045f78. // // Solidity: function submitL2Output(bytes32 _outputRoot, uint256 _l2BlockNumber, bytes32 _l1BlockHash, uint256 _l1BlockNumber) payable returns() @@ -1058,38 +1172,47 @@ func (it *L2OutputOracleOutputReplacedIterator) Close() error { // L2OutputOracleOutputReplaced represents a OutputReplaced event raised by the L2OutputOracle contract. type L2OutputOracleOutputReplaced struct { OutputIndex *big.Int + NewSubmitter common.Address NewOutputRoot [32]byte Raw types.Log // Blockchain specific contextual infos } -// FilterOutputReplaced is a free log retrieval operation binding the contract event 0xa1b831bb8b6b242db6d0988a6d21f869c610de9f703a5e45e1b7d3dc3137b906. +// FilterOutputReplaced is a free log retrieval operation binding the contract event 0x1ec0d63ba3dd4b277ece3e578c4c9587edfa0d855192704c88f9a1d74316624f. // -// Solidity: event OutputReplaced(uint256 indexed outputIndex, bytes32 newOutputRoot) -func (_L2OutputOracle *L2OutputOracleFilterer) FilterOutputReplaced(opts *bind.FilterOpts, outputIndex []*big.Int) (*L2OutputOracleOutputReplacedIterator, error) { +// Solidity: event OutputReplaced(uint256 indexed outputIndex, address indexed newSubmitter, bytes32 newOutputRoot) +func (_L2OutputOracle *L2OutputOracleFilterer) FilterOutputReplaced(opts *bind.FilterOpts, outputIndex []*big.Int, newSubmitter []common.Address) (*L2OutputOracleOutputReplacedIterator, error) { var outputIndexRule []interface{} for _, outputIndexItem := range outputIndex { outputIndexRule = append(outputIndexRule, outputIndexItem) } + var newSubmitterRule []interface{} + for _, newSubmitterItem := range newSubmitter { + newSubmitterRule = append(newSubmitterRule, newSubmitterItem) + } - logs, sub, err := _L2OutputOracle.contract.FilterLogs(opts, "OutputReplaced", outputIndexRule) + logs, sub, err := _L2OutputOracle.contract.FilterLogs(opts, "OutputReplaced", outputIndexRule, newSubmitterRule) if err != nil { return nil, err } return &L2OutputOracleOutputReplacedIterator{contract: _L2OutputOracle.contract, event: "OutputReplaced", logs: logs, sub: sub}, nil } -// WatchOutputReplaced is a free log subscription operation binding the contract event 0xa1b831bb8b6b242db6d0988a6d21f869c610de9f703a5e45e1b7d3dc3137b906. +// WatchOutputReplaced is a free log subscription operation binding the contract event 0x1ec0d63ba3dd4b277ece3e578c4c9587edfa0d855192704c88f9a1d74316624f. // -// Solidity: event OutputReplaced(uint256 indexed outputIndex, bytes32 newOutputRoot) -func (_L2OutputOracle *L2OutputOracleFilterer) WatchOutputReplaced(opts *bind.WatchOpts, sink chan<- *L2OutputOracleOutputReplaced, outputIndex []*big.Int) (event.Subscription, error) { +// Solidity: event OutputReplaced(uint256 indexed outputIndex, address indexed newSubmitter, bytes32 newOutputRoot) +func (_L2OutputOracle *L2OutputOracleFilterer) WatchOutputReplaced(opts *bind.WatchOpts, sink chan<- *L2OutputOracleOutputReplaced, outputIndex []*big.Int, newSubmitter []common.Address) (event.Subscription, error) { var outputIndexRule []interface{} for _, outputIndexItem := range outputIndex { outputIndexRule = append(outputIndexRule, outputIndexItem) } + var newSubmitterRule []interface{} + for _, newSubmitterItem := range newSubmitter { + newSubmitterRule = append(newSubmitterRule, newSubmitterItem) + } - logs, sub, err := _L2OutputOracle.contract.WatchLogs(opts, "OutputReplaced", outputIndexRule) + logs, sub, err := _L2OutputOracle.contract.WatchLogs(opts, "OutputReplaced", outputIndexRule, newSubmitterRule) if err != nil { return nil, err } @@ -1121,9 +1244,9 @@ func (_L2OutputOracle *L2OutputOracleFilterer) WatchOutputReplaced(opts *bind.Wa }), nil } -// ParseOutputReplaced is a log parse operation binding the contract event 0xa1b831bb8b6b242db6d0988a6d21f869c610de9f703a5e45e1b7d3dc3137b906. +// ParseOutputReplaced is a log parse operation binding the contract event 0x1ec0d63ba3dd4b277ece3e578c4c9587edfa0d855192704c88f9a1d74316624f. // -// Solidity: event OutputReplaced(uint256 indexed outputIndex, bytes32 newOutputRoot) +// Solidity: event OutputReplaced(uint256 indexed outputIndex, address indexed newSubmitter, bytes32 newOutputRoot) func (_L2OutputOracle *L2OutputOracleFilterer) ParseOutputReplaced(log types.Log) (*L2OutputOracleOutputReplaced, error) { event := new(L2OutputOracleOutputReplaced) if err := _L2OutputOracle.contract.UnpackLog(event, "OutputReplaced", log); err != nil { diff --git a/kroma-bindings/bindings/l2outputoracle_more.go b/kroma-bindings/bindings/l2outputoracle_more.go index bf9b46baaa..0048ceee77 100644 --- a/kroma-bindings/bindings/l2outputoracle_more.go +++ b/kroma-bindings/bindings/l2outputoracle_more.go @@ -9,11 +9,11 @@ import ( "github.com/ethereum-optimism/optimism/op-bindings/solc" ) -const L2OutputOracleStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/L1/L2OutputOracle.sol:L2OutputOracle\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"contracts/L1/L2OutputOracle.sol:L2OutputOracle\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"contracts/L1/L2OutputOracle.sol:L2OutputOracle\",\"label\":\"startingBlockNumber\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_uint256\"},{\"astId\":1003,\"contract\":\"contracts/L1/L2OutputOracle.sol:L2OutputOracle\",\"label\":\"startingTimestamp\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_uint256\"},{\"astId\":1004,\"contract\":\"contracts/L1/L2OutputOracle.sol:L2OutputOracle\",\"label\":\"l2Outputs\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_array(t_struct(CheckpointOutput)1005_storage)dyn_storage\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_struct(CheckpointOutput)1005_storage)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"struct Types.CheckpointOutput[]\",\"numberOfBytes\":\"32\",\"base\":\"t_struct(CheckpointOutput)1005_storage\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_struct(CheckpointOutput)1005_storage\":{\"encoding\":\"inplace\",\"label\":\"struct Types.CheckpointOutput\",\"numberOfBytes\":\"96\"},\"t_uint128\":{\"encoding\":\"inplace\",\"label\":\"uint128\",\"numberOfBytes\":\"16\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" +const L2OutputOracleStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/L1/L2OutputOracle.sol:L2OutputOracle\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"contracts/L1/L2OutputOracle.sol:L2OutputOracle\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"contracts/L1/L2OutputOracle.sol:L2OutputOracle\",\"label\":\"startingBlockNumber\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_uint256\"},{\"astId\":1003,\"contract\":\"contracts/L1/L2OutputOracle.sol:L2OutputOracle\",\"label\":\"startingTimestamp\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_uint256\"},{\"astId\":1004,\"contract\":\"contracts/L1/L2OutputOracle.sol:L2OutputOracle\",\"label\":\"l2Outputs\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_array(t_struct(CheckpointOutput)1006_storage)dyn_storage\"},{\"astId\":1005,\"contract\":\"contracts/L1/L2OutputOracle.sol:L2OutputOracle\",\"label\":\"nextFinalizeOutputIndex\",\"offset\":0,\"slot\":\"4\",\"type\":\"t_uint256\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_struct(CheckpointOutput)1006_storage)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"struct Types.CheckpointOutput[]\",\"numberOfBytes\":\"32\",\"base\":\"t_struct(CheckpointOutput)1006_storage\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_struct(CheckpointOutput)1006_storage\":{\"encoding\":\"inplace\",\"label\":\"struct Types.CheckpointOutput\",\"numberOfBytes\":\"96\"},\"t_uint128\":{\"encoding\":\"inplace\",\"label\":\"uint128\",\"numberOfBytes\":\"16\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" var L2OutputOracleStorageLayout = new(solc.StorageLayout) -var L2OutputOracleDeployedBin = "0x6080604052600436106101745760003560e01c80639e45e8f4116100cb578063cf8e5cf01161007f578063e4a3011611610059578063e4a30116146104bb578063e6646723146104db578063f4daa291146104fb57600080fd5b8063cf8e5cf014610466578063d1de856c14610486578063dcec3348146104a657600080fd5b8063a48ea6de116100b0578063a48ea6de146103f2578063b0ea09a814610412578063b98debbf1461043257600080fd5b80639e45e8f41461031a578063a25ae5571461037357600080fd5b80635a045f781161012d57806370872aa51161010757806370872aa5146102ce5780637f006420146102e4578063887862721461030457600080fd5b80635a045f781461028f57806369f16eec146102a45780636abcf563146102b957600080fd5b80634599c7881161015e5780634599c788146101f0578063529933df1461020557806354fd4d501461023957600080fd5b80622134cc1461017957806333727c4d146101c0575b600080fd5b34801561018557600080fd5b506101ad7f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b3480156101cc57600080fd5b506101e06101db3660046115f1565b61052f565b60405190151581526020016101b7565b3480156101fc57600080fd5b506101ad61059d565b34801561021157600080fd5b506101ad7f000000000000000000000000000000000000000000000000000000000000000081565b34801561024557600080fd5b506102826040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516101b7919061160a565b6102a261029d36600461167d565b610610565b005b3480156102b057600080fd5b506101ad610c17565b3480156102c557600080fd5b506003546101ad565b3480156102da57600080fd5b506101ad60015481565b3480156102f057600080fd5b506101ad6102ff3660046115f1565b610c29565b34801561031057600080fd5b506101ad60025481565b34801561032657600080fd5b5061034e7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b7565b34801561037f57600080fd5b5061039361038e3660046115f1565b610e09565b60408051825173ffffffffffffffffffffffffffffffffffffffff16815260208084015190820152828201516fffffffffffffffffffffffffffffffff90811692820192909252606092830151909116918101919091526080016101b7565b3480156103fe57600080fd5b506101ad61040d3660046115f1565b610ec6565b34801561041e57600080fd5b5061034e61042d3660046115f1565b610f32565b34801561043e57600080fd5b5061034e7f000000000000000000000000000000000000000000000000000000000000000081565b34801561047257600080fd5b506103936104813660046115f1565b610f74565b34801561049257600080fd5b506101ad6104a13660046115f1565b610fb3565b3480156104b257600080fd5b506101ad610ffb565b3480156104c757600080fd5b506102a26104d63660046116af565b611041565b3480156104e757600080fd5b506102a26104f63660046116f6565b61125a565b34801561050757600080fd5b506101ad7f000000000000000000000000000000000000000000000000000000000000000081565b6000427f0000000000000000000000000000000000000000000000000000000000000000600384815481106105665761056661172f565b600091825260209091206002600390920201015461059691906fffffffffffffffffffffffffffffffff1661178d565b1092915050565b6003546000901561060757600380546105b8906001906117a5565b815481106105c8576105c861172f565b600091825260209091206003909102016002015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16919050565b6001545b905090565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a5490466040518163ffffffff1660e01b8152600401602060405180830381865afa15801561067d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a191906117bc565b905073ffffffffffffffffffffffffffffffffffffffff80821614610776573373ffffffffffffffffffffffffffffffffffffffff8216146107765760405162461bcd60e51b815260206004820152604260248201527f4c324f75747075744f7261636c653a206f6e6c7920746865206e65787420736560448201527f6c65637465642076616c696461746f722063616e207375626d6974206f75747060648201527f7574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b61077e610ffb565b84146108185760405162461bcd60e51b815260206004820152604860248201527f4c324f75747075744f7261636c653a20626c6f636b206e756d626572206d757360448201527f7420626520657175616c20746f206e65787420657870656374656420626c6f6360648201527f6b206e756d626572000000000000000000000000000000000000000000000000608482015260a40161076d565b4261082285610fb3565b106108955760405162461bcd60e51b815260206004820152603560248201527f4c324f75747075744f7261636c653a2063616e6e6f74207375626d6974204c3260448201527f206f757470757420696e20746865206675747572650000000000000000000000606482015260840161076d565b846109085760405162461bcd60e51b815260206004820152603c60248201527f4c324f75747075744f7261636c653a204c3220636865636b706f696e74206f7560448201527f747075742063616e6e6f7420626520746865207a65726f206861736800000000606482015260840161076d565b82158015906109175750814015155b156109b857828240146109b85760405162461bcd60e51b815260206004820152604960248201527f4c324f75747075744f7261636c653a20626c6f636b206861736820646f65732060448201527f6e6f74206d61746368207468652068617368206174207468652065787065637460648201527f6564206865696768740000000000000000000000000000000000000000000000608482015260a40161076d565b60006109c360035490565b60408051608081018252338152602081018981526fffffffffffffffffffffffffffffffff428181168486019081528b831660608601908152600380546001810182556000829052965196027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b8101805473ffffffffffffffffffffffffffffffffffffffff989098167fffffffffffffffffffffffff00000000000000000000000000000000000000009098169790971790965593517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c86015551925182167001000000000000000000000000000000000292909116919091177fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d9092019190915590519192508691839189917f457b4388026260019ae0b0b4f16c98235d74fe7359be469bdcba16e6d0d4968991610b209190815260200190565b60405180910390a473ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663d38dc7ee82610b8f7f00000000000000000000000000000000000000000000000000000000000000004261178d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526fffffffffffffffffffffffffffffffff166024820152604401600060405180830381600087803b158015610bf757600080fd5b505af1158015610c0b573d6000803e3d6000fd5b50505050505050505050565b60035460009061060b906001906117a5565b6000610c3361059d565b821115610cce5760405162461bcd60e51b815260206004820152604960248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f7420666f72206120626c6f636b207468617420686173206e6f74206265656e2060648201527f7375626d69747465640000000000000000000000000000000000000000000000608482015260a40161076d565b600354610d695760405162461bcd60e51b815260206004820152604760248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f74206173206e6f206f7574707574732068617665206265656e207375626d697460648201527f7465642079657400000000000000000000000000000000000000000000000000608482015260a40161076d565b6003546000905b80821015610e025760006002610d86838561178d565b610d9091906117e0565b90508460038281548110610da657610da661172f565b600091825260209091206003909102016002015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff161015610df857610df181600161178d565b9250610dfc565b8091505b50610d70565b5092915050565b60408051608081018252600080825260208201819052918101829052606081019190915260038281548110610e4057610e4061172f565b6000918252602091829020604080516080810182526003909302909101805473ffffffffffffffffffffffffffffffffffffffff1683526001810154938301939093526002909201546fffffffffffffffffffffffffffffffff808216938301939093527001000000000000000000000000000000009004909116606082015292915050565b60007f000000000000000000000000000000000000000000000000000000000000000060038381548110610efc57610efc61172f565b6000918252602090912060026003909202010154610f2c91906fffffffffffffffffffffffffffffffff1661178d565b92915050565b600060038281548110610f4757610f4761172f565b600091825260209091206003909102015473ffffffffffffffffffffffffffffffffffffffff1692915050565b6040805160808101825260008082526020820181905291810182905260608101919091526003610fa383610c29565b81548110610e4057610e4061172f565b60007f000000000000000000000000000000000000000000000000000000000000000060015483610fe491906117a5565b610fee919061181b565b600254610f2c919061178d565b60035460009015611039577f000000000000000000000000000000000000000000000000000000000000000061102f61059d565b61060b919061178d565b61060b61059d565b600054610100900460ff16158080156110615750600054600160ff909116105b8061107b5750303b15801561107b575060005460ff166001145b6110ed5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161076d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561114b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b428211156111e85760405162461bcd60e51b8152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201527f74696d6500000000000000000000000000000000000000000000000000000000608482015260a40161076d565b60028290556001839055801561125557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461132b5760405162461bcd60e51b815260206004820152604160248201527f4c324f75747075744f7261636c653a206f6e6c792074686520636f6c6f73736560448201527f756d20636f6e74726163742063616e207265706c61636520616e206f7574707560648201527f7400000000000000000000000000000000000000000000000000000000000000608482015260a40161076d565b73ffffffffffffffffffffffffffffffffffffffff81166113b45760405162461bcd60e51b815260206004820152603060248201527f4c324f75747075744f7261636c653a207375626d69747465722061646472657360448201527f732063616e6e6f74206265207a65726f00000000000000000000000000000000606482015260840161076d565b60035483106114515760405162461bcd60e51b815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f74207265706c616365206160448201527f6e206f757470757420616674657220746865206c6174657374206f757470757460648201527f20696e6465780000000000000000000000000000000000000000000000000000608482015260a40161076d565b6000600384815481106114665761146661172f565b6000918252602090912060039091020160028101549091507f0000000000000000000000000000000000000000000000000000000000000000906114bc906fffffffffffffffffffffffffffffffff16426117a5565b106115555760405162461bcd60e51b815260206004820152604860248201527f4c324f75747075744f7261636c653a2063616e6e6f74207265706c616365206160448201527f6e206f757470757420746861742068617320616c7265616479206265656e206660648201527f696e616c697a6564000000000000000000000000000000000000000000000000608482015260a40161076d565b6001810183905580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831617815560405183815284907fa1b831bb8b6b242db6d0988a6d21f869c610de9f703a5e45e1b7d3dc3137b9069060200160405180910390a250505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60006020828403121561160357600080fd5b5035919050565b600060208083528351808285015260005b818110156116375785810183015185820160400152820161161b565b81811115611649576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000806000806080858703121561169357600080fd5b5050823594602084013594506040840135936060013592509050565b600080604083850312156116c257600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff811681146116f357600080fd5b50565b60008060006060848603121561170b57600080fd5b83359250602084013591506040840135611724816116d1565b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156117a0576117a061175e565b500190565b6000828210156117b7576117b761175e565b500390565b6000602082840312156117ce57600080fd5b81516117d9816116d1565b9392505050565b600082611816577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156118535761185361175e565b50029056fea164736f6c634300080f000a" +var L2OutputOracleDeployedBin = "0x6080604052600436106101a05760003560e01c80639e45e8f4116100e1578063cf8e5cf01161008a578063e4a3011611610064578063e4a3011614610550578063e664672314610570578063f403838d14610590578063f4daa291146105a657600080fd5b8063cf8e5cf0146104fb578063d1de856c1461051b578063dcec33481461053b57600080fd5b8063ae9483e0116100bb578063ae9483e014610473578063b0ea09a8146104a7578063b98debbf146104c757600080fd5b80639e45e8f41461037b578063a25ae557146103d4578063a48ea6de1461045357600080fd5b806369f16eec1161014e5780637f006420116101285780637f0064201461031057806380446bd21461033057806388786272146103455780639902cdc01461035b57600080fd5b806369f16eec146102d05780636abcf563146102e557806370872aa5146102fa57600080fd5b8063529933df1161017f578063529933df1461023157806354fd4d50146102655780635a045f78146102bb57600080fd5b80622134cc146101a557806333727c4d146101ec5780634599c7881461021c575b600080fd5b3480156101b157600080fd5b506101d97f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b3480156101f857600080fd5b5061020c610207366004611ac3565b6105da565b60405190151581526020016101e3565b34801561022857600080fd5b506101d96105ee565b34801561023d57600080fd5b506101d97f000000000000000000000000000000000000000000000000000000000000000081565b34801561027157600080fd5b506102ae6040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516101e39190611adc565b6102ce6102c9366004611b4f565b610661565b005b3480156102dc57600080fd5b506101d9610e7d565b3480156102f157600080fd5b506003546101d9565b34801561030657600080fd5b506101d960015481565b34801561031c57600080fd5b506101d961032b366004611ac3565b610e8f565b34801561033c57600080fd5b506101d961106f565b34801561035157600080fd5b506101d960025481565b34801561036757600080fd5b506102ce610376366004611ac3565b611087565b34801561038757600080fd5b506103af7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101e3565b3480156103e057600080fd5b506103f46103ef366004611ac3565b6112d9565b60408051825173ffffffffffffffffffffffffffffffffffffffff16815260208084015190820152828201516fffffffffffffffffffffffffffffffff90811692820192909252606092830151909116918101919091526080016101e3565b34801561045f57600080fd5b506101d961046e366004611ac3565b611396565b34801561047f57600080fd5b506103af7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104b357600080fd5b506103af6104c2366004611ac3565b611402565b3480156104d357600080fd5b506103af7f000000000000000000000000000000000000000000000000000000000000000081565b34801561050757600080fd5b506103f4610516366004611ac3565b611444565b34801561052757600080fd5b506101d9610536366004611ac3565b611483565b34801561054757600080fd5b506101d96114cb565b34801561055c57600080fd5b506102ce61056b366004611b81565b611511565b34801561057c57600080fd5b506102ce61058b366004611bc8565b61172a565b34801561059c57600080fd5b506101d960045481565b3480156105b257600080fd5b506101d97f000000000000000000000000000000000000000000000000000000000000000081565b6000426105e683611396565b111592915050565b60035460009015610658576003805461060990600190611c30565b8154811061061957610619611c47565b600091825260209091206003909102016002015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16919050565b6001545b905090565b600061066c60035490565b6040517fad36d6cc0000000000000000000000000000000000000000000000000000000081526004810182905290915060009073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063ad36d6cc90602401602060405180830381865afa1580156106fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107219190611c76565b9050600081156107cd576040517f891aab740000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063891aab749060240160006040518083038186803b1580156107b057600080fd5b505afa1580156107c4573d6000803e3d6000fd5b5050505061085f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16633a5490466040518163ffffffff1660e01b8152600401602060405180830381865afa158015610838573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085c9190611c9f565b90505b81158015610883575073ffffffffffffffffffffffffffffffffffffffff81811614155b1561093e573373ffffffffffffffffffffffffffffffffffffffff82161461093e5760405162461bcd60e51b815260206004820152604260248201527f4c324f75747075744f7261636c653a206f6e6c7920746865206e65787420736560448201527f6c65637465642076616c696461746f722063616e207375626d6974206f75747060648201527f7574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b6109466114cb565b86146109e05760405162461bcd60e51b815260206004820152604860248201527f4c324f75747075744f7261636c653a20626c6f636b206e756d626572206d757360448201527f7420626520657175616c20746f206e65787420657870656374656420626c6f6360648201527f6b206e756d626572000000000000000000000000000000000000000000000000608482015260a401610935565b426109e961106f565b1115610a5d5760405162461bcd60e51b815260206004820152603560248201527f4c324f75747075744f7261636c653a2063616e6e6f74207375626d6974204c3260448201527f206f757470757420696e207468652066757475726500000000000000000000006064820152608401610935565b86610ad05760405162461bcd60e51b815260206004820152603c60248201527f4c324f75747075744f7261636c653a204c3220636865636b706f696e74206f7560448201527f747075742063616e6e6f7420626520746865207a65726f2068617368000000006064820152608401610935565b8415801590610adf5750834015155b15610b805784844014610b805760405162461bcd60e51b815260206004820152604960248201527f4c324f75747075744f7261636c653a20626c6f636b206861736820646f65732060448201527f6e6f74206d61746368207468652068617368206174207468652065787065637460648201527f6564206865696768740000000000000000000000000000000000000000000000608482015260a401610935565b60408051608081018252338152602081018981526fffffffffffffffffffffffffffffffff428181168486019081528b831660608601908152600380546001810182556000829052965196027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b8101805473ffffffffffffffffffffffffffffffffffffffff989098167fffffffffffffffffffffffff00000000000000000000000000000000000000009098169790971790965593517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c86015551925182167001000000000000000000000000000000000292909116919091177fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d909201919091559051879185918a917f457b4388026260019ae0b0b4f16c98235d74fe7359be469bdcba16e6d0d4968991610cd991815260200190565b60405180910390a48115610d8c576040517fbe119347000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063be11934790602401600060405180830381600087803b158015610d6f57600080fd5b505af1158015610d83573d6000803e3d6000fd5b50505050610e74565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663d38dc7ee84610df37f000000000000000000000000000000000000000000000000000000000000000042611cbc565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526fffffffffffffffffffffffffffffffff166024820152604401600060405180830381600087803b158015610e5b57600080fd5b505af1158015610e6f573d6000803e3d6000fd5b505050505b50505050505050565b60035460009061065c90600190611c30565b6000610e996105ee565b821115610f345760405162461bcd60e51b815260206004820152604960248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f7420666f72206120626c6f636b207468617420686173206e6f74206265656e2060648201527f7375626d69747465640000000000000000000000000000000000000000000000608482015260a401610935565b600354610fcf5760405162461bcd60e51b815260206004820152604760248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f74206173206e6f206f7574707574732068617665206265656e207375626d697460648201527f7465642079657400000000000000000000000000000000000000000000000000608482015260a401610935565b6003546000905b808210156110685760006002610fec8385611cbc565b610ff69190611cd4565b9050846003828154811061100c5761100c611c47565b600091825260209091206003909102016002015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16101561105e57611057816001611cbc565b9250611062565b8091505b50610fd6565b5092915050565b600061065c61107c6114cb565b610536906001611cbc565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663ad36d6cc6110ce600184611c30565b6040518263ffffffff1660e01b81526004016110ec91815260200190565b602060405180830381865afa158015611109573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112d9190611c76565b15611208573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146112035760405162461bcd60e51b815260206004820152605660248201527f4c324f75747075744f7261636c653a206f6e6c79207468652076616c6964617460448201527f6f72206d616e6167657220636f6e74726163742063616e20736574206e65787460648201527f2066696e616c697a65206f757470757420696e64657800000000000000000000608482015260a401610935565b600455565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146112035760405162461bcd60e51b815260206004820152605360248201527f4c324f75747075744f7261636c653a206f6e6c79207468652076616c6964617460448201527f6f7220706f6f6c20636f6e74726163742063616e20736574206e65787420666960648201527f6e616c697a65206f757470757420696e64657800000000000000000000000000608482015260a401610935565b6040805160808101825260008082526020820181905291810182905260608101919091526003828154811061131057611310611c47565b6000918252602091829020604080516080810182526003909302909101805473ffffffffffffffffffffffffffffffffffffffff1683526001810154938301939093526002909201546fffffffffffffffffffffffffffffffff808216938301939093527001000000000000000000000000000000009004909116606082015292915050565b60007f0000000000000000000000000000000000000000000000000000000000000000600383815481106113cc576113cc611c47565b60009182526020909120600260039092020101546113fc91906fffffffffffffffffffffffffffffffff16611cbc565b92915050565b60006003828154811061141757611417611c47565b600091825260209091206003909102015473ffffffffffffffffffffffffffffffffffffffff1692915050565b604080516080810182526000808252602082018190529181018290526060810191909152600361147383610e8f565b8154811061131057611310611c47565b60007f0000000000000000000000000000000000000000000000000000000000000000600154836114b49190611c30565b6114be9190611d0f565b6002546113fc9190611cbc565b60035460009015611509577f00000000000000000000000000000000000000000000000000000000000000006114ff6105ee565b61065c9190611cbc565b61065c6105ee565b600054610100900460ff16158080156115315750600054600160ff909116105b8061154b5750303b15801561154b575060005460ff166001145b6115bd5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610935565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561161b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b428211156116b85760405162461bcd60e51b8152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201527f74696d6500000000000000000000000000000000000000000000000000000000608482015260a401610935565b60028290556001839055801561172557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146117fb5760405162461bcd60e51b815260206004820152604160248201527f4c324f75747075744f7261636c653a206f6e6c792074686520636f6c6f73736560448201527f756d20636f6e74726163742063616e207265706c61636520616e206f7574707560648201527f7400000000000000000000000000000000000000000000000000000000000000608482015260a401610935565b73ffffffffffffffffffffffffffffffffffffffff81166118845760405162461bcd60e51b815260206004820152603060248201527f4c324f75747075744f7261636c653a207375626d69747465722061646472657360448201527f732063616e6e6f74206265207a65726f000000000000000000000000000000006064820152608401610935565b60035483106119215760405162461bcd60e51b815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f74207265706c616365206160448201527f6e206f757470757420616674657220746865206c6174657374206f757470757460648201527f20696e6465780000000000000000000000000000000000000000000000000000608482015260a401610935565b60006003848154811061193657611936611c47565b6000918252602090912060039091020160028101549091507f00000000000000000000000000000000000000000000000000000000000000009061198c906fffffffffffffffffffffffffffffffff1642611c30565b10611a255760405162461bcd60e51b815260206004820152604860248201527f4c324f75747075744f7261636c653a2063616e6e6f74207265706c616365206160448201527f6e206f757470757420746861742068617320616c7265616479206265656e206660648201527f696e616c697a6564000000000000000000000000000000000000000000000000608482015260a401610935565b6001810183905580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405184815285907f1ec0d63ba3dd4b277ece3e578c4c9587edfa0d855192704c88f9a1d74316624f9060200160405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600060208284031215611ad557600080fd5b5035919050565b600060208083528351808285015260005b81811015611b0957858101830151858201604001528201611aed565b81811115611b1b576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60008060008060808587031215611b6557600080fd5b5050823594602084013594506040840135936060013592509050565b60008060408385031215611b9457600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114611bc557600080fd5b50565b600080600060608486031215611bdd57600080fd5b83359250602084013591506040840135611bf681611ba3565b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611c4257611c42611c01565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215611c8857600080fd5b81518015158114611c9857600080fd5b9392505050565b600060208284031215611cb157600080fd5b8151611c9881611ba3565b60008219821115611ccf57611ccf611c01565b500190565b600082611d0a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611d4757611d47611c01565b50029056fea164736f6c634300080f000a" func init() { diff --git a/kroma-bindings/bindings/mintmanager.go b/kroma-bindings/bindings/mintmanager.go new file mode 100644 index 0000000000..459450b4d2 --- /dev/null +++ b/kroma-bindings/bindings/mintmanager.go @@ -0,0 +1,925 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// MintManagerMetaData contains all meta data concerning the MintManager contract. +var MintManagerMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_governanceToken\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_recipients\",\"type\":\"address[]\",\"internalType\":\"address[]\"},{\"name\":\"_shares\",\"type\":\"uint256[]\",\"internalType\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"GOVERNANCE_TOKEN\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractGovernanceToken\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MINT_CAP\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"SHARE_DENOMINATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"acceptOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"acceptOwnershipOfToken\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"distribute\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"mint\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"minted\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"pendingOwner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"recipients\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"renounceOwnershipOfToken\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"shareOf\",\"inputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnershipOfToken\",\"inputs\":[{\"name\":\"newMintManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"OwnershipTransferStarted\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false}]", + Bin: "0x60a06040523480156200001157600080fd5b506040516200169338038062001693833981016040819052620000349162000574565b6200003f336200032a565b6001600160a01b038416608052620000578362000354565b8051825114620000ba5760405162461bcd60e51b8152602060048201526024808201527f4d696e744d616e616765723a20696e76616c6964206c656e677468206f6620616044820152637272617960e01b60648201526084015b60405180910390fd5b6000805b835181101562000295576000848281518110620000df57620000df6200066a565b6020026020010151905060006001600160a01b0316816001600160a01b031603620001605760405162461bcd60e51b815260206004820152602a60248201527f4d696e744d616e616765723a20726563697069656e74206164647265737320636044820152690616e6e6f7420626520360b41b6064820152608401620000b1565b60008483815181106200017757620001776200066a565b6020026020010151905080600003620001d35760405162461bcd60e51b815260206004820152601e60248201527f4d696e744d616e616765723a2073686172652063616e6e6f74206265203000006044820152606401620000b1565b6001600160a01b03821660009081526003602052604081205490036200023f57600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0384161790555b6001600160a01b038216600090815260036020526040812080548392906200026990849062000696565b909155506200027b9050818562000696565b9350505080806200028c90620006b1565b915050620000be565b50620186a08111156200031f5760405162461bcd60e51b8152602060048201526044602482018190527f4d696e744d616e616765723a206d617820746f74616c20736861726520697320908201527f657175616c206f72206c657373207468616e2053484152455f44454e4f4d494e60648201526320aa27a960e11b608482015260a401620000b1565b5050505050620006cd565b600180546001600160a01b03191690556200035181620003c7602090811b62000b5317901c565b50565b6200035e62000417565b600180546001600160a01b0319166001600160a01b0383169081179091556200038f6000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b03163314620004735760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620000b1565b565b80516001600160a01b03811681146200048d57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620004d357620004d362000492565b604052919050565b60006001600160401b03821115620004f757620004f762000492565b5060051b60200190565b600082601f8301126200051357600080fd5b815160206200052c6200052683620004db565b620004a8565b82815260059290921b840181019181810190868411156200054c57600080fd5b8286015b8481101562000569578051835291830191830162000550565b509695505050505050565b600080600080608085870312156200058b57600080fd5b620005968562000475565b93506020620005a781870162000475565b60408701519094506001600160401b0380821115620005c557600080fd5b818801915088601f830112620005da57600080fd5b8151620005eb6200052682620004db565b81815260059190911b8301840190848101908b8311156200060b57600080fd5b938501935b828510156200063457620006248562000475565b8252938501939085019062000610565b60608b015190975094505050808311156200064e57600080fd5b50506200065e8782880162000501565b91505092959194509250565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115620006ac57620006ac62000680565b500190565b600060018201620006c657620006c662000680565b5060010190565b608051610f796200071a6000396000818161014f01528181610331015281816104a3015281816105610152818161062e0152818161080a015281816108b30152610a190152610f796000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80637eb1184511610097578063d1bc76a111610066578063d1bc76a114610229578063e30c39781461023c578063e4fc6b6d1461025a578063f2fde38b1461026257600080fd5b80637eb11845146101ee5780638da5cb5b146101f857806398f1312e14610216578063baee5ed41461022157600080fd5b8063457c3977116100d3578063457c3977146101965780634f02c420146101a9578063715018a6146101de57806379ba5097146101e657600080fd5b80631249c58b1461010557806321e5e2c41461010f57806328df3f18146101425780632efd46d61461014a575b600080fd5b61010d610275565b005b61012f61011d366004610c7a565b60036020526000908152604090205481565b6040519081526020015b60405180910390f35b61010d610557565b6101717f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610139565b61010d6101a4366004610c7a565b6105e1565b6001546101ce9074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610139565b61010d61068d565b61010d6106a1565b61012f620186a081565b60005473ffffffffffffffffffffffffffffffffffffffff16610171565b61012f633b9aca0081565b61010d610756565b610171610237366004610cb7565b610870565b60015473ffffffffffffffffffffffffffffffffffffffff16610171565b61010d6108a7565b61010d610270366004610c7a565b610aa3565b61027d610bc8565b60015474010000000000000000000000000000000000000000900460ff161561032d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4d696e744d616e616765723a20616c7265616479206d696e746564206f6e207460448201527f68697320636861696e000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561039a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103be9190610cd0565b6103c990600a610e44565b6103d790633b9aca00610e53565b90506000805b60025481101561046d576000600282815481106103fc576103fc610e90565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168083526003909152604082205490925090620186a061043f8388610e53565b6104499190610ebf565b90506104558186610efa565b9450505050808061046590610f12565b9150506103dd565b506040517f40c10f19000000000000000000000000000000000000000000000000000000008152306004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906340c10f1990604401600060405180830381600087803b1580156104fc57600080fd5b505af1158015610510573d6000803e3d6000fd5b5050600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905550505050565b61055f610bc8565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379ba50976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105c757600080fd5b505af11580156105db573d6000803e3d6000fd5b50505050565b6105e9610bc8565b6040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063f2fde38b90602401600060405180830381600087803b15801561067257600080fd5b505af1158015610686573d6000803e3d6000fd5b5050505050565b610695610bc8565b61069f6000610c49565b565b600154339073ffffffffffffffffffffffffffffffffffffffff16811461074a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610324565b61075381610c49565b50565b61075e610bc8565b60015474010000000000000000000000000000000000000000900460ff16610808576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4d696e744d616e616765723a206e6f74206d696e746564206265666f7265207260448201527f656e6f756e6365206f776e6572736869700000000000000000000000000000006064820152608401610324565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663715018a66040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105c757600080fd5b6002818154811061088057600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b6108af610bc8565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561091c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109409190610cd0565b61094b90600a610e44565b61095990633b9aca00610e53565b905060005b600254811015610a9f5760006002828154811061097d5761097d610e90565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168083526003909152604082205490925090620186a06109c08387610e53565b6109ca9190610ebf565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af1158015610a64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a889190610f4a565b505050508080610a9790610f12565b91505061095e565b5050565b610aab610bc8565b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009091168117909155610b0e60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461069f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610324565b600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905561075381610b53565b600060208284031215610c8c57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610cb057600080fd5b9392505050565b600060208284031215610cc957600080fd5b5035919050565b600060208284031215610ce257600080fd5b815160ff81168114610cb057600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b80851115610d7b57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610d6157610d61610cf3565b80851615610d6e57918102915b93841c9390800290610d27565b509250929050565b600082610d9257506001610e3e565b81610d9f57506000610e3e565b8160018114610db55760028114610dbf57610ddb565b6001915050610e3e565b60ff841115610dd057610dd0610cf3565b50506001821b610e3e565b5060208310610133831016604e8410600b8410161715610dfe575081810a610e3e565b610e088383610d22565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610e3a57610e3a610cf3565b0290505b92915050565b6000610cb060ff841683610d83565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610e8b57610e8b610cf3565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082610ef5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008219821115610f0d57610f0d610cf3565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610f4357610f43610cf3565b5060010190565b600060208284031215610f5c57600080fd5b81518015158114610cb057600080fdfea164736f6c634300080f000a", +} + +// MintManagerABI is the input ABI used to generate the binding from. +// Deprecated: Use MintManagerMetaData.ABI instead. +var MintManagerABI = MintManagerMetaData.ABI + +// MintManagerBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use MintManagerMetaData.Bin instead. +var MintManagerBin = MintManagerMetaData.Bin + +// DeployMintManager deploys a new Ethereum contract, binding an instance of MintManager to it. +func DeployMintManager(auth *bind.TransactOpts, backend bind.ContractBackend, _governanceToken common.Address, _owner common.Address, _recipients []common.Address, _shares []*big.Int) (common.Address, *types.Transaction, *MintManager, error) { + parsed, err := MintManagerMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(MintManagerBin), backend, _governanceToken, _owner, _recipients, _shares) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &MintManager{MintManagerCaller: MintManagerCaller{contract: contract}, MintManagerTransactor: MintManagerTransactor{contract: contract}, MintManagerFilterer: MintManagerFilterer{contract: contract}}, nil +} + +// MintManager is an auto generated Go binding around an Ethereum contract. +type MintManager struct { + MintManagerCaller // Read-only binding to the contract + MintManagerTransactor // Write-only binding to the contract + MintManagerFilterer // Log filterer for contract events +} + +// MintManagerCaller is an auto generated read-only Go binding around an Ethereum contract. +type MintManagerCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MintManagerTransactor is an auto generated write-only Go binding around an Ethereum contract. +type MintManagerTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MintManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type MintManagerFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MintManagerSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type MintManagerSession struct { + Contract *MintManager // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// MintManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type MintManagerCallerSession struct { + Contract *MintManagerCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// MintManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type MintManagerTransactorSession struct { + Contract *MintManagerTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// MintManagerRaw is an auto generated low-level Go binding around an Ethereum contract. +type MintManagerRaw struct { + Contract *MintManager // Generic contract binding to access the raw methods on +} + +// MintManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type MintManagerCallerRaw struct { + Contract *MintManagerCaller // Generic read-only contract binding to access the raw methods on +} + +// MintManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type MintManagerTransactorRaw struct { + Contract *MintManagerTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewMintManager creates a new instance of MintManager, bound to a specific deployed contract. +func NewMintManager(address common.Address, backend bind.ContractBackend) (*MintManager, error) { + contract, err := bindMintManager(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &MintManager{MintManagerCaller: MintManagerCaller{contract: contract}, MintManagerTransactor: MintManagerTransactor{contract: contract}, MintManagerFilterer: MintManagerFilterer{contract: contract}}, nil +} + +// NewMintManagerCaller creates a new read-only instance of MintManager, bound to a specific deployed contract. +func NewMintManagerCaller(address common.Address, caller bind.ContractCaller) (*MintManagerCaller, error) { + contract, err := bindMintManager(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &MintManagerCaller{contract: contract}, nil +} + +// NewMintManagerTransactor creates a new write-only instance of MintManager, bound to a specific deployed contract. +func NewMintManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*MintManagerTransactor, error) { + contract, err := bindMintManager(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &MintManagerTransactor{contract: contract}, nil +} + +// NewMintManagerFilterer creates a new log filterer instance of MintManager, bound to a specific deployed contract. +func NewMintManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*MintManagerFilterer, error) { + contract, err := bindMintManager(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &MintManagerFilterer{contract: contract}, nil +} + +// bindMintManager binds a generic wrapper to an already deployed contract. +func bindMintManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := MintManagerMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_MintManager *MintManagerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _MintManager.Contract.MintManagerCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_MintManager *MintManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MintManager.Contract.MintManagerTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_MintManager *MintManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _MintManager.Contract.MintManagerTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_MintManager *MintManagerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _MintManager.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_MintManager *MintManagerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MintManager.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_MintManager *MintManagerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _MintManager.Contract.contract.Transact(opts, method, params...) +} + +// GOVERNANCETOKEN is a free data retrieval call binding the contract method 0x2efd46d6. +// +// Solidity: function GOVERNANCE_TOKEN() view returns(address) +func (_MintManager *MintManagerCaller) GOVERNANCETOKEN(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _MintManager.contract.Call(opts, &out, "GOVERNANCE_TOKEN") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GOVERNANCETOKEN is a free data retrieval call binding the contract method 0x2efd46d6. +// +// Solidity: function GOVERNANCE_TOKEN() view returns(address) +func (_MintManager *MintManagerSession) GOVERNANCETOKEN() (common.Address, error) { + return _MintManager.Contract.GOVERNANCETOKEN(&_MintManager.CallOpts) +} + +// GOVERNANCETOKEN is a free data retrieval call binding the contract method 0x2efd46d6. +// +// Solidity: function GOVERNANCE_TOKEN() view returns(address) +func (_MintManager *MintManagerCallerSession) GOVERNANCETOKEN() (common.Address, error) { + return _MintManager.Contract.GOVERNANCETOKEN(&_MintManager.CallOpts) +} + +// MINTCAP is a free data retrieval call binding the contract method 0x98f1312e. +// +// Solidity: function MINT_CAP() view returns(uint256) +func (_MintManager *MintManagerCaller) MINTCAP(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _MintManager.contract.Call(opts, &out, "MINT_CAP") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// MINTCAP is a free data retrieval call binding the contract method 0x98f1312e. +// +// Solidity: function MINT_CAP() view returns(uint256) +func (_MintManager *MintManagerSession) MINTCAP() (*big.Int, error) { + return _MintManager.Contract.MINTCAP(&_MintManager.CallOpts) +} + +// MINTCAP is a free data retrieval call binding the contract method 0x98f1312e. +// +// Solidity: function MINT_CAP() view returns(uint256) +func (_MintManager *MintManagerCallerSession) MINTCAP() (*big.Int, error) { + return _MintManager.Contract.MINTCAP(&_MintManager.CallOpts) +} + +// SHAREDENOMINATOR is a free data retrieval call binding the contract method 0x7eb11845. +// +// Solidity: function SHARE_DENOMINATOR() view returns(uint256) +func (_MintManager *MintManagerCaller) SHAREDENOMINATOR(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _MintManager.contract.Call(opts, &out, "SHARE_DENOMINATOR") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// SHAREDENOMINATOR is a free data retrieval call binding the contract method 0x7eb11845. +// +// Solidity: function SHARE_DENOMINATOR() view returns(uint256) +func (_MintManager *MintManagerSession) SHAREDENOMINATOR() (*big.Int, error) { + return _MintManager.Contract.SHAREDENOMINATOR(&_MintManager.CallOpts) +} + +// SHAREDENOMINATOR is a free data retrieval call binding the contract method 0x7eb11845. +// +// Solidity: function SHARE_DENOMINATOR() view returns(uint256) +func (_MintManager *MintManagerCallerSession) SHAREDENOMINATOR() (*big.Int, error) { + return _MintManager.Contract.SHAREDENOMINATOR(&_MintManager.CallOpts) +} + +// Minted is a free data retrieval call binding the contract method 0x4f02c420. +// +// Solidity: function minted() view returns(bool) +func (_MintManager *MintManagerCaller) Minted(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _MintManager.contract.Call(opts, &out, "minted") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// Minted is a free data retrieval call binding the contract method 0x4f02c420. +// +// Solidity: function minted() view returns(bool) +func (_MintManager *MintManagerSession) Minted() (bool, error) { + return _MintManager.Contract.Minted(&_MintManager.CallOpts) +} + +// Minted is a free data retrieval call binding the contract method 0x4f02c420. +// +// Solidity: function minted() view returns(bool) +func (_MintManager *MintManagerCallerSession) Minted() (bool, error) { + return _MintManager.Contract.Minted(&_MintManager.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_MintManager *MintManagerCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _MintManager.contract.Call(opts, &out, "owner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_MintManager *MintManagerSession) Owner() (common.Address, error) { + return _MintManager.Contract.Owner(&_MintManager.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_MintManager *MintManagerCallerSession) Owner() (common.Address, error) { + return _MintManager.Contract.Owner(&_MintManager.CallOpts) +} + +// PendingOwner is a free data retrieval call binding the contract method 0xe30c3978. +// +// Solidity: function pendingOwner() view returns(address) +func (_MintManager *MintManagerCaller) PendingOwner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _MintManager.contract.Call(opts, &out, "pendingOwner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// PendingOwner is a free data retrieval call binding the contract method 0xe30c3978. +// +// Solidity: function pendingOwner() view returns(address) +func (_MintManager *MintManagerSession) PendingOwner() (common.Address, error) { + return _MintManager.Contract.PendingOwner(&_MintManager.CallOpts) +} + +// PendingOwner is a free data retrieval call binding the contract method 0xe30c3978. +// +// Solidity: function pendingOwner() view returns(address) +func (_MintManager *MintManagerCallerSession) PendingOwner() (common.Address, error) { + return _MintManager.Contract.PendingOwner(&_MintManager.CallOpts) +} + +// Recipients is a free data retrieval call binding the contract method 0xd1bc76a1. +// +// Solidity: function recipients(uint256 ) view returns(address) +func (_MintManager *MintManagerCaller) Recipients(opts *bind.CallOpts, arg0 *big.Int) (common.Address, error) { + var out []interface{} + err := _MintManager.contract.Call(opts, &out, "recipients", arg0) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Recipients is a free data retrieval call binding the contract method 0xd1bc76a1. +// +// Solidity: function recipients(uint256 ) view returns(address) +func (_MintManager *MintManagerSession) Recipients(arg0 *big.Int) (common.Address, error) { + return _MintManager.Contract.Recipients(&_MintManager.CallOpts, arg0) +} + +// Recipients is a free data retrieval call binding the contract method 0xd1bc76a1. +// +// Solidity: function recipients(uint256 ) view returns(address) +func (_MintManager *MintManagerCallerSession) Recipients(arg0 *big.Int) (common.Address, error) { + return _MintManager.Contract.Recipients(&_MintManager.CallOpts, arg0) +} + +// ShareOf is a free data retrieval call binding the contract method 0x21e5e2c4. +// +// Solidity: function shareOf(address ) view returns(uint256) +func (_MintManager *MintManagerCaller) ShareOf(opts *bind.CallOpts, arg0 common.Address) (*big.Int, error) { + var out []interface{} + err := _MintManager.contract.Call(opts, &out, "shareOf", arg0) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ShareOf is a free data retrieval call binding the contract method 0x21e5e2c4. +// +// Solidity: function shareOf(address ) view returns(uint256) +func (_MintManager *MintManagerSession) ShareOf(arg0 common.Address) (*big.Int, error) { + return _MintManager.Contract.ShareOf(&_MintManager.CallOpts, arg0) +} + +// ShareOf is a free data retrieval call binding the contract method 0x21e5e2c4. +// +// Solidity: function shareOf(address ) view returns(uint256) +func (_MintManager *MintManagerCallerSession) ShareOf(arg0 common.Address) (*big.Int, error) { + return _MintManager.Contract.ShareOf(&_MintManager.CallOpts, arg0) +} + +// AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. +// +// Solidity: function acceptOwnership() returns() +func (_MintManager *MintManagerTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MintManager.contract.Transact(opts, "acceptOwnership") +} + +// AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. +// +// Solidity: function acceptOwnership() returns() +func (_MintManager *MintManagerSession) AcceptOwnership() (*types.Transaction, error) { + return _MintManager.Contract.AcceptOwnership(&_MintManager.TransactOpts) +} + +// AcceptOwnership is a paid mutator transaction binding the contract method 0x79ba5097. +// +// Solidity: function acceptOwnership() returns() +func (_MintManager *MintManagerTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _MintManager.Contract.AcceptOwnership(&_MintManager.TransactOpts) +} + +// AcceptOwnershipOfToken is a paid mutator transaction binding the contract method 0x28df3f18. +// +// Solidity: function acceptOwnershipOfToken() returns() +func (_MintManager *MintManagerTransactor) AcceptOwnershipOfToken(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MintManager.contract.Transact(opts, "acceptOwnershipOfToken") +} + +// AcceptOwnershipOfToken is a paid mutator transaction binding the contract method 0x28df3f18. +// +// Solidity: function acceptOwnershipOfToken() returns() +func (_MintManager *MintManagerSession) AcceptOwnershipOfToken() (*types.Transaction, error) { + return _MintManager.Contract.AcceptOwnershipOfToken(&_MintManager.TransactOpts) +} + +// AcceptOwnershipOfToken is a paid mutator transaction binding the contract method 0x28df3f18. +// +// Solidity: function acceptOwnershipOfToken() returns() +func (_MintManager *MintManagerTransactorSession) AcceptOwnershipOfToken() (*types.Transaction, error) { + return _MintManager.Contract.AcceptOwnershipOfToken(&_MintManager.TransactOpts) +} + +// Distribute is a paid mutator transaction binding the contract method 0xe4fc6b6d. +// +// Solidity: function distribute() returns() +func (_MintManager *MintManagerTransactor) Distribute(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MintManager.contract.Transact(opts, "distribute") +} + +// Distribute is a paid mutator transaction binding the contract method 0xe4fc6b6d. +// +// Solidity: function distribute() returns() +func (_MintManager *MintManagerSession) Distribute() (*types.Transaction, error) { + return _MintManager.Contract.Distribute(&_MintManager.TransactOpts) +} + +// Distribute is a paid mutator transaction binding the contract method 0xe4fc6b6d. +// +// Solidity: function distribute() returns() +func (_MintManager *MintManagerTransactorSession) Distribute() (*types.Transaction, error) { + return _MintManager.Contract.Distribute(&_MintManager.TransactOpts) +} + +// Mint is a paid mutator transaction binding the contract method 0x1249c58b. +// +// Solidity: function mint() returns() +func (_MintManager *MintManagerTransactor) Mint(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MintManager.contract.Transact(opts, "mint") +} + +// Mint is a paid mutator transaction binding the contract method 0x1249c58b. +// +// Solidity: function mint() returns() +func (_MintManager *MintManagerSession) Mint() (*types.Transaction, error) { + return _MintManager.Contract.Mint(&_MintManager.TransactOpts) +} + +// Mint is a paid mutator transaction binding the contract method 0x1249c58b. +// +// Solidity: function mint() returns() +func (_MintManager *MintManagerTransactorSession) Mint() (*types.Transaction, error) { + return _MintManager.Contract.Mint(&_MintManager.TransactOpts) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_MintManager *MintManagerTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MintManager.contract.Transact(opts, "renounceOwnership") +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_MintManager *MintManagerSession) RenounceOwnership() (*types.Transaction, error) { + return _MintManager.Contract.RenounceOwnership(&_MintManager.TransactOpts) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_MintManager *MintManagerTransactorSession) RenounceOwnership() (*types.Transaction, error) { + return _MintManager.Contract.RenounceOwnership(&_MintManager.TransactOpts) +} + +// RenounceOwnershipOfToken is a paid mutator transaction binding the contract method 0xbaee5ed4. +// +// Solidity: function renounceOwnershipOfToken() returns() +func (_MintManager *MintManagerTransactor) RenounceOwnershipOfToken(opts *bind.TransactOpts) (*types.Transaction, error) { + return _MintManager.contract.Transact(opts, "renounceOwnershipOfToken") +} + +// RenounceOwnershipOfToken is a paid mutator transaction binding the contract method 0xbaee5ed4. +// +// Solidity: function renounceOwnershipOfToken() returns() +func (_MintManager *MintManagerSession) RenounceOwnershipOfToken() (*types.Transaction, error) { + return _MintManager.Contract.RenounceOwnershipOfToken(&_MintManager.TransactOpts) +} + +// RenounceOwnershipOfToken is a paid mutator transaction binding the contract method 0xbaee5ed4. +// +// Solidity: function renounceOwnershipOfToken() returns() +func (_MintManager *MintManagerTransactorSession) RenounceOwnershipOfToken() (*types.Transaction, error) { + return _MintManager.Contract.RenounceOwnershipOfToken(&_MintManager.TransactOpts) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_MintManager *MintManagerTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { + return _MintManager.contract.Transact(opts, "transferOwnership", newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_MintManager *MintManagerSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _MintManager.Contract.TransferOwnership(&_MintManager.TransactOpts, newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_MintManager *MintManagerTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _MintManager.Contract.TransferOwnership(&_MintManager.TransactOpts, newOwner) +} + +// TransferOwnershipOfToken is a paid mutator transaction binding the contract method 0x457c3977. +// +// Solidity: function transferOwnershipOfToken(address newMintManager) returns() +func (_MintManager *MintManagerTransactor) TransferOwnershipOfToken(opts *bind.TransactOpts, newMintManager common.Address) (*types.Transaction, error) { + return _MintManager.contract.Transact(opts, "transferOwnershipOfToken", newMintManager) +} + +// TransferOwnershipOfToken is a paid mutator transaction binding the contract method 0x457c3977. +// +// Solidity: function transferOwnershipOfToken(address newMintManager) returns() +func (_MintManager *MintManagerSession) TransferOwnershipOfToken(newMintManager common.Address) (*types.Transaction, error) { + return _MintManager.Contract.TransferOwnershipOfToken(&_MintManager.TransactOpts, newMintManager) +} + +// TransferOwnershipOfToken is a paid mutator transaction binding the contract method 0x457c3977. +// +// Solidity: function transferOwnershipOfToken(address newMintManager) returns() +func (_MintManager *MintManagerTransactorSession) TransferOwnershipOfToken(newMintManager common.Address) (*types.Transaction, error) { + return _MintManager.Contract.TransferOwnershipOfToken(&_MintManager.TransactOpts, newMintManager) +} + +// MintManagerOwnershipTransferStartedIterator is returned from FilterOwnershipTransferStarted and is used to iterate over the raw logs and unpacked data for OwnershipTransferStarted events raised by the MintManager contract. +type MintManagerOwnershipTransferStartedIterator struct { + Event *MintManagerOwnershipTransferStarted // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MintManagerOwnershipTransferStartedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MintManagerOwnershipTransferStarted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MintManagerOwnershipTransferStarted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MintManagerOwnershipTransferStartedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MintManagerOwnershipTransferStartedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MintManagerOwnershipTransferStarted represents a OwnershipTransferStarted event raised by the MintManager contract. +type MintManagerOwnershipTransferStarted struct { + PreviousOwner common.Address + NewOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnershipTransferStarted is a free log retrieval operation binding the contract event 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700. +// +// Solidity: event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner) +func (_MintManager *MintManagerFilterer) FilterOwnershipTransferStarted(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*MintManagerOwnershipTransferStartedIterator, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _MintManager.contract.FilterLogs(opts, "OwnershipTransferStarted", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return &MintManagerOwnershipTransferStartedIterator{contract: _MintManager.contract, event: "OwnershipTransferStarted", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransferStarted is a free log subscription operation binding the contract event 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700. +// +// Solidity: event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner) +func (_MintManager *MintManagerFilterer) WatchOwnershipTransferStarted(opts *bind.WatchOpts, sink chan<- *MintManagerOwnershipTransferStarted, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _MintManager.contract.WatchLogs(opts, "OwnershipTransferStarted", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MintManagerOwnershipTransferStarted) + if err := _MintManager.contract.UnpackLog(event, "OwnershipTransferStarted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOwnershipTransferStarted is a log parse operation binding the contract event 0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700. +// +// Solidity: event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner) +func (_MintManager *MintManagerFilterer) ParseOwnershipTransferStarted(log types.Log) (*MintManagerOwnershipTransferStarted, error) { + event := new(MintManagerOwnershipTransferStarted) + if err := _MintManager.contract.UnpackLog(event, "OwnershipTransferStarted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MintManagerOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the MintManager contract. +type MintManagerOwnershipTransferredIterator struct { + Event *MintManagerOwnershipTransferred // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MintManagerOwnershipTransferredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MintManagerOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MintManagerOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MintManagerOwnershipTransferredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MintManagerOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MintManagerOwnershipTransferred represents a OwnershipTransferred event raised by the MintManager contract. +type MintManagerOwnershipTransferred struct { + PreviousOwner common.Address + NewOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_MintManager *MintManagerFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*MintManagerOwnershipTransferredIterator, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _MintManager.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return &MintManagerOwnershipTransferredIterator{contract: _MintManager.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_MintManager *MintManagerFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *MintManagerOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _MintManager.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MintManagerOwnershipTransferred) + if err := _MintManager.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_MintManager *MintManagerFilterer) ParseOwnershipTransferred(log types.Log) (*MintManagerOwnershipTransferred, error) { + event := new(MintManagerOwnershipTransferred) + if err := _MintManager.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/kroma-bindings/bindings/mintmanager_more.go b/kroma-bindings/bindings/mintmanager_more.go new file mode 100644 index 0000000000..da056e4ab9 --- /dev/null +++ b/kroma-bindings/bindings/mintmanager_more.go @@ -0,0 +1,27 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "encoding/json" + + "github.com/ethereum-optimism/optimism/op-bindings/solc" +) + +const MintManagerStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/governance/MintManager.sol:MintManager\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_address\"},{\"astId\":1001,\"contract\":\"contracts/governance/MintManager.sol:MintManager\",\"label\":\"_pendingOwner\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_address\"},{\"astId\":1002,\"contract\":\"contracts/governance/MintManager.sol:MintManager\",\"label\":\"minted\",\"offset\":20,\"slot\":\"1\",\"type\":\"t_bool\"},{\"astId\":1003,\"contract\":\"contracts/governance/MintManager.sol:MintManager\",\"label\":\"recipients\",\"offset\":0,\"slot\":\"2\",\"type\":\"t_array(t_address)dyn_storage\"},{\"astId\":1004,\"contract\":\"contracts/governance/MintManager.sol:MintManager\",\"label\":\"shareOf\",\"offset\":0,\"slot\":\"3\",\"type\":\"t_mapping(t_address,t_uint256)\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_address)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"address[]\",\"numberOfBytes\":\"32\",\"base\":\"t_address\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_mapping(t_address,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint256\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"}}}" + +var MintManagerStorageLayout = new(solc.StorageLayout) + +var MintManagerDeployedBin = "0x608060405234801561001057600080fd5b50600436106101005760003560e01c80637eb1184511610097578063d1bc76a111610066578063d1bc76a114610229578063e30c39781461023c578063e4fc6b6d1461025a578063f2fde38b1461026257600080fd5b80637eb11845146101ee5780638da5cb5b146101f857806398f1312e14610216578063baee5ed41461022157600080fd5b8063457c3977116100d3578063457c3977146101965780634f02c420146101a9578063715018a6146101de57806379ba5097146101e657600080fd5b80631249c58b1461010557806321e5e2c41461010f57806328df3f18146101425780632efd46d61461014a575b600080fd5b61010d610275565b005b61012f61011d366004610c7a565b60036020526000908152604090205481565b6040519081526020015b60405180910390f35b61010d610557565b6101717f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610139565b61010d6101a4366004610c7a565b6105e1565b6001546101ce9074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610139565b61010d61068d565b61010d6106a1565b61012f620186a081565b60005473ffffffffffffffffffffffffffffffffffffffff16610171565b61012f633b9aca0081565b61010d610756565b610171610237366004610cb7565b610870565b60015473ffffffffffffffffffffffffffffffffffffffff16610171565b61010d6108a7565b61010d610270366004610c7a565b610aa3565b61027d610bc8565b60015474010000000000000000000000000000000000000000900460ff161561032d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4d696e744d616e616765723a20616c7265616479206d696e746564206f6e207460448201527f68697320636861696e000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561039a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103be9190610cd0565b6103c990600a610e44565b6103d790633b9aca00610e53565b90506000805b60025481101561046d576000600282815481106103fc576103fc610e90565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168083526003909152604082205490925090620186a061043f8388610e53565b6104499190610ebf565b90506104558186610efa565b9450505050808061046590610f12565b9150506103dd565b506040517f40c10f19000000000000000000000000000000000000000000000000000000008152306004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906340c10f1990604401600060405180830381600087803b1580156104fc57600080fd5b505af1158015610510573d6000803e3d6000fd5b5050600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905550505050565b61055f610bc8565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379ba50976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105c757600080fd5b505af11580156105db573d6000803e3d6000fd5b50505050565b6105e9610bc8565b6040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063f2fde38b90602401600060405180830381600087803b15801561067257600080fd5b505af1158015610686573d6000803e3d6000fd5b5050505050565b610695610bc8565b61069f6000610c49565b565b600154339073ffffffffffffffffffffffffffffffffffffffff16811461074a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610324565b61075381610c49565b50565b61075e610bc8565b60015474010000000000000000000000000000000000000000900460ff16610808576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4d696e744d616e616765723a206e6f74206d696e746564206265666f7265207260448201527f656e6f756e6365206f776e6572736869700000000000000000000000000000006064820152608401610324565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663715018a66040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105c757600080fd5b6002818154811061088057600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b6108af610bc8565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561091c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109409190610cd0565b61094b90600a610e44565b61095990633b9aca00610e53565b905060005b600254811015610a9f5760006002828154811061097d5761097d610e90565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168083526003909152604082205490925090620186a06109c08387610e53565b6109ca9190610ebf565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af1158015610a64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a889190610f4a565b505050508080610a9790610f12565b91505061095e565b5050565b610aab610bc8565b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009091168117909155610b0e60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461069f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610324565b600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905561075381610b53565b600060208284031215610c8c57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610cb057600080fd5b9392505050565b600060208284031215610cc957600080fd5b5035919050565b600060208284031215610ce257600080fd5b815160ff81168114610cb057600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b80851115610d7b57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610d6157610d61610cf3565b80851615610d6e57918102915b93841c9390800290610d27565b509250929050565b600082610d9257506001610e3e565b81610d9f57506000610e3e565b8160018114610db55760028114610dbf57610ddb565b6001915050610e3e565b60ff841115610dd057610dd0610cf3565b50506001821b610e3e565b5060208310610133831016604e8410600b8410161715610dfe575081810a610e3e565b610e088383610d22565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610e3a57610e3a610cf3565b0290505b92915050565b6000610cb060ff841683610d83565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610e8b57610e8b610cf3565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082610ef5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008219821115610f0d57610f0d610cf3565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610f4357610f43610cf3565b5060010190565b600060208284031215610f5c57600080fd5b81518015158114610cb057600080fdfea164736f6c634300080f000a" + + +func init() { + if err := json.Unmarshal([]byte(MintManagerStorageLayoutJSON), MintManagerStorageLayout); err != nil { + panic(err) + } + + layouts["MintManager"] = MintManagerStorageLayout + deployedBytecodes["MintManager"] = MintManagerDeployedBin + immutableReferences["MintManager"] = true +} diff --git a/kroma-bindings/bindings/validatormanager.go b/kroma-bindings/bindings/validatormanager.go new file mode 100644 index 0000000000..adb91fe1d3 --- /dev/null +++ b/kroma-bindings/bindings/validatormanager.go @@ -0,0 +1,3004 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// IValidatorManagerConstructorParams is an auto generated low-level Go binding around an user-defined struct. +type IValidatorManagerConstructorParams struct { + L2Oracle common.Address + AssetManager common.Address + TrustedValidator common.Address + CommissionChangeDelaySeconds *big.Int + RoundDurationSeconds *big.Int + SoftJailPeriodSeconds *big.Int + HardJailPeriodSeconds *big.Int + JailThreshold *big.Int + MaxOutputFinalizations *big.Int + BaseReward *big.Int + MinRegisterAmount *big.Int + MinActivateAmount *big.Int +} + +// ValidatorManagerMetaData contains all meta data concerning the ValidatorManager contract. +var ValidatorManagerMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_constructorParams\",\"type\":\"tuple\",\"internalType\":\"structIValidatorManager.ConstructorParams\",\"components\":[{\"name\":\"_l2Oracle\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"},{\"name\":\"_assetManager\",\"type\":\"address\",\"internalType\":\"contractAssetManager\"},{\"name\":\"_trustedValidator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_commissionChangeDelaySeconds\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_roundDurationSeconds\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_softJailPeriodSeconds\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_hardJailPeriodSeconds\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_jailThreshold\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_maxOutputFinalizations\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_baseReward\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_minRegisterAmount\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"_minActivateAmount\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"ASSET_MANAGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractAssetManager\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BASE_REWARD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BOOSTED_REWARD_DENOM\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"BOOSTED_REWARD_NUMERATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"COMMISSION_CHANGE_DELAY_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"COMMISSION_RATE_DENOM\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"HARD_JAIL_PERIOD_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"JAIL_THRESHOLD\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"L2_ORACLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_OUTPUT_FINALIZATIONS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_ACTIVATE_AMOUNT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MIN_REGISTER_AMOUNT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ROUND_DURATION_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"SOFT_JAIL_PERIOD_SECONDS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"TRUSTED_VALIDATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activateValidator\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"activatedValidatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activatedValidatorTotalWeight\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint120\",\"internalType\":\"uint120\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"afterSubmitL2Output\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"bondValidatorKro\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"canFinalizeCommissionChangeAt\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"checkSubmissionEligibility\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"finalizeCommissionChange\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getCommissionRate\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingCommissionRate\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getStatus\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"enumIValidatorManager.ValidatorStatus\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getWeight\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint120\",\"internalType\":\"uint120\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"inJail\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initCommissionChange\",\"inputs\":[{\"name\":\"newCommissionRate\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isActive\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"jailExpiresAt\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextValidator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"noSubmissionCount\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"registerValidator\",\"inputs\":[{\"name\":\"assets\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"commissionRate\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"withdrawAccount\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"revertSlash\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"loser\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"slash\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"winner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"loser\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"tryActivateValidator\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"tryUnjail\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unbondValidatorKro\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateValidatorTree\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"tryRemove\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"ChallengeRewardDistributed\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RewardDistributed\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorReward\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"},{\"name\":\"baseReward\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"},{\"name\":\"boostedReward\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"SlashReverted\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"loser\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Slashed\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"loser\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorActivated\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activatedAt\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCommissionChangeFinalized\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldCommissionRate\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"},{\"name\":\"newCommissionRate\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorCommissionChangeInitiated\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldCommissionRate\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"},{\"name\":\"newCommissionRate\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorJailed\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"expiresAt\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorRegistered\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"activated\",\"type\":\"bool\",\"indexed\":false,\"internalType\":\"bool\"},{\"name\":\"commissionRate\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"},{\"name\":\"assets\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorStopped\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"stopsAt\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorUnjailed\",\"inputs\":[{\"name\":\"validator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"ImproperValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientAsset\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidConstructorParams\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxCommissionRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotAllowedCaller\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotElapsedCommissionChangeDelay\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotElapsedJailPeriod\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitiatedCommissionChange\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotSelectedPriorityValidator\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SameCommissionRate\",\"inputs\":[]}]", + Bin: "0x6102006040523480156200001257600080fd5b5060405162005d3a38038062005d3a83398101604081905262000035916200017d565b8061016001516001600160801b03168161014001516001600160801b031611156200007357604051631510b77f60e01b815260040160405180910390fd5b80516001600160a01b0390811660809081526020830151821660a0908152604084015190921660c0908152610140808501516001600160801b0390811660e090815261016080880151831661010090815260608901518416610120908152968901518416909452958701518216909552918501518216610180529284015181166101a0529183015182166101c05290910151166101e05262000284565b60405161018081016001600160401b03811182821017156200014257634e487b7160e01b600052604160045260246000fd5b60405290565b80516001600160a01b03811681146200016057600080fd5b919050565b80516001600160801b03811681146200016057600080fd5b600061018082840312156200019157600080fd5b6200019b62000110565b620001a68362000148565b8152620001b66020840162000148565b6020820152620001c96040840162000148565b6040820152620001dc6060840162000165565b6060820152620001ef6080840162000165565b60808201526200020260a0840162000165565b60a08201526200021560c0840162000165565b60c08201526200022860e0840162000165565b60e08201526101006200023d81850162000165565b908201526101206200025184820162000165565b908201526101406200026584820162000165565b908201526101606200027984820162000165565b908201529392505050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e0516158bf6200047b6000396000818161038d01528181614bf601528181614c6101528181614ca3015261510f0152600081816108580152612be401526000818161043201526131370152600081816103e401526134840152600081816107bb01526134aa0152600081816104590152610f360152600081816105c1015281816115720152611ce00152600081816106f901528181610b0c0152610da0015260008181610366015281816109410152610c8b01526000818161040b0152610f9301526000818161052901528181610a9b01528181610cbf01528181610dd4015281816110b001528181611484015281816119f801528181611b2e01528181611e700152818161200b0152818161220501528181612307015281816123fe01528181612dfb01528181612f3101528181614b5401528181614d2f01528181614dd8015261508a0152600081816102dc01528181610e9d0152818161127801528181611382015281816118f601528181611a2901528181611d3001528181611dc201528181611f06015281816120dd015281816129d901528181612a5f01528181612ae301528181612c6901528181612d10015281816130900152818161323401526132e801526158bf6000f3fe608060405234801561001057600080fd5b50600436106102d25760003560e01c8063943e400511610186578063b91b2723116100e3578063cdff5e1911610097578063e0cc26a211610071578063e0cc26a21461080e578063e428c2f414610840578063e7816b7f1461085357600080fd5b8063cdff5e1914610799578063daec6770146107b6578063dff221b5146107dd57600080fd5b8063be119347116100c8578063be1193471461072e578063be995dc214610741578063c26148fe1461075457600080fd5b8063b91b272314610359578063bde022bb1461071b57600080fd5b8063a83871721161013a578063ac6c52511161011f578063ac6c52511461062f578063af6ca762146106a4578063b2653fe3146106f457600080fd5b8063a838717214610609578063ab04b8aa1461061c57600080fd5b80639e449b021161016b5780639e449b02146105bc5780639f8a13d7146105e3578063a3433d07146105f657600080fd5b8063943e400514610579578063970531c11461058157600080fd5b80633ee4d4a3116102345780635bab847f116101e85780637d2243b4116101cd5780637d2243b41461054b578063891aab74146105535780638c1516c71461056657600080fd5b80635bab847f146105115780636874e0421461052457600080fd5b80634cca5e6c116102195780634cca5e6c1461045457806354fd4d501461047b57806356b65e97146104c457600080fd5b80633ee4d4a31461040657806342223ae91461042d57600080fd5b806322009af61161028b57806330ccebb51161027057806330ccebb5146103b75780633a549046146103d75780633ca83045146103df57600080fd5b806322009af614610388578063263a3402146103af57600080fd5b80630763fa7e116102bc5780630763fa7e14610330578063110d6069146103595780631796e52e1461036157600080fd5b80621c2ff6146102d7578063065643ea1461031b575b600080fd5b6102fe7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61032e61032936600461546c565b61087a565b005b610338602881565b6040516fffffffffffffffffffffffffffffffff9091168152602001610312565b610338606481565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b61032e610ba0565b6103ca6103c53660046154b5565b610c2b565b6040516103129190615501565b6102fe610e87565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6102fe7f000000000000000000000000000000000000000000000000000000000000000081565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6104b76040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516103129190615542565b6105016104d23660046154b5565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff16151590565b6040519015158152602001610312565b61032e61051f3660046155c3565b610fb5565b6102fe7f000000000000000000000000000000000000000000000000000000000000000081565b61032e61112a565b61032e6105613660046154b5565b61126d565b61032e6105743660046154b5565b611380565b61032e6114e4565b61033861058f3660046154b5565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff1690565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6105016105f13660046154b5565b6116f5565b61032e6106043660046155fc565b611728565b61032e6106173660046154b5565b6118f4565b61032e61062a366004615617565b611a27565b61068461063d3660046154b5565b6001600160a01b031660009081526003602090815260408083205463ffffffff168352600290915290206001015461010090046effffffffffffffffffffffffffffff1690565b6040516effffffffffffffffffffffffffffff9091168152602001610312565b6001805468010000000000000000900463ffffffff166000908152600260205260409020015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16610684565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6103386107293660046154b5565b611cc1565b61032e61073c36600461563c565b611d25565b61032e61074f366004615655565b611f04565b6107876107623660046154b5565b6001600160a01b03166000908152600460205260409020546301000000900460ff1690565b60405160ff9091168152602001610312565b6107a16122d7565b60405163ffffffff9091168152602001610312565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6107876107eb3660046154b5565b6001600160a01b0316600090815260046020526040902054610100900460ff1690565b61078761081c3660046154b5565b6001600160a01b031660009081526004602052604090205462010000900460ff1690565b61032e61084e3660046154b5565b6122fc565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b3332146108b3576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333b156108ec576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108f733610c2b565b6005811115610908576109086154d2565b1461093f576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16836fffffffffffffffffffffffffffffffff1610156109bd576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606460ff831611156109fb576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260046020819052604091829020805460ff871662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff0090911617600117815591517f19412a20000000000000000000000000000000000000000000000000000000008152908101929092526fffffffffffffffffffffffffffffffff851660248301526001600160a01b03838116604484015290917f0000000000000000000000000000000000000000000000000000000000000000909116906319412a2090606401600060405180830381600087803b158015610ae157600080fd5b505af1158015610af5573d6000803e3d6000fd5b505050506fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811690851610801590610b4157610b41336123c0565b60408051821515815260ff861660208201526fffffffffffffffffffffffffffffffff871681830152905133917f36f43e5c63d19ec0a34168ec0838b5bfae77656b9f5b94b896e9d2172a41f4fe919081900360600190a25050505050565b6003610bab33610c2b565b6005811115610bbc57610bbc6154d2565b141580610be95750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b15610c20576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c29336123c0565b565b6001600160a01b03811660009081526004602052604081205460ff16610c5357506000919050565b6040517f981cee530000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16917f00000000000000000000000000000000000000000000000000000000000000009091169063981cee5390602401602060405180830381865afa158015610d08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2c919061567c565b6fffffffffffffffffffffffffffffffff161015610d4c57506001919050565b6001600160a01b03828116600081815260036020526040908190205490517f8abf0af0000000000000000000000000000000000000000000000000000000008152600481019290925263ffffffff161515917f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16917f000000000000000000000000000000000000000000000000000000000000000090911690638abf0af090602401602060405180830381865afa158015610e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e41919061567c565b6fffffffffffffffffffffffffffffffff161015610e705780610e675750600292915050565b50600492915050565b80610e7e5750600392915050565b50600592915050565b600080546001600160a01b031615610f905760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166380446bd26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d9190615699565b9050804210610f7f576000610f3282426156e1565b90507f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16811115610f7d576001600160a01b039250505090565b505b50506000546001600160a01b031690565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000610fc083610c2b565b9050818015610ffb57506001816005811115610fde57610fde6154d2565b1480610ffb57506004816005811115610ff957610ff96154d2565b145b156110595761100b6001846124b8565b1561105457826001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d99614260405161104b91815260200190565b60405180910390a25b505050565b600481600581111561106d5761106d6154d2565b10611054576040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301526111249185917f00000000000000000000000000000000000000000000000000000000000000001690638abf0af090602401602060405180830381865afa1580156110f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111b919061567c565b6001919061265a565b50505050565b336000908152600560205260409020546fffffffffffffffffffffffffffffffff16611182576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260056020526040902054426fffffffffffffffffffffffffffffffff90911611156111df576040517f1dfc20f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111e83361296f565b3360008181526005602052604080822080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055517f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f199190a2600361124e33610c2b565b600581111561125f5761125f6154d2565b03610c2957610c29336123c0565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112cf576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112d9610e87565b90506001600160a01b03808216148015906113065750806001600160a01b0316826001600160a01b031614155b1561133d576040517fc625317600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611346826116f5565b61137c576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140291906156f8565b6001600160a01b0316336001600160a01b03161461144c576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f8c1516c70000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f00000000000000000000000000000000000000000000000000000000000000001690638c1516c7906024015b600060405180830381600087803b1580156114c957600080fd5b505af11580156114dd573d6000803e3d6000fd5b5050505050565b60026114ef33610c2b565b6005811115611500576115006154d2565b108061152c5750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b15611563576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061156e33611cc1565b90507f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16816fffffffffffffffffffffffffffffffff16036115ed576040517fdf80df2100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806fffffffffffffffffffffffffffffffff16421015611639576040517f82225faf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526004602090815260409182902080547fffffffffffffffffffffffff0000000000000000000000000000000000ffffff6301000000820460ff90811662010000818102939093167fffffffffffffffffffffffff000000000000000000000000000000000000ffff851617855586519290930416808252938101829052919492939092917fa40865ec905b139b9cdbd0566756b576b074c47d9dde9f62388b1d66d3e72a6491015b60405180910390a250505050565b6000600561170283610c2b565b6005811115611713576117136154d2565b0361172057506001919050565b506000919050565b600261173333610c2b565b6005811115611744576117446154d2565b10806117705750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b156117a7576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600460205260409020606460ff831611156117f4576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805460ff62010000909104811690831681900361183d576040517f150393f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81547fffffffffffffffffffffffff0000000000000000000000000000000000ffffff16630100000060ff8581169182027fffffffffffffffffffffffff00000000000000000000000000000000ffffffff1692909217640100000000426fffffffffffffffffffffffffffffffff1602178455604080519284168352602083019190915233917f9d9fe61047777339f4f4cb36a1f75ee90e3c6aa90c13abd3ffa07f6f86e0a307910160405180910390a2505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611952573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197691906156f8565b6001600160a01b0316336001600160a01b0316146119c0576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa83871720000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063a8387172906024016114af565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa991906156f8565b6001600160a01b0316336001600160a01b031614611af3576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f536afae40000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063536afae4906024016020604051808303816000875af1158015611b79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9d919061567c565b60008481526006602090815260409182902080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000081166fffffffffffffffffffffffffffffffff918216869003821617909155915191831682529192506001600160a01b0384169185917fe2d313b9d9b90c2930241ea64ee5d6f4ff30dfd44a15cd3f1df2c6cb8021ec07910160405180910390a36001600160a01b03821660008181526005602052604080822080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055517f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f199190a26003611ca283610c2b565b6005811115611cb357611cb36154d2565b0361105457611054826123c0565b6001600160a01b038116600090815260046020526040812054611d1f907f00000000000000000000000000000000000000000000000000000000000000009064010000000090046fffffffffffffffffffffffffffffffff16615715565b92915050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611d87576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d8f6129d4565b506040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0ea09a890602401602060405180830381865afa158015611e11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3591906156f8565b6040517f8c1516c70000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192507f000000000000000000000000000000000000000000000000000000000000000090911690638c1516c790602401600060405180830381600087803b158015611eb657600080fd5b505af1158015611eca573d6000803e3d6000fd5b50506000546001600160a01b03908116908416039150611ef4905057611eef8161296f565b611efc565b611efc61310a565b61137c6131e1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8691906156f8565b6001600160a01b0316336001600160a01b031614611fd0576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5636aabd0000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690635636aabd906024016020604051808303816000875af1158015612056573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207a919061567c565b6040516fffffffffffffffffffffffffffffffff821681529091506001600160a01b0383169085907f1237821480ce4d75f917bc39d1641eb17a5e09a2d5bf982cdd8cb2561aa28e689060200160405180910390a36120da82600061347b565b837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612139573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215d9190615699565b116121b557600084815260066020526040902080546fffffffffffffffffffffffffffffffff8082168401167fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116179055611124565b6040517fc42996d60000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526fffffffffffffffffffffffffffffffff831660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c42996d6906044016020604051808303816000875af115801561224e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612272919061567c565b905061227f836000610fb5565b6040516fffffffffffffffffffffffffffffffff821681526001600160a01b0384169085907fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa149060200160405180910390a350505050565b6001546000906122f79063ffffffff640100000000820481169116615749565b905090565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461235e576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361236982610c2b565b600581111561237a5761237a6154d2565b1480156123af57506001600160a01b0381166000908152600560205260409020546fffffffffffffffffffffffffffffffff16155b156123bd576123bd816123c0565b50565b6040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301526124729183917f00000000000000000000000000000000000000000000000000000000000000001690638abf0af090602401602060405180830381865afa158015612445573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612469919061567c565b60019190613623565b806001600160a01b03167ff33a24861b76047debce215c7ae4915a9befc5d870e97efbd4152df23c72112a426040516124ad91815260200190565b60405180910390a250565b6001600160a01b038116600090815260028301602052604081205463ffffffff168082036124ea576000915050611d1f565b6001600160a01b03831660009081526002850160209081526040808320805463ffffffff1916905563ffffffff8481168452600180890190935292208054910154740100000000000000000000000000000000000000009091049091169061010090046effffffffffffffffffffffffffffff165b63ffffffff8216156126015763ffffffff91821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff909116179055547401000000000000000000000000000000000000000090049091169061255f565b61260b8684613cf1565b50508354600163ffffffff64010000000080840482168301909116027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff90921691909117855591505092915050565b6001600160a01b038216600090815260028401602052604081205463ffffffff1680820361268c576000915050612968565b63ffffffff80821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff8781166101008181027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff851617909455935492909104169274010000000000000000000000000000000000000000909104169082101561283c5763ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116848803700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff908116820116909202179091555b63ffffffff82161561282c5763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168601909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff909116179055547401000000000000000000000000000000000000000090049091169061278b565b506128378784614516565b612960565b63ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116878503700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff90811682900316909202179091555b63ffffffff8216156129555763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff90911617905554740100000000000000000000000000000000000000009004909116906128b3565b506129608784614722565b600193505050505b9392505050565b6001600160a01b038116600090815260046020526040902054610100900460ff16156123bd576001600160a01b0316600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a599190615699565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166369f16eec6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612abb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612adf9190615699565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6391906156f8565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b8152600401612b9091815260200190565b602060405180830381865afa158015612bad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd1919061576e565b612bde5760009250505090565b6000805b7f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff16108015612c355750828411155b15613049576040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa158015612cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cdc919061576e565b15613049576040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0ea09a890602401602060405180830381865afa158015612d5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d8391906156f8565b90506000806000612d9384614b4d565b6040517fad4294510000000000000000000000000000000000000000000000000000000081526001600160a01b0388811660048301526fffffffffffffffffffffffffffffffff858116602484015284811660448401528316606483015293965091945092507f00000000000000000000000000000000000000000000000000000000000000009091169063ad42945190608401600060405180830381600087803b158015612e4157600080fd5b505af1158015612e55573d6000803e3d6000fd5b5050604080516fffffffffffffffffffffffffffffffff8581168252878116602083015286168183015290516001600160a01b03881693508a92507fd74a44a8cd6c73740a70271e07ee96d8a495ff30037ae6381cbcdb8fe7f2a1ea9181900360600190a36000878152600660205260409020546fffffffffffffffffffffffffffffffff168015613029576040517fc42996d60000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526fffffffffffffffffffffffffffffffff831660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c42996d6906044016020604051808303816000875af1158015612f7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f9e919061567c565b60008981526006602090815260409182902080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016905590516fffffffffffffffffffffffffffffffff831681529192506001600160a01b038716918a917fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa14910160405180910390a35b613034856000610fb5565b87600101975085600101955050505050612be2565b6fffffffffffffffffffffffffffffffff8216156130ff576040517f9902cdc0000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639902cdc090602401600060405180830381600087803b1580156130dc57600080fd5b505af11580156130f0573d6000803e3d6000fd5b50505050600194505050505090565b600094505050505090565b6000546001600160a01b031661311c57565b600080546001600160a01b03168152600460205260409020547f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff1661010090910460ff161061318d57600054610c29906001600160a01b0316600161347b565b600080546001600160a01b03168152600460205260409020805460ff6101008083048216600101909116027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116179055565b6001805468010000000000000000900463ffffffff1660009081526002602052604081209091015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613290573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132b49190615699565b90506000826effffffffffffffffffffffffffffff161180156132d75750600081115b1561344f5760006001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a25ae5576133186001856156e1565b6040518263ffffffff1660e01b815260040161333691815260200190565b608060405180830381865afa158015613353573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613377919061578b565b9050600083826020015143414460014361339191906156e1565b6040805160208101969096528501939093527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606092831b1691840191909152607483015240609482015260b4016040516020818303038152906040528051906020012060001c613402919061585d565b905061340f600182614e7e565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555061137c9050565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555050565b6000816134a8577f00000000000000000000000000000000000000000000000000000000000000006134ca565b7f00000000000000000000000000000000000000000000000000000000000000005b90506000613501846001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff16151590565b6135145761350f8242615715565b61354a565b6001600160a01b03841660009081526005602052604090205461354a9083906fffffffffffffffffffffffffffffffff16615715565b6001600160a01b03851660008181526005602090815260409182902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff8616908117909155915191825292935090917f95a398f2b6b2ad94f281708c97fe502386fc16adca43daed577a1e992a4cc814910160405180910390a26135e36001856124b8565b1561112457836001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d9961426040516116e791815260200190565b6001600160a01b0382166136be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f42616c616e636564576569676874547265653a207a65726f206164647265737360448201527f206e6f7420616c6c6f776564000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6001600160a01b038216600090815260028401602052604090205463ffffffff161561376c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f42616c616e636564576569676874547265653a206e6f646520616c726561647960448201527f206578697374696e67000000000000000000000000000000000000000000000060648201526084016136b5565b60006040518060e00160405280846001600160a01b03168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600115158152602001836effffffffffffffffffffffffffffff168152602001836effffffffffffffffffffffffffffff16815250905083600001600081819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff1602179055505060008460000160009054906101000a900463ffffffff169050818560010160008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160186101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160006101000a81548160ff02191690831515021790555060a08201518160010160016101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555060c08201518160010160106101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555090505080856002016000866001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508460000160089054906101000a900463ffffffff1663ffffffff16600003613a4757845463ffffffff90911668010000000000000000027fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff90911617909355505050565b845468010000000000000000900463ffffffff165b63ffffffff808216600090815260018089016020526040822090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168b01909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff90911617905580549092600160c01b909104169003613b835763ffffffff838116600081815260018a016020526040902080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000938616939093029290921790915581547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b909102178155613b7a8784614516565b50505050505050565b8054600160e01b900463ffffffff16600003613c595763ffffffff838116600081815260018a8101602052604090912080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000948716949094029390931783559190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905581547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e01b909102178155613b7a8784614516565b805463ffffffff600160e01b8204811660009081526001808b016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff70010000000000000000000000000000000092839004811692909104161115613cd9578054600160e01b900463ffffffff169150613ceb565b8054600160c01b900463ffffffff1691505b50613a5c565b63ffffffff81166000908152600183016020526040902080546001600160a01b0316613d9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f42616c616e636564576569676874547265653a206e6f6465206e6f742065786960448201527f737473000000000000000000000000000000000000000000000000000000000060648201526084016136b5565b8054600160c01b900463ffffffff1660000361406d578054600160e01b900463ffffffff16600003613f1c57805474010000000000000000000000000000000000000000900463ffffffff16600003613e1d5782547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff168355613ed8565b600181015460ff1615613e8557805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff169055613ed8565b805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690555b5063ffffffff1660009081526001918201602052604081209081550180547fff00000000000000000000000000000000000000000000000000000000000000169055565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690614510565b8054600160e01b900463ffffffff166000036141d457805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690614510565b805463ffffffff600160e01b82048116600090815260018087016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff610100928390048116929091041611156143a257805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff821681178355600160e01b9096048c168a52868a20909801549254700100000000000000000000000000000000908190048316938190048316939093019091169091027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9093167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951791909117909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690614510565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559354600160c01b9096048c168a52868a2090980154700100000000000000000000000000000000908190048316958190048316959095019091169093027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091167fff000000000000000000000000000000000000000000000000000000000000ff90961695909517949094179055915490951682526002880190945292909220805494821663ffffffff1990951694909417909355815404909116905b50613cf1565b63ffffffff80821660009081526001840160205260408082208054740100000000000000000000000000000000000000009004909316825290205b815474010000000000000000000000000000000000000000900463ffffffff16158015906145a45750600180820154908301546effffffffffffffffffffffffffffff6101009283900481169290910416115b1561112457815481547fffffffffffffffffffffffff00000000000000000000000000000000000000008083166001600160a01b03928316178555835416918116919091178255600180840180548483018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117875584549584900483169384029516949094179092558354929003700100000000000000000000000000000000808404831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790558354821660009081526002870160209081526040808320805463ffffffff998a1663ffffffff199182161790915587549654909516835280832080549095167401000000000000000000000000000000000000000096879004891617909455945484900486168082529187019094528184208054939093049094168352909120614551565b5b63ffffffff8082166000908152600180850160205260408083208054600160e01b810486168552828520840154600160c01b90910490951684529220015490916effffffffffffffffffffffffffffff61010091829004811691909204909116111561496b57600180820154825463ffffffff600160c01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff6101009283900481169290910416111561105457805463ffffffff600160c01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c1617905588548690048716808652928252838520549097168452959095529020805490951690921790935590540416614723565b600180820154825463ffffffff600160e01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff6101009283900481169290910416111561105457805463ffffffff600160e01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c1617905588548690048716808652928252838520549097168452959095529020805490951690921790935590540416614723565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663360864176040518163ffffffff1660e01b8152600401602060405180830381865afa158015614bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614bd491906156f8565b6001600160a01b0316846001600160a01b031603614c1a5750600091508190507f0000000000000000000000000000000000000000000000000000000000000000614e77565b6001600160a01b03841660009081526004602052604081205462010000900460ff1690614c468661504d565b9050600080614c8b6fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000850116856064615183565b9050614cce6fffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016606486810390615183565b9150614cf16fffffffffffffffffffffffffffffffff8416606486810390615183565b6040517f981cee530000000000000000000000000000000000000000000000000000000081526001600160a01b038a811660048301529194506000917f0000000000000000000000000000000000000000000000000000000000000000169063981cee5390602401602060405180830381865afa158015614d76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d9a919061567c565b6040517f6b9ffeac0000000000000000000000000000000000000000000000000000000081526001600160a01b038b811660048301529192506000917f00000000000000000000000000000000000000000000000000000000000000001690636b9ffeac90602401602060405180830381865afa158015614e1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e43919061567c565b90506000614e666fffffffffffffffffffffffffffffffff861684808501615183565b948590039950949750505001925050505b9193909250565b815460009068010000000000000000900463ffffffff165b63ffffffff80821660009081526001808701602052604080832054600160c01b9004909316825291902001546effffffffffffffffffffffffffffff808516700100000000000000000000000000000000909204161115614f175763ffffffff9081166000908152600185016020526040902054600160c01b900416614e96565b63ffffffff8181166000818152600187810160205260408083208054600160c01b9004909516835282208101549290915291909101547001000000000000000000000000000000009091046effffffffffffffffffffffffffffff90811690940393848116610100909204161115614fb05763ffffffff1660009081526001840160205260409020546001600160a01b03169050611d1f565b63ffffffff818116600090815260018681016020526040808320808301549054600160e01b9004909416835290912001546101009091046effffffffffffffffffffffffffffff908116909403938481167001000000000000000000000000000000009092041611156150435763ffffffff9081166000908152600185016020526040902054600160e01b900416614e96565b6000915050611d1f565b6040517f913f1a9f0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015260009182917f0000000000000000000000000000000000000000000000000000000000000000169063913f1a9f90602401602060405180830381865afa1580156150d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150f5919061567c565b905060006151386fffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660286064615183565b905061517b816fffffffffffffffffffffffffffffffff1665010000000000615174856fffffffffffffffffffffffffffffffff166064615232565b91906152f9565b949350505050565b6000838302608081901c6fffffffffffffffffffffffffffffffff841611615207576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f55696e743132384d6174683a206d756c446976206f766572666c6f770000000060448201526064016136b5565b826fffffffffffffffffffffffffffffffff1681816152285761522861582e565b0495945050505050565b600080838310801561524b576001811461525e5761526d565b650100000000008502849004915061526d565b65010000000000840285900491505b506402ef6c3406818002602890811c808402821c808202831c808302841c808402851c938402851c95909502841c641da06a6e33909502841c6455232d2bb2909202841c640d4ca0c283909302841c643177d95571909102841c64fffe4bcada90960290931c9490940191909101039190910303905081831115611d1f576501921fb544430392915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003615351578382816153475761534761582e565b0492505050612968565b8084116153ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d6174683a206d756c446976206f766572666c6f77000000000000000000000060448201526064016136b5565b60008486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091026000889003889004909101858311909403939093029303949094049190911702949350505050565b6fffffffffffffffffffffffffffffffff811681146123bd57600080fd5b803560ff8116811461545257600080fd5b919050565b6001600160a01b03811681146123bd57600080fd5b60008060006060848603121561548157600080fd5b833561548c81615423565b925061549a60208501615441565b915060408401356154aa81615457565b809150509250925092565b6000602082840312156154c757600080fd5b813561296881615457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016006831061553c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b600060208083528351808285015260005b8181101561556f57858101830151858201604001528201615553565b81811115615581576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b80151581146123bd57600080fd5b600080604083850312156155d657600080fd5b82356155e181615457565b915060208301356155f1816155b5565b809150509250929050565b60006020828403121561560e57600080fd5b61296882615441565b6000806040838503121561562a57600080fd5b8235915060208301356155f181615457565b60006020828403121561564e57600080fd5b5035919050565b60008060006060848603121561566a57600080fd5b83359250602084013561549a81615457565b60006020828403121561568e57600080fd5b815161296881615423565b6000602082840312156156ab57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156156f3576156f36156b2565b500390565b60006020828403121561570a57600080fd5b815161296881615457565b60006fffffffffffffffffffffffffffffffff808316818516808303821115615740576157406156b2565b01949350505050565b600063ffffffff83811690831681811015615766576157666156b2565b039392505050565b60006020828403121561578057600080fd5b8151612968816155b5565b60006080828403121561579d57600080fd5b6040516080810181811067ffffffffffffffff821117156157e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405282516157f581615457565b815260208381015190820152604083015161580f81615423565b6040820152606083015161582281615423565b60608201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006effffffffffffffffffffffffffffff808416806158a6577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b9216919091069291505056fea164736f6c634300080f000a", +} + +// ValidatorManagerABI is the input ABI used to generate the binding from. +// Deprecated: Use ValidatorManagerMetaData.ABI instead. +var ValidatorManagerABI = ValidatorManagerMetaData.ABI + +// ValidatorManagerBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use ValidatorManagerMetaData.Bin instead. +var ValidatorManagerBin = ValidatorManagerMetaData.Bin + +// DeployValidatorManager deploys a new Ethereum contract, binding an instance of ValidatorManager to it. +func DeployValidatorManager(auth *bind.TransactOpts, backend bind.ContractBackend, _constructorParams IValidatorManagerConstructorParams) (common.Address, *types.Transaction, *ValidatorManager, error) { + parsed, err := ValidatorManagerMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ValidatorManagerBin), backend, _constructorParams) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &ValidatorManager{ValidatorManagerCaller: ValidatorManagerCaller{contract: contract}, ValidatorManagerTransactor: ValidatorManagerTransactor{contract: contract}, ValidatorManagerFilterer: ValidatorManagerFilterer{contract: contract}}, nil +} + +// ValidatorManager is an auto generated Go binding around an Ethereum contract. +type ValidatorManager struct { + ValidatorManagerCaller // Read-only binding to the contract + ValidatorManagerTransactor // Write-only binding to the contract + ValidatorManagerFilterer // Log filterer for contract events +} + +// ValidatorManagerCaller is an auto generated read-only Go binding around an Ethereum contract. +type ValidatorManagerCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ValidatorManagerTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ValidatorManagerTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ValidatorManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ValidatorManagerFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ValidatorManagerSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ValidatorManagerSession struct { + Contract *ValidatorManager // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ValidatorManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ValidatorManagerCallerSession struct { + Contract *ValidatorManagerCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ValidatorManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ValidatorManagerTransactorSession struct { + Contract *ValidatorManagerTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ValidatorManagerRaw is an auto generated low-level Go binding around an Ethereum contract. +type ValidatorManagerRaw struct { + Contract *ValidatorManager // Generic contract binding to access the raw methods on +} + +// ValidatorManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ValidatorManagerCallerRaw struct { + Contract *ValidatorManagerCaller // Generic read-only contract binding to access the raw methods on +} + +// ValidatorManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ValidatorManagerTransactorRaw struct { + Contract *ValidatorManagerTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewValidatorManager creates a new instance of ValidatorManager, bound to a specific deployed contract. +func NewValidatorManager(address common.Address, backend bind.ContractBackend) (*ValidatorManager, error) { + contract, err := bindValidatorManager(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &ValidatorManager{ValidatorManagerCaller: ValidatorManagerCaller{contract: contract}, ValidatorManagerTransactor: ValidatorManagerTransactor{contract: contract}, ValidatorManagerFilterer: ValidatorManagerFilterer{contract: contract}}, nil +} + +// NewValidatorManagerCaller creates a new read-only instance of ValidatorManager, bound to a specific deployed contract. +func NewValidatorManagerCaller(address common.Address, caller bind.ContractCaller) (*ValidatorManagerCaller, error) { + contract, err := bindValidatorManager(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ValidatorManagerCaller{contract: contract}, nil +} + +// NewValidatorManagerTransactor creates a new write-only instance of ValidatorManager, bound to a specific deployed contract. +func NewValidatorManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*ValidatorManagerTransactor, error) { + contract, err := bindValidatorManager(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ValidatorManagerTransactor{contract: contract}, nil +} + +// NewValidatorManagerFilterer creates a new log filterer instance of ValidatorManager, bound to a specific deployed contract. +func NewValidatorManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*ValidatorManagerFilterer, error) { + contract, err := bindValidatorManager(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ValidatorManagerFilterer{contract: contract}, nil +} + +// bindValidatorManager binds a generic wrapper to an already deployed contract. +func bindValidatorManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ValidatorManagerMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ValidatorManager *ValidatorManagerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ValidatorManager.Contract.ValidatorManagerCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ValidatorManager *ValidatorManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ValidatorManager.Contract.ValidatorManagerTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ValidatorManager *ValidatorManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ValidatorManager.Contract.ValidatorManagerTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ValidatorManager *ValidatorManagerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ValidatorManager.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ValidatorManager *ValidatorManagerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ValidatorManager.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ValidatorManager *ValidatorManagerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ValidatorManager.Contract.contract.Transact(opts, method, params...) +} + +// ASSETMANAGER is a free data retrieval call binding the contract method 0x6874e042. +// +// Solidity: function ASSET_MANAGER() view returns(address) +func (_ValidatorManager *ValidatorManagerCaller) ASSETMANAGER(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "ASSET_MANAGER") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// ASSETMANAGER is a free data retrieval call binding the contract method 0x6874e042. +// +// Solidity: function ASSET_MANAGER() view returns(address) +func (_ValidatorManager *ValidatorManagerSession) ASSETMANAGER() (common.Address, error) { + return _ValidatorManager.Contract.ASSETMANAGER(&_ValidatorManager.CallOpts) +} + +// ASSETMANAGER is a free data retrieval call binding the contract method 0x6874e042. +// +// Solidity: function ASSET_MANAGER() view returns(address) +func (_ValidatorManager *ValidatorManagerCallerSession) ASSETMANAGER() (common.Address, error) { + return _ValidatorManager.Contract.ASSETMANAGER(&_ValidatorManager.CallOpts) +} + +// BASEREWARD is a free data retrieval call binding the contract method 0x22009af6. +// +// Solidity: function BASE_REWARD() view returns(uint128) +func (_ValidatorManager *ValidatorManagerCaller) BASEREWARD(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "BASE_REWARD") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// BASEREWARD is a free data retrieval call binding the contract method 0x22009af6. +// +// Solidity: function BASE_REWARD() view returns(uint128) +func (_ValidatorManager *ValidatorManagerSession) BASEREWARD() (*big.Int, error) { + return _ValidatorManager.Contract.BASEREWARD(&_ValidatorManager.CallOpts) +} + +// BASEREWARD is a free data retrieval call binding the contract method 0x22009af6. +// +// Solidity: function BASE_REWARD() view returns(uint128) +func (_ValidatorManager *ValidatorManagerCallerSession) BASEREWARD() (*big.Int, error) { + return _ValidatorManager.Contract.BASEREWARD(&_ValidatorManager.CallOpts) +} + +// BOOSTEDREWARDDENOM is a free data retrieval call binding the contract method 0x110d6069. +// +// Solidity: function BOOSTED_REWARD_DENOM() view returns(uint128) +func (_ValidatorManager *ValidatorManagerCaller) BOOSTEDREWARDDENOM(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "BOOSTED_REWARD_DENOM") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// BOOSTEDREWARDDENOM is a free data retrieval call binding the contract method 0x110d6069. +// +// Solidity: function BOOSTED_REWARD_DENOM() view returns(uint128) +func (_ValidatorManager *ValidatorManagerSession) BOOSTEDREWARDDENOM() (*big.Int, error) { + return _ValidatorManager.Contract.BOOSTEDREWARDDENOM(&_ValidatorManager.CallOpts) +} + +// BOOSTEDREWARDDENOM is a free data retrieval call binding the contract method 0x110d6069. +// +// Solidity: function BOOSTED_REWARD_DENOM() view returns(uint128) +func (_ValidatorManager *ValidatorManagerCallerSession) BOOSTEDREWARDDENOM() (*big.Int, error) { + return _ValidatorManager.Contract.BOOSTEDREWARDDENOM(&_ValidatorManager.CallOpts) +} + +// BOOSTEDREWARDNUMERATOR is a free data retrieval call binding the contract method 0x0763fa7e. +// +// Solidity: function BOOSTED_REWARD_NUMERATOR() view returns(uint128) +func (_ValidatorManager *ValidatorManagerCaller) BOOSTEDREWARDNUMERATOR(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "BOOSTED_REWARD_NUMERATOR") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// BOOSTEDREWARDNUMERATOR is a free data retrieval call binding the contract method 0x0763fa7e. +// +// Solidity: function BOOSTED_REWARD_NUMERATOR() view returns(uint128) +func (_ValidatorManager *ValidatorManagerSession) BOOSTEDREWARDNUMERATOR() (*big.Int, error) { + return _ValidatorManager.Contract.BOOSTEDREWARDNUMERATOR(&_ValidatorManager.CallOpts) +} + +// BOOSTEDREWARDNUMERATOR is a free data retrieval call binding the contract method 0x0763fa7e. +// +// Solidity: function BOOSTED_REWARD_NUMERATOR() view returns(uint128) +func (_ValidatorManager *ValidatorManagerCallerSession) BOOSTEDREWARDNUMERATOR() (*big.Int, error) { + return _ValidatorManager.Contract.BOOSTEDREWARDNUMERATOR(&_ValidatorManager.CallOpts) +} + +// COMMISSIONCHANGEDELAYSECONDS is a free data retrieval call binding the contract method 0x9e449b02. +// +// Solidity: function COMMISSION_CHANGE_DELAY_SECONDS() view returns(uint128) +func (_ValidatorManager *ValidatorManagerCaller) COMMISSIONCHANGEDELAYSECONDS(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "COMMISSION_CHANGE_DELAY_SECONDS") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// COMMISSIONCHANGEDELAYSECONDS is a free data retrieval call binding the contract method 0x9e449b02. +// +// Solidity: function COMMISSION_CHANGE_DELAY_SECONDS() view returns(uint128) +func (_ValidatorManager *ValidatorManagerSession) COMMISSIONCHANGEDELAYSECONDS() (*big.Int, error) { + return _ValidatorManager.Contract.COMMISSIONCHANGEDELAYSECONDS(&_ValidatorManager.CallOpts) +} + +// COMMISSIONCHANGEDELAYSECONDS is a free data retrieval call binding the contract method 0x9e449b02. +// +// Solidity: function COMMISSION_CHANGE_DELAY_SECONDS() view returns(uint128) +func (_ValidatorManager *ValidatorManagerCallerSession) COMMISSIONCHANGEDELAYSECONDS() (*big.Int, error) { + return _ValidatorManager.Contract.COMMISSIONCHANGEDELAYSECONDS(&_ValidatorManager.CallOpts) +} + +// COMMISSIONRATEDENOM is a free data retrieval call binding the contract method 0xb91b2723. +// +// Solidity: function COMMISSION_RATE_DENOM() view returns(uint128) +func (_ValidatorManager *ValidatorManagerCaller) COMMISSIONRATEDENOM(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "COMMISSION_RATE_DENOM") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// COMMISSIONRATEDENOM is a free data retrieval call binding the contract method 0xb91b2723. +// +// Solidity: function COMMISSION_RATE_DENOM() view returns(uint128) +func (_ValidatorManager *ValidatorManagerSession) COMMISSIONRATEDENOM() (*big.Int, error) { + return _ValidatorManager.Contract.COMMISSIONRATEDENOM(&_ValidatorManager.CallOpts) +} + +// COMMISSIONRATEDENOM is a free data retrieval call binding the contract method 0xb91b2723. +// +// Solidity: function COMMISSION_RATE_DENOM() view returns(uint128) +func (_ValidatorManager *ValidatorManagerCallerSession) COMMISSIONRATEDENOM() (*big.Int, error) { + return _ValidatorManager.Contract.COMMISSIONRATEDENOM(&_ValidatorManager.CallOpts) +} + +// HARDJAILPERIODSECONDS is a free data retrieval call binding the contract method 0x3ca83045. +// +// Solidity: function HARD_JAIL_PERIOD_SECONDS() view returns(uint128) +func (_ValidatorManager *ValidatorManagerCaller) HARDJAILPERIODSECONDS(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "HARD_JAIL_PERIOD_SECONDS") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// HARDJAILPERIODSECONDS is a free data retrieval call binding the contract method 0x3ca83045. +// +// Solidity: function HARD_JAIL_PERIOD_SECONDS() view returns(uint128) +func (_ValidatorManager *ValidatorManagerSession) HARDJAILPERIODSECONDS() (*big.Int, error) { + return _ValidatorManager.Contract.HARDJAILPERIODSECONDS(&_ValidatorManager.CallOpts) +} + +// HARDJAILPERIODSECONDS is a free data retrieval call binding the contract method 0x3ca83045. +// +// Solidity: function HARD_JAIL_PERIOD_SECONDS() view returns(uint128) +func (_ValidatorManager *ValidatorManagerCallerSession) HARDJAILPERIODSECONDS() (*big.Int, error) { + return _ValidatorManager.Contract.HARDJAILPERIODSECONDS(&_ValidatorManager.CallOpts) +} + +// JAILTHRESHOLD is a free data retrieval call binding the contract method 0x42223ae9. +// +// Solidity: function JAIL_THRESHOLD() view returns(uint128) +func (_ValidatorManager *ValidatorManagerCaller) JAILTHRESHOLD(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "JAIL_THRESHOLD") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// JAILTHRESHOLD is a free data retrieval call binding the contract method 0x42223ae9. +// +// Solidity: function JAIL_THRESHOLD() view returns(uint128) +func (_ValidatorManager *ValidatorManagerSession) JAILTHRESHOLD() (*big.Int, error) { + return _ValidatorManager.Contract.JAILTHRESHOLD(&_ValidatorManager.CallOpts) +} + +// JAILTHRESHOLD is a free data retrieval call binding the contract method 0x42223ae9. +// +// Solidity: function JAIL_THRESHOLD() view returns(uint128) +func (_ValidatorManager *ValidatorManagerCallerSession) JAILTHRESHOLD() (*big.Int, error) { + return _ValidatorManager.Contract.JAILTHRESHOLD(&_ValidatorManager.CallOpts) +} + +// L2ORACLE is a free data retrieval call binding the contract method 0x001c2ff6. +// +// Solidity: function L2_ORACLE() view returns(address) +func (_ValidatorManager *ValidatorManagerCaller) L2ORACLE(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "L2_ORACLE") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// L2ORACLE is a free data retrieval call binding the contract method 0x001c2ff6. +// +// Solidity: function L2_ORACLE() view returns(address) +func (_ValidatorManager *ValidatorManagerSession) L2ORACLE() (common.Address, error) { + return _ValidatorManager.Contract.L2ORACLE(&_ValidatorManager.CallOpts) +} + +// L2ORACLE is a free data retrieval call binding the contract method 0x001c2ff6. +// +// Solidity: function L2_ORACLE() view returns(address) +func (_ValidatorManager *ValidatorManagerCallerSession) L2ORACLE() (common.Address, error) { + return _ValidatorManager.Contract.L2ORACLE(&_ValidatorManager.CallOpts) +} + +// MAXOUTPUTFINALIZATIONS is a free data retrieval call binding the contract method 0xe7816b7f. +// +// Solidity: function MAX_OUTPUT_FINALIZATIONS() view returns(uint128) +func (_ValidatorManager *ValidatorManagerCaller) MAXOUTPUTFINALIZATIONS(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "MAX_OUTPUT_FINALIZATIONS") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// MAXOUTPUTFINALIZATIONS is a free data retrieval call binding the contract method 0xe7816b7f. +// +// Solidity: function MAX_OUTPUT_FINALIZATIONS() view returns(uint128) +func (_ValidatorManager *ValidatorManagerSession) MAXOUTPUTFINALIZATIONS() (*big.Int, error) { + return _ValidatorManager.Contract.MAXOUTPUTFINALIZATIONS(&_ValidatorManager.CallOpts) +} + +// MAXOUTPUTFINALIZATIONS is a free data retrieval call binding the contract method 0xe7816b7f. +// +// Solidity: function MAX_OUTPUT_FINALIZATIONS() view returns(uint128) +func (_ValidatorManager *ValidatorManagerCallerSession) MAXOUTPUTFINALIZATIONS() (*big.Int, error) { + return _ValidatorManager.Contract.MAXOUTPUTFINALIZATIONS(&_ValidatorManager.CallOpts) +} + +// MINACTIVATEAMOUNT is a free data retrieval call binding the contract method 0xb2653fe3. +// +// Solidity: function MIN_ACTIVATE_AMOUNT() view returns(uint128) +func (_ValidatorManager *ValidatorManagerCaller) MINACTIVATEAMOUNT(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "MIN_ACTIVATE_AMOUNT") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// MINACTIVATEAMOUNT is a free data retrieval call binding the contract method 0xb2653fe3. +// +// Solidity: function MIN_ACTIVATE_AMOUNT() view returns(uint128) +func (_ValidatorManager *ValidatorManagerSession) MINACTIVATEAMOUNT() (*big.Int, error) { + return _ValidatorManager.Contract.MINACTIVATEAMOUNT(&_ValidatorManager.CallOpts) +} + +// MINACTIVATEAMOUNT is a free data retrieval call binding the contract method 0xb2653fe3. +// +// Solidity: function MIN_ACTIVATE_AMOUNT() view returns(uint128) +func (_ValidatorManager *ValidatorManagerCallerSession) MINACTIVATEAMOUNT() (*big.Int, error) { + return _ValidatorManager.Contract.MINACTIVATEAMOUNT(&_ValidatorManager.CallOpts) +} + +// MINREGISTERAMOUNT is a free data retrieval call binding the contract method 0x1796e52e. +// +// Solidity: function MIN_REGISTER_AMOUNT() view returns(uint128) +func (_ValidatorManager *ValidatorManagerCaller) MINREGISTERAMOUNT(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "MIN_REGISTER_AMOUNT") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// MINREGISTERAMOUNT is a free data retrieval call binding the contract method 0x1796e52e. +// +// Solidity: function MIN_REGISTER_AMOUNT() view returns(uint128) +func (_ValidatorManager *ValidatorManagerSession) MINREGISTERAMOUNT() (*big.Int, error) { + return _ValidatorManager.Contract.MINREGISTERAMOUNT(&_ValidatorManager.CallOpts) +} + +// MINREGISTERAMOUNT is a free data retrieval call binding the contract method 0x1796e52e. +// +// Solidity: function MIN_REGISTER_AMOUNT() view returns(uint128) +func (_ValidatorManager *ValidatorManagerCallerSession) MINREGISTERAMOUNT() (*big.Int, error) { + return _ValidatorManager.Contract.MINREGISTERAMOUNT(&_ValidatorManager.CallOpts) +} + +// ROUNDDURATIONSECONDS is a free data retrieval call binding the contract method 0x4cca5e6c. +// +// Solidity: function ROUND_DURATION_SECONDS() view returns(uint128) +func (_ValidatorManager *ValidatorManagerCaller) ROUNDDURATIONSECONDS(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "ROUND_DURATION_SECONDS") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ROUNDDURATIONSECONDS is a free data retrieval call binding the contract method 0x4cca5e6c. +// +// Solidity: function ROUND_DURATION_SECONDS() view returns(uint128) +func (_ValidatorManager *ValidatorManagerSession) ROUNDDURATIONSECONDS() (*big.Int, error) { + return _ValidatorManager.Contract.ROUNDDURATIONSECONDS(&_ValidatorManager.CallOpts) +} + +// ROUNDDURATIONSECONDS is a free data retrieval call binding the contract method 0x4cca5e6c. +// +// Solidity: function ROUND_DURATION_SECONDS() view returns(uint128) +func (_ValidatorManager *ValidatorManagerCallerSession) ROUNDDURATIONSECONDS() (*big.Int, error) { + return _ValidatorManager.Contract.ROUNDDURATIONSECONDS(&_ValidatorManager.CallOpts) +} + +// SOFTJAILPERIODSECONDS is a free data retrieval call binding the contract method 0xdaec6770. +// +// Solidity: function SOFT_JAIL_PERIOD_SECONDS() view returns(uint128) +func (_ValidatorManager *ValidatorManagerCaller) SOFTJAILPERIODSECONDS(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "SOFT_JAIL_PERIOD_SECONDS") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// SOFTJAILPERIODSECONDS is a free data retrieval call binding the contract method 0xdaec6770. +// +// Solidity: function SOFT_JAIL_PERIOD_SECONDS() view returns(uint128) +func (_ValidatorManager *ValidatorManagerSession) SOFTJAILPERIODSECONDS() (*big.Int, error) { + return _ValidatorManager.Contract.SOFTJAILPERIODSECONDS(&_ValidatorManager.CallOpts) +} + +// SOFTJAILPERIODSECONDS is a free data retrieval call binding the contract method 0xdaec6770. +// +// Solidity: function SOFT_JAIL_PERIOD_SECONDS() view returns(uint128) +func (_ValidatorManager *ValidatorManagerCallerSession) SOFTJAILPERIODSECONDS() (*big.Int, error) { + return _ValidatorManager.Contract.SOFTJAILPERIODSECONDS(&_ValidatorManager.CallOpts) +} + +// TRUSTEDVALIDATOR is a free data retrieval call binding the contract method 0x3ee4d4a3. +// +// Solidity: function TRUSTED_VALIDATOR() view returns(address) +func (_ValidatorManager *ValidatorManagerCaller) TRUSTEDVALIDATOR(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "TRUSTED_VALIDATOR") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// TRUSTEDVALIDATOR is a free data retrieval call binding the contract method 0x3ee4d4a3. +// +// Solidity: function TRUSTED_VALIDATOR() view returns(address) +func (_ValidatorManager *ValidatorManagerSession) TRUSTEDVALIDATOR() (common.Address, error) { + return _ValidatorManager.Contract.TRUSTEDVALIDATOR(&_ValidatorManager.CallOpts) +} + +// TRUSTEDVALIDATOR is a free data retrieval call binding the contract method 0x3ee4d4a3. +// +// Solidity: function TRUSTED_VALIDATOR() view returns(address) +func (_ValidatorManager *ValidatorManagerCallerSession) TRUSTEDVALIDATOR() (common.Address, error) { + return _ValidatorManager.Contract.TRUSTEDVALIDATOR(&_ValidatorManager.CallOpts) +} + +// ActivatedValidatorCount is a free data retrieval call binding the contract method 0xcdff5e19. +// +// Solidity: function activatedValidatorCount() view returns(uint32) +func (_ValidatorManager *ValidatorManagerCaller) ActivatedValidatorCount(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "activatedValidatorCount") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// ActivatedValidatorCount is a free data retrieval call binding the contract method 0xcdff5e19. +// +// Solidity: function activatedValidatorCount() view returns(uint32) +func (_ValidatorManager *ValidatorManagerSession) ActivatedValidatorCount() (uint32, error) { + return _ValidatorManager.Contract.ActivatedValidatorCount(&_ValidatorManager.CallOpts) +} + +// ActivatedValidatorCount is a free data retrieval call binding the contract method 0xcdff5e19. +// +// Solidity: function activatedValidatorCount() view returns(uint32) +func (_ValidatorManager *ValidatorManagerCallerSession) ActivatedValidatorCount() (uint32, error) { + return _ValidatorManager.Contract.ActivatedValidatorCount(&_ValidatorManager.CallOpts) +} + +// ActivatedValidatorTotalWeight is a free data retrieval call binding the contract method 0xaf6ca762. +// +// Solidity: function activatedValidatorTotalWeight() view returns(uint120) +func (_ValidatorManager *ValidatorManagerCaller) ActivatedValidatorTotalWeight(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "activatedValidatorTotalWeight") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ActivatedValidatorTotalWeight is a free data retrieval call binding the contract method 0xaf6ca762. +// +// Solidity: function activatedValidatorTotalWeight() view returns(uint120) +func (_ValidatorManager *ValidatorManagerSession) ActivatedValidatorTotalWeight() (*big.Int, error) { + return _ValidatorManager.Contract.ActivatedValidatorTotalWeight(&_ValidatorManager.CallOpts) +} + +// ActivatedValidatorTotalWeight is a free data retrieval call binding the contract method 0xaf6ca762. +// +// Solidity: function activatedValidatorTotalWeight() view returns(uint120) +func (_ValidatorManager *ValidatorManagerCallerSession) ActivatedValidatorTotalWeight() (*big.Int, error) { + return _ValidatorManager.Contract.ActivatedValidatorTotalWeight(&_ValidatorManager.CallOpts) +} + +// CanFinalizeCommissionChangeAt is a free data retrieval call binding the contract method 0xbde022bb. +// +// Solidity: function canFinalizeCommissionChangeAt(address validator) view returns(uint128) +func (_ValidatorManager *ValidatorManagerCaller) CanFinalizeCommissionChangeAt(opts *bind.CallOpts, validator common.Address) (*big.Int, error) { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "canFinalizeCommissionChangeAt", validator) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// CanFinalizeCommissionChangeAt is a free data retrieval call binding the contract method 0xbde022bb. +// +// Solidity: function canFinalizeCommissionChangeAt(address validator) view returns(uint128) +func (_ValidatorManager *ValidatorManagerSession) CanFinalizeCommissionChangeAt(validator common.Address) (*big.Int, error) { + return _ValidatorManager.Contract.CanFinalizeCommissionChangeAt(&_ValidatorManager.CallOpts, validator) +} + +// CanFinalizeCommissionChangeAt is a free data retrieval call binding the contract method 0xbde022bb. +// +// Solidity: function canFinalizeCommissionChangeAt(address validator) view returns(uint128) +func (_ValidatorManager *ValidatorManagerCallerSession) CanFinalizeCommissionChangeAt(validator common.Address) (*big.Int, error) { + return _ValidatorManager.Contract.CanFinalizeCommissionChangeAt(&_ValidatorManager.CallOpts, validator) +} + +// CheckSubmissionEligibility is a free data retrieval call binding the contract method 0x891aab74. +// +// Solidity: function checkSubmissionEligibility(address validator) view returns() +func (_ValidatorManager *ValidatorManagerCaller) CheckSubmissionEligibility(opts *bind.CallOpts, validator common.Address) error { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "checkSubmissionEligibility", validator) + + if err != nil { + return err + } + + return err + +} + +// CheckSubmissionEligibility is a free data retrieval call binding the contract method 0x891aab74. +// +// Solidity: function checkSubmissionEligibility(address validator) view returns() +func (_ValidatorManager *ValidatorManagerSession) CheckSubmissionEligibility(validator common.Address) error { + return _ValidatorManager.Contract.CheckSubmissionEligibility(&_ValidatorManager.CallOpts, validator) +} + +// CheckSubmissionEligibility is a free data retrieval call binding the contract method 0x891aab74. +// +// Solidity: function checkSubmissionEligibility(address validator) view returns() +func (_ValidatorManager *ValidatorManagerCallerSession) CheckSubmissionEligibility(validator common.Address) error { + return _ValidatorManager.Contract.CheckSubmissionEligibility(&_ValidatorManager.CallOpts, validator) +} + +// GetCommissionRate is a free data retrieval call binding the contract method 0xe0cc26a2. +// +// Solidity: function getCommissionRate(address validator) view returns(uint8) +func (_ValidatorManager *ValidatorManagerCaller) GetCommissionRate(opts *bind.CallOpts, validator common.Address) (uint8, error) { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "getCommissionRate", validator) + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// GetCommissionRate is a free data retrieval call binding the contract method 0xe0cc26a2. +// +// Solidity: function getCommissionRate(address validator) view returns(uint8) +func (_ValidatorManager *ValidatorManagerSession) GetCommissionRate(validator common.Address) (uint8, error) { + return _ValidatorManager.Contract.GetCommissionRate(&_ValidatorManager.CallOpts, validator) +} + +// GetCommissionRate is a free data retrieval call binding the contract method 0xe0cc26a2. +// +// Solidity: function getCommissionRate(address validator) view returns(uint8) +func (_ValidatorManager *ValidatorManagerCallerSession) GetCommissionRate(validator common.Address) (uint8, error) { + return _ValidatorManager.Contract.GetCommissionRate(&_ValidatorManager.CallOpts, validator) +} + +// GetPendingCommissionRate is a free data retrieval call binding the contract method 0xc26148fe. +// +// Solidity: function getPendingCommissionRate(address validator) view returns(uint8) +func (_ValidatorManager *ValidatorManagerCaller) GetPendingCommissionRate(opts *bind.CallOpts, validator common.Address) (uint8, error) { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "getPendingCommissionRate", validator) + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// GetPendingCommissionRate is a free data retrieval call binding the contract method 0xc26148fe. +// +// Solidity: function getPendingCommissionRate(address validator) view returns(uint8) +func (_ValidatorManager *ValidatorManagerSession) GetPendingCommissionRate(validator common.Address) (uint8, error) { + return _ValidatorManager.Contract.GetPendingCommissionRate(&_ValidatorManager.CallOpts, validator) +} + +// GetPendingCommissionRate is a free data retrieval call binding the contract method 0xc26148fe. +// +// Solidity: function getPendingCommissionRate(address validator) view returns(uint8) +func (_ValidatorManager *ValidatorManagerCallerSession) GetPendingCommissionRate(validator common.Address) (uint8, error) { + return _ValidatorManager.Contract.GetPendingCommissionRate(&_ValidatorManager.CallOpts, validator) +} + +// GetStatus is a free data retrieval call binding the contract method 0x30ccebb5. +// +// Solidity: function getStatus(address validator) view returns(uint8) +func (_ValidatorManager *ValidatorManagerCaller) GetStatus(opts *bind.CallOpts, validator common.Address) (uint8, error) { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "getStatus", validator) + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// GetStatus is a free data retrieval call binding the contract method 0x30ccebb5. +// +// Solidity: function getStatus(address validator) view returns(uint8) +func (_ValidatorManager *ValidatorManagerSession) GetStatus(validator common.Address) (uint8, error) { + return _ValidatorManager.Contract.GetStatus(&_ValidatorManager.CallOpts, validator) +} + +// GetStatus is a free data retrieval call binding the contract method 0x30ccebb5. +// +// Solidity: function getStatus(address validator) view returns(uint8) +func (_ValidatorManager *ValidatorManagerCallerSession) GetStatus(validator common.Address) (uint8, error) { + return _ValidatorManager.Contract.GetStatus(&_ValidatorManager.CallOpts, validator) +} + +// GetWeight is a free data retrieval call binding the contract method 0xac6c5251. +// +// Solidity: function getWeight(address validator) view returns(uint120) +func (_ValidatorManager *ValidatorManagerCaller) GetWeight(opts *bind.CallOpts, validator common.Address) (*big.Int, error) { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "getWeight", validator) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetWeight is a free data retrieval call binding the contract method 0xac6c5251. +// +// Solidity: function getWeight(address validator) view returns(uint120) +func (_ValidatorManager *ValidatorManagerSession) GetWeight(validator common.Address) (*big.Int, error) { + return _ValidatorManager.Contract.GetWeight(&_ValidatorManager.CallOpts, validator) +} + +// GetWeight is a free data retrieval call binding the contract method 0xac6c5251. +// +// Solidity: function getWeight(address validator) view returns(uint120) +func (_ValidatorManager *ValidatorManagerCallerSession) GetWeight(validator common.Address) (*big.Int, error) { + return _ValidatorManager.Contract.GetWeight(&_ValidatorManager.CallOpts, validator) +} + +// InJail is a free data retrieval call binding the contract method 0x56b65e97. +// +// Solidity: function inJail(address validator) view returns(bool) +func (_ValidatorManager *ValidatorManagerCaller) InJail(opts *bind.CallOpts, validator common.Address) (bool, error) { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "inJail", validator) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// InJail is a free data retrieval call binding the contract method 0x56b65e97. +// +// Solidity: function inJail(address validator) view returns(bool) +func (_ValidatorManager *ValidatorManagerSession) InJail(validator common.Address) (bool, error) { + return _ValidatorManager.Contract.InJail(&_ValidatorManager.CallOpts, validator) +} + +// InJail is a free data retrieval call binding the contract method 0x56b65e97. +// +// Solidity: function inJail(address validator) view returns(bool) +func (_ValidatorManager *ValidatorManagerCallerSession) InJail(validator common.Address) (bool, error) { + return _ValidatorManager.Contract.InJail(&_ValidatorManager.CallOpts, validator) +} + +// IsActive is a free data retrieval call binding the contract method 0x9f8a13d7. +// +// Solidity: function isActive(address validator) view returns(bool) +func (_ValidatorManager *ValidatorManagerCaller) IsActive(opts *bind.CallOpts, validator common.Address) (bool, error) { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "isActive", validator) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsActive is a free data retrieval call binding the contract method 0x9f8a13d7. +// +// Solidity: function isActive(address validator) view returns(bool) +func (_ValidatorManager *ValidatorManagerSession) IsActive(validator common.Address) (bool, error) { + return _ValidatorManager.Contract.IsActive(&_ValidatorManager.CallOpts, validator) +} + +// IsActive is a free data retrieval call binding the contract method 0x9f8a13d7. +// +// Solidity: function isActive(address validator) view returns(bool) +func (_ValidatorManager *ValidatorManagerCallerSession) IsActive(validator common.Address) (bool, error) { + return _ValidatorManager.Contract.IsActive(&_ValidatorManager.CallOpts, validator) +} + +// JailExpiresAt is a free data retrieval call binding the contract method 0x970531c1. +// +// Solidity: function jailExpiresAt(address validator) view returns(uint128) +func (_ValidatorManager *ValidatorManagerCaller) JailExpiresAt(opts *bind.CallOpts, validator common.Address) (*big.Int, error) { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "jailExpiresAt", validator) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// JailExpiresAt is a free data retrieval call binding the contract method 0x970531c1. +// +// Solidity: function jailExpiresAt(address validator) view returns(uint128) +func (_ValidatorManager *ValidatorManagerSession) JailExpiresAt(validator common.Address) (*big.Int, error) { + return _ValidatorManager.Contract.JailExpiresAt(&_ValidatorManager.CallOpts, validator) +} + +// JailExpiresAt is a free data retrieval call binding the contract method 0x970531c1. +// +// Solidity: function jailExpiresAt(address validator) view returns(uint128) +func (_ValidatorManager *ValidatorManagerCallerSession) JailExpiresAt(validator common.Address) (*big.Int, error) { + return _ValidatorManager.Contract.JailExpiresAt(&_ValidatorManager.CallOpts, validator) +} + +// NextValidator is a free data retrieval call binding the contract method 0x3a549046. +// +// Solidity: function nextValidator() view returns(address) +func (_ValidatorManager *ValidatorManagerCaller) NextValidator(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "nextValidator") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// NextValidator is a free data retrieval call binding the contract method 0x3a549046. +// +// Solidity: function nextValidator() view returns(address) +func (_ValidatorManager *ValidatorManagerSession) NextValidator() (common.Address, error) { + return _ValidatorManager.Contract.NextValidator(&_ValidatorManager.CallOpts) +} + +// NextValidator is a free data retrieval call binding the contract method 0x3a549046. +// +// Solidity: function nextValidator() view returns(address) +func (_ValidatorManager *ValidatorManagerCallerSession) NextValidator() (common.Address, error) { + return _ValidatorManager.Contract.NextValidator(&_ValidatorManager.CallOpts) +} + +// NoSubmissionCount is a free data retrieval call binding the contract method 0xdff221b5. +// +// Solidity: function noSubmissionCount(address validator) view returns(uint8) +func (_ValidatorManager *ValidatorManagerCaller) NoSubmissionCount(opts *bind.CallOpts, validator common.Address) (uint8, error) { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "noSubmissionCount", validator) + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// NoSubmissionCount is a free data retrieval call binding the contract method 0xdff221b5. +// +// Solidity: function noSubmissionCount(address validator) view returns(uint8) +func (_ValidatorManager *ValidatorManagerSession) NoSubmissionCount(validator common.Address) (uint8, error) { + return _ValidatorManager.Contract.NoSubmissionCount(&_ValidatorManager.CallOpts, validator) +} + +// NoSubmissionCount is a free data retrieval call binding the contract method 0xdff221b5. +// +// Solidity: function noSubmissionCount(address validator) view returns(uint8) +func (_ValidatorManager *ValidatorManagerCallerSession) NoSubmissionCount(validator common.Address) (uint8, error) { + return _ValidatorManager.Contract.NoSubmissionCount(&_ValidatorManager.CallOpts, validator) +} + +// Version is a free data retrieval call binding the contract method 0x54fd4d50. +// +// Solidity: function version() view returns(string) +func (_ValidatorManager *ValidatorManagerCaller) Version(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _ValidatorManager.contract.Call(opts, &out, "version") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// Version is a free data retrieval call binding the contract method 0x54fd4d50. +// +// Solidity: function version() view returns(string) +func (_ValidatorManager *ValidatorManagerSession) Version() (string, error) { + return _ValidatorManager.Contract.Version(&_ValidatorManager.CallOpts) +} + +// Version is a free data retrieval call binding the contract method 0x54fd4d50. +// +// Solidity: function version() view returns(string) +func (_ValidatorManager *ValidatorManagerCallerSession) Version() (string, error) { + return _ValidatorManager.Contract.Version(&_ValidatorManager.CallOpts) +} + +// ActivateValidator is a paid mutator transaction binding the contract method 0x263a3402. +// +// Solidity: function activateValidator() returns() +func (_ValidatorManager *ValidatorManagerTransactor) ActivateValidator(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ValidatorManager.contract.Transact(opts, "activateValidator") +} + +// ActivateValidator is a paid mutator transaction binding the contract method 0x263a3402. +// +// Solidity: function activateValidator() returns() +func (_ValidatorManager *ValidatorManagerSession) ActivateValidator() (*types.Transaction, error) { + return _ValidatorManager.Contract.ActivateValidator(&_ValidatorManager.TransactOpts) +} + +// ActivateValidator is a paid mutator transaction binding the contract method 0x263a3402. +// +// Solidity: function activateValidator() returns() +func (_ValidatorManager *ValidatorManagerTransactorSession) ActivateValidator() (*types.Transaction, error) { + return _ValidatorManager.Contract.ActivateValidator(&_ValidatorManager.TransactOpts) +} + +// AfterSubmitL2Output is a paid mutator transaction binding the contract method 0xbe119347. +// +// Solidity: function afterSubmitL2Output(uint256 outputIndex) returns() +func (_ValidatorManager *ValidatorManagerTransactor) AfterSubmitL2Output(opts *bind.TransactOpts, outputIndex *big.Int) (*types.Transaction, error) { + return _ValidatorManager.contract.Transact(opts, "afterSubmitL2Output", outputIndex) +} + +// AfterSubmitL2Output is a paid mutator transaction binding the contract method 0xbe119347. +// +// Solidity: function afterSubmitL2Output(uint256 outputIndex) returns() +func (_ValidatorManager *ValidatorManagerSession) AfterSubmitL2Output(outputIndex *big.Int) (*types.Transaction, error) { + return _ValidatorManager.Contract.AfterSubmitL2Output(&_ValidatorManager.TransactOpts, outputIndex) +} + +// AfterSubmitL2Output is a paid mutator transaction binding the contract method 0xbe119347. +// +// Solidity: function afterSubmitL2Output(uint256 outputIndex) returns() +func (_ValidatorManager *ValidatorManagerTransactorSession) AfterSubmitL2Output(outputIndex *big.Int) (*types.Transaction, error) { + return _ValidatorManager.Contract.AfterSubmitL2Output(&_ValidatorManager.TransactOpts, outputIndex) +} + +// BondValidatorKro is a paid mutator transaction binding the contract method 0x8c1516c7. +// +// Solidity: function bondValidatorKro(address validator) returns() +func (_ValidatorManager *ValidatorManagerTransactor) BondValidatorKro(opts *bind.TransactOpts, validator common.Address) (*types.Transaction, error) { + return _ValidatorManager.contract.Transact(opts, "bondValidatorKro", validator) +} + +// BondValidatorKro is a paid mutator transaction binding the contract method 0x8c1516c7. +// +// Solidity: function bondValidatorKro(address validator) returns() +func (_ValidatorManager *ValidatorManagerSession) BondValidatorKro(validator common.Address) (*types.Transaction, error) { + return _ValidatorManager.Contract.BondValidatorKro(&_ValidatorManager.TransactOpts, validator) +} + +// BondValidatorKro is a paid mutator transaction binding the contract method 0x8c1516c7. +// +// Solidity: function bondValidatorKro(address validator) returns() +func (_ValidatorManager *ValidatorManagerTransactorSession) BondValidatorKro(validator common.Address) (*types.Transaction, error) { + return _ValidatorManager.Contract.BondValidatorKro(&_ValidatorManager.TransactOpts, validator) +} + +// FinalizeCommissionChange is a paid mutator transaction binding the contract method 0x943e4005. +// +// Solidity: function finalizeCommissionChange() returns() +func (_ValidatorManager *ValidatorManagerTransactor) FinalizeCommissionChange(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ValidatorManager.contract.Transact(opts, "finalizeCommissionChange") +} + +// FinalizeCommissionChange is a paid mutator transaction binding the contract method 0x943e4005. +// +// Solidity: function finalizeCommissionChange() returns() +func (_ValidatorManager *ValidatorManagerSession) FinalizeCommissionChange() (*types.Transaction, error) { + return _ValidatorManager.Contract.FinalizeCommissionChange(&_ValidatorManager.TransactOpts) +} + +// FinalizeCommissionChange is a paid mutator transaction binding the contract method 0x943e4005. +// +// Solidity: function finalizeCommissionChange() returns() +func (_ValidatorManager *ValidatorManagerTransactorSession) FinalizeCommissionChange() (*types.Transaction, error) { + return _ValidatorManager.Contract.FinalizeCommissionChange(&_ValidatorManager.TransactOpts) +} + +// InitCommissionChange is a paid mutator transaction binding the contract method 0xa3433d07. +// +// Solidity: function initCommissionChange(uint8 newCommissionRate) returns() +func (_ValidatorManager *ValidatorManagerTransactor) InitCommissionChange(opts *bind.TransactOpts, newCommissionRate uint8) (*types.Transaction, error) { + return _ValidatorManager.contract.Transact(opts, "initCommissionChange", newCommissionRate) +} + +// InitCommissionChange is a paid mutator transaction binding the contract method 0xa3433d07. +// +// Solidity: function initCommissionChange(uint8 newCommissionRate) returns() +func (_ValidatorManager *ValidatorManagerSession) InitCommissionChange(newCommissionRate uint8) (*types.Transaction, error) { + return _ValidatorManager.Contract.InitCommissionChange(&_ValidatorManager.TransactOpts, newCommissionRate) +} + +// InitCommissionChange is a paid mutator transaction binding the contract method 0xa3433d07. +// +// Solidity: function initCommissionChange(uint8 newCommissionRate) returns() +func (_ValidatorManager *ValidatorManagerTransactorSession) InitCommissionChange(newCommissionRate uint8) (*types.Transaction, error) { + return _ValidatorManager.Contract.InitCommissionChange(&_ValidatorManager.TransactOpts, newCommissionRate) +} + +// RegisterValidator is a paid mutator transaction binding the contract method 0x065643ea. +// +// Solidity: function registerValidator(uint128 assets, uint8 commissionRate, address withdrawAccount) returns() +func (_ValidatorManager *ValidatorManagerTransactor) RegisterValidator(opts *bind.TransactOpts, assets *big.Int, commissionRate uint8, withdrawAccount common.Address) (*types.Transaction, error) { + return _ValidatorManager.contract.Transact(opts, "registerValidator", assets, commissionRate, withdrawAccount) +} + +// RegisterValidator is a paid mutator transaction binding the contract method 0x065643ea. +// +// Solidity: function registerValidator(uint128 assets, uint8 commissionRate, address withdrawAccount) returns() +func (_ValidatorManager *ValidatorManagerSession) RegisterValidator(assets *big.Int, commissionRate uint8, withdrawAccount common.Address) (*types.Transaction, error) { + return _ValidatorManager.Contract.RegisterValidator(&_ValidatorManager.TransactOpts, assets, commissionRate, withdrawAccount) +} + +// RegisterValidator is a paid mutator transaction binding the contract method 0x065643ea. +// +// Solidity: function registerValidator(uint128 assets, uint8 commissionRate, address withdrawAccount) returns() +func (_ValidatorManager *ValidatorManagerTransactorSession) RegisterValidator(assets *big.Int, commissionRate uint8, withdrawAccount common.Address) (*types.Transaction, error) { + return _ValidatorManager.Contract.RegisterValidator(&_ValidatorManager.TransactOpts, assets, commissionRate, withdrawAccount) +} + +// RevertSlash is a paid mutator transaction binding the contract method 0xab04b8aa. +// +// Solidity: function revertSlash(uint256 outputIndex, address loser) returns() +func (_ValidatorManager *ValidatorManagerTransactor) RevertSlash(opts *bind.TransactOpts, outputIndex *big.Int, loser common.Address) (*types.Transaction, error) { + return _ValidatorManager.contract.Transact(opts, "revertSlash", outputIndex, loser) +} + +// RevertSlash is a paid mutator transaction binding the contract method 0xab04b8aa. +// +// Solidity: function revertSlash(uint256 outputIndex, address loser) returns() +func (_ValidatorManager *ValidatorManagerSession) RevertSlash(outputIndex *big.Int, loser common.Address) (*types.Transaction, error) { + return _ValidatorManager.Contract.RevertSlash(&_ValidatorManager.TransactOpts, outputIndex, loser) +} + +// RevertSlash is a paid mutator transaction binding the contract method 0xab04b8aa. +// +// Solidity: function revertSlash(uint256 outputIndex, address loser) returns() +func (_ValidatorManager *ValidatorManagerTransactorSession) RevertSlash(outputIndex *big.Int, loser common.Address) (*types.Transaction, error) { + return _ValidatorManager.Contract.RevertSlash(&_ValidatorManager.TransactOpts, outputIndex, loser) +} + +// Slash is a paid mutator transaction binding the contract method 0xbe995dc2. +// +// Solidity: function slash(uint256 outputIndex, address winner, address loser) returns() +func (_ValidatorManager *ValidatorManagerTransactor) Slash(opts *bind.TransactOpts, outputIndex *big.Int, winner common.Address, loser common.Address) (*types.Transaction, error) { + return _ValidatorManager.contract.Transact(opts, "slash", outputIndex, winner, loser) +} + +// Slash is a paid mutator transaction binding the contract method 0xbe995dc2. +// +// Solidity: function slash(uint256 outputIndex, address winner, address loser) returns() +func (_ValidatorManager *ValidatorManagerSession) Slash(outputIndex *big.Int, winner common.Address, loser common.Address) (*types.Transaction, error) { + return _ValidatorManager.Contract.Slash(&_ValidatorManager.TransactOpts, outputIndex, winner, loser) +} + +// Slash is a paid mutator transaction binding the contract method 0xbe995dc2. +// +// Solidity: function slash(uint256 outputIndex, address winner, address loser) returns() +func (_ValidatorManager *ValidatorManagerTransactorSession) Slash(outputIndex *big.Int, winner common.Address, loser common.Address) (*types.Transaction, error) { + return _ValidatorManager.Contract.Slash(&_ValidatorManager.TransactOpts, outputIndex, winner, loser) +} + +// TryActivateValidator is a paid mutator transaction binding the contract method 0xe428c2f4. +// +// Solidity: function tryActivateValidator(address validator) returns() +func (_ValidatorManager *ValidatorManagerTransactor) TryActivateValidator(opts *bind.TransactOpts, validator common.Address) (*types.Transaction, error) { + return _ValidatorManager.contract.Transact(opts, "tryActivateValidator", validator) +} + +// TryActivateValidator is a paid mutator transaction binding the contract method 0xe428c2f4. +// +// Solidity: function tryActivateValidator(address validator) returns() +func (_ValidatorManager *ValidatorManagerSession) TryActivateValidator(validator common.Address) (*types.Transaction, error) { + return _ValidatorManager.Contract.TryActivateValidator(&_ValidatorManager.TransactOpts, validator) +} + +// TryActivateValidator is a paid mutator transaction binding the contract method 0xe428c2f4. +// +// Solidity: function tryActivateValidator(address validator) returns() +func (_ValidatorManager *ValidatorManagerTransactorSession) TryActivateValidator(validator common.Address) (*types.Transaction, error) { + return _ValidatorManager.Contract.TryActivateValidator(&_ValidatorManager.TransactOpts, validator) +} + +// TryUnjail is a paid mutator transaction binding the contract method 0x7d2243b4. +// +// Solidity: function tryUnjail() returns() +func (_ValidatorManager *ValidatorManagerTransactor) TryUnjail(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ValidatorManager.contract.Transact(opts, "tryUnjail") +} + +// TryUnjail is a paid mutator transaction binding the contract method 0x7d2243b4. +// +// Solidity: function tryUnjail() returns() +func (_ValidatorManager *ValidatorManagerSession) TryUnjail() (*types.Transaction, error) { + return _ValidatorManager.Contract.TryUnjail(&_ValidatorManager.TransactOpts) +} + +// TryUnjail is a paid mutator transaction binding the contract method 0x7d2243b4. +// +// Solidity: function tryUnjail() returns() +func (_ValidatorManager *ValidatorManagerTransactorSession) TryUnjail() (*types.Transaction, error) { + return _ValidatorManager.Contract.TryUnjail(&_ValidatorManager.TransactOpts) +} + +// UnbondValidatorKro is a paid mutator transaction binding the contract method 0xa8387172. +// +// Solidity: function unbondValidatorKro(address validator) returns() +func (_ValidatorManager *ValidatorManagerTransactor) UnbondValidatorKro(opts *bind.TransactOpts, validator common.Address) (*types.Transaction, error) { + return _ValidatorManager.contract.Transact(opts, "unbondValidatorKro", validator) +} + +// UnbondValidatorKro is a paid mutator transaction binding the contract method 0xa8387172. +// +// Solidity: function unbondValidatorKro(address validator) returns() +func (_ValidatorManager *ValidatorManagerSession) UnbondValidatorKro(validator common.Address) (*types.Transaction, error) { + return _ValidatorManager.Contract.UnbondValidatorKro(&_ValidatorManager.TransactOpts, validator) +} + +// UnbondValidatorKro is a paid mutator transaction binding the contract method 0xa8387172. +// +// Solidity: function unbondValidatorKro(address validator) returns() +func (_ValidatorManager *ValidatorManagerTransactorSession) UnbondValidatorKro(validator common.Address) (*types.Transaction, error) { + return _ValidatorManager.Contract.UnbondValidatorKro(&_ValidatorManager.TransactOpts, validator) +} + +// UpdateValidatorTree is a paid mutator transaction binding the contract method 0x5bab847f. +// +// Solidity: function updateValidatorTree(address validator, bool tryRemove) returns() +func (_ValidatorManager *ValidatorManagerTransactor) UpdateValidatorTree(opts *bind.TransactOpts, validator common.Address, tryRemove bool) (*types.Transaction, error) { + return _ValidatorManager.contract.Transact(opts, "updateValidatorTree", validator, tryRemove) +} + +// UpdateValidatorTree is a paid mutator transaction binding the contract method 0x5bab847f. +// +// Solidity: function updateValidatorTree(address validator, bool tryRemove) returns() +func (_ValidatorManager *ValidatorManagerSession) UpdateValidatorTree(validator common.Address, tryRemove bool) (*types.Transaction, error) { + return _ValidatorManager.Contract.UpdateValidatorTree(&_ValidatorManager.TransactOpts, validator, tryRemove) +} + +// UpdateValidatorTree is a paid mutator transaction binding the contract method 0x5bab847f. +// +// Solidity: function updateValidatorTree(address validator, bool tryRemove) returns() +func (_ValidatorManager *ValidatorManagerTransactorSession) UpdateValidatorTree(validator common.Address, tryRemove bool) (*types.Transaction, error) { + return _ValidatorManager.Contract.UpdateValidatorTree(&_ValidatorManager.TransactOpts, validator, tryRemove) +} + +// ValidatorManagerChallengeRewardDistributedIterator is returned from FilterChallengeRewardDistributed and is used to iterate over the raw logs and unpacked data for ChallengeRewardDistributed events raised by the ValidatorManager contract. +type ValidatorManagerChallengeRewardDistributedIterator struct { + Event *ValidatorManagerChallengeRewardDistributed // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ValidatorManagerChallengeRewardDistributedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ValidatorManagerChallengeRewardDistributed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ValidatorManagerChallengeRewardDistributed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ValidatorManagerChallengeRewardDistributedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ValidatorManagerChallengeRewardDistributedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ValidatorManagerChallengeRewardDistributed represents a ChallengeRewardDistributed event raised by the ValidatorManager contract. +type ValidatorManagerChallengeRewardDistributed struct { + OutputIndex *big.Int + Recipient common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterChallengeRewardDistributed is a free log retrieval operation binding the contract event 0xd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa14. +// +// Solidity: event ChallengeRewardDistributed(uint256 indexed outputIndex, address indexed recipient, uint128 amount) +func (_ValidatorManager *ValidatorManagerFilterer) FilterChallengeRewardDistributed(opts *bind.FilterOpts, outputIndex []*big.Int, recipient []common.Address) (*ValidatorManagerChallengeRewardDistributedIterator, error) { + + var outputIndexRule []interface{} + for _, outputIndexItem := range outputIndex { + outputIndexRule = append(outputIndexRule, outputIndexItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _ValidatorManager.contract.FilterLogs(opts, "ChallengeRewardDistributed", outputIndexRule, recipientRule) + if err != nil { + return nil, err + } + return &ValidatorManagerChallengeRewardDistributedIterator{contract: _ValidatorManager.contract, event: "ChallengeRewardDistributed", logs: logs, sub: sub}, nil +} + +// WatchChallengeRewardDistributed is a free log subscription operation binding the contract event 0xd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa14. +// +// Solidity: event ChallengeRewardDistributed(uint256 indexed outputIndex, address indexed recipient, uint128 amount) +func (_ValidatorManager *ValidatorManagerFilterer) WatchChallengeRewardDistributed(opts *bind.WatchOpts, sink chan<- *ValidatorManagerChallengeRewardDistributed, outputIndex []*big.Int, recipient []common.Address) (event.Subscription, error) { + + var outputIndexRule []interface{} + for _, outputIndexItem := range outputIndex { + outputIndexRule = append(outputIndexRule, outputIndexItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _ValidatorManager.contract.WatchLogs(opts, "ChallengeRewardDistributed", outputIndexRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ValidatorManagerChallengeRewardDistributed) + if err := _ValidatorManager.contract.UnpackLog(event, "ChallengeRewardDistributed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseChallengeRewardDistributed is a log parse operation binding the contract event 0xd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa14. +// +// Solidity: event ChallengeRewardDistributed(uint256 indexed outputIndex, address indexed recipient, uint128 amount) +func (_ValidatorManager *ValidatorManagerFilterer) ParseChallengeRewardDistributed(log types.Log) (*ValidatorManagerChallengeRewardDistributed, error) { + event := new(ValidatorManagerChallengeRewardDistributed) + if err := _ValidatorManager.contract.UnpackLog(event, "ChallengeRewardDistributed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ValidatorManagerRewardDistributedIterator is returned from FilterRewardDistributed and is used to iterate over the raw logs and unpacked data for RewardDistributed events raised by the ValidatorManager contract. +type ValidatorManagerRewardDistributedIterator struct { + Event *ValidatorManagerRewardDistributed // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ValidatorManagerRewardDistributedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ValidatorManagerRewardDistributed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ValidatorManagerRewardDistributed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ValidatorManagerRewardDistributedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ValidatorManagerRewardDistributedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ValidatorManagerRewardDistributed represents a RewardDistributed event raised by the ValidatorManager contract. +type ValidatorManagerRewardDistributed struct { + OutputIndex *big.Int + Validator common.Address + ValidatorReward *big.Int + BaseReward *big.Int + BoostedReward *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRewardDistributed is a free log retrieval operation binding the contract event 0xd74a44a8cd6c73740a70271e07ee96d8a495ff30037ae6381cbcdb8fe7f2a1ea. +// +// Solidity: event RewardDistributed(uint256 indexed outputIndex, address indexed validator, uint128 validatorReward, uint128 baseReward, uint128 boostedReward) +func (_ValidatorManager *ValidatorManagerFilterer) FilterRewardDistributed(opts *bind.FilterOpts, outputIndex []*big.Int, validator []common.Address) (*ValidatorManagerRewardDistributedIterator, error) { + + var outputIndexRule []interface{} + for _, outputIndexItem := range outputIndex { + outputIndexRule = append(outputIndexRule, outputIndexItem) + } + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _ValidatorManager.contract.FilterLogs(opts, "RewardDistributed", outputIndexRule, validatorRule) + if err != nil { + return nil, err + } + return &ValidatorManagerRewardDistributedIterator{contract: _ValidatorManager.contract, event: "RewardDistributed", logs: logs, sub: sub}, nil +} + +// WatchRewardDistributed is a free log subscription operation binding the contract event 0xd74a44a8cd6c73740a70271e07ee96d8a495ff30037ae6381cbcdb8fe7f2a1ea. +// +// Solidity: event RewardDistributed(uint256 indexed outputIndex, address indexed validator, uint128 validatorReward, uint128 baseReward, uint128 boostedReward) +func (_ValidatorManager *ValidatorManagerFilterer) WatchRewardDistributed(opts *bind.WatchOpts, sink chan<- *ValidatorManagerRewardDistributed, outputIndex []*big.Int, validator []common.Address) (event.Subscription, error) { + + var outputIndexRule []interface{} + for _, outputIndexItem := range outputIndex { + outputIndexRule = append(outputIndexRule, outputIndexItem) + } + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _ValidatorManager.contract.WatchLogs(opts, "RewardDistributed", outputIndexRule, validatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ValidatorManagerRewardDistributed) + if err := _ValidatorManager.contract.UnpackLog(event, "RewardDistributed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseRewardDistributed is a log parse operation binding the contract event 0xd74a44a8cd6c73740a70271e07ee96d8a495ff30037ae6381cbcdb8fe7f2a1ea. +// +// Solidity: event RewardDistributed(uint256 indexed outputIndex, address indexed validator, uint128 validatorReward, uint128 baseReward, uint128 boostedReward) +func (_ValidatorManager *ValidatorManagerFilterer) ParseRewardDistributed(log types.Log) (*ValidatorManagerRewardDistributed, error) { + event := new(ValidatorManagerRewardDistributed) + if err := _ValidatorManager.contract.UnpackLog(event, "RewardDistributed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ValidatorManagerSlashRevertedIterator is returned from FilterSlashReverted and is used to iterate over the raw logs and unpacked data for SlashReverted events raised by the ValidatorManager contract. +type ValidatorManagerSlashRevertedIterator struct { + Event *ValidatorManagerSlashReverted // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ValidatorManagerSlashRevertedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ValidatorManagerSlashReverted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ValidatorManagerSlashReverted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ValidatorManagerSlashRevertedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ValidatorManagerSlashRevertedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ValidatorManagerSlashReverted represents a SlashReverted event raised by the ValidatorManager contract. +type ValidatorManagerSlashReverted struct { + OutputIndex *big.Int + Loser common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterSlashReverted is a free log retrieval operation binding the contract event 0xe2d313b9d9b90c2930241ea64ee5d6f4ff30dfd44a15cd3f1df2c6cb8021ec07. +// +// Solidity: event SlashReverted(uint256 indexed outputIndex, address indexed loser, uint128 amount) +func (_ValidatorManager *ValidatorManagerFilterer) FilterSlashReverted(opts *bind.FilterOpts, outputIndex []*big.Int, loser []common.Address) (*ValidatorManagerSlashRevertedIterator, error) { + + var outputIndexRule []interface{} + for _, outputIndexItem := range outputIndex { + outputIndexRule = append(outputIndexRule, outputIndexItem) + } + var loserRule []interface{} + for _, loserItem := range loser { + loserRule = append(loserRule, loserItem) + } + + logs, sub, err := _ValidatorManager.contract.FilterLogs(opts, "SlashReverted", outputIndexRule, loserRule) + if err != nil { + return nil, err + } + return &ValidatorManagerSlashRevertedIterator{contract: _ValidatorManager.contract, event: "SlashReverted", logs: logs, sub: sub}, nil +} + +// WatchSlashReverted is a free log subscription operation binding the contract event 0xe2d313b9d9b90c2930241ea64ee5d6f4ff30dfd44a15cd3f1df2c6cb8021ec07. +// +// Solidity: event SlashReverted(uint256 indexed outputIndex, address indexed loser, uint128 amount) +func (_ValidatorManager *ValidatorManagerFilterer) WatchSlashReverted(opts *bind.WatchOpts, sink chan<- *ValidatorManagerSlashReverted, outputIndex []*big.Int, loser []common.Address) (event.Subscription, error) { + + var outputIndexRule []interface{} + for _, outputIndexItem := range outputIndex { + outputIndexRule = append(outputIndexRule, outputIndexItem) + } + var loserRule []interface{} + for _, loserItem := range loser { + loserRule = append(loserRule, loserItem) + } + + logs, sub, err := _ValidatorManager.contract.WatchLogs(opts, "SlashReverted", outputIndexRule, loserRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ValidatorManagerSlashReverted) + if err := _ValidatorManager.contract.UnpackLog(event, "SlashReverted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseSlashReverted is a log parse operation binding the contract event 0xe2d313b9d9b90c2930241ea64ee5d6f4ff30dfd44a15cd3f1df2c6cb8021ec07. +// +// Solidity: event SlashReverted(uint256 indexed outputIndex, address indexed loser, uint128 amount) +func (_ValidatorManager *ValidatorManagerFilterer) ParseSlashReverted(log types.Log) (*ValidatorManagerSlashReverted, error) { + event := new(ValidatorManagerSlashReverted) + if err := _ValidatorManager.contract.UnpackLog(event, "SlashReverted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ValidatorManagerSlashedIterator is returned from FilterSlashed and is used to iterate over the raw logs and unpacked data for Slashed events raised by the ValidatorManager contract. +type ValidatorManagerSlashedIterator struct { + Event *ValidatorManagerSlashed // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ValidatorManagerSlashedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ValidatorManagerSlashed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ValidatorManagerSlashed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ValidatorManagerSlashedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ValidatorManagerSlashedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ValidatorManagerSlashed represents a Slashed event raised by the ValidatorManager contract. +type ValidatorManagerSlashed struct { + OutputIndex *big.Int + Loser common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterSlashed is a free log retrieval operation binding the contract event 0x1237821480ce4d75f917bc39d1641eb17a5e09a2d5bf982cdd8cb2561aa28e68. +// +// Solidity: event Slashed(uint256 indexed outputIndex, address indexed loser, uint128 amount) +func (_ValidatorManager *ValidatorManagerFilterer) FilterSlashed(opts *bind.FilterOpts, outputIndex []*big.Int, loser []common.Address) (*ValidatorManagerSlashedIterator, error) { + + var outputIndexRule []interface{} + for _, outputIndexItem := range outputIndex { + outputIndexRule = append(outputIndexRule, outputIndexItem) + } + var loserRule []interface{} + for _, loserItem := range loser { + loserRule = append(loserRule, loserItem) + } + + logs, sub, err := _ValidatorManager.contract.FilterLogs(opts, "Slashed", outputIndexRule, loserRule) + if err != nil { + return nil, err + } + return &ValidatorManagerSlashedIterator{contract: _ValidatorManager.contract, event: "Slashed", logs: logs, sub: sub}, nil +} + +// WatchSlashed is a free log subscription operation binding the contract event 0x1237821480ce4d75f917bc39d1641eb17a5e09a2d5bf982cdd8cb2561aa28e68. +// +// Solidity: event Slashed(uint256 indexed outputIndex, address indexed loser, uint128 amount) +func (_ValidatorManager *ValidatorManagerFilterer) WatchSlashed(opts *bind.WatchOpts, sink chan<- *ValidatorManagerSlashed, outputIndex []*big.Int, loser []common.Address) (event.Subscription, error) { + + var outputIndexRule []interface{} + for _, outputIndexItem := range outputIndex { + outputIndexRule = append(outputIndexRule, outputIndexItem) + } + var loserRule []interface{} + for _, loserItem := range loser { + loserRule = append(loserRule, loserItem) + } + + logs, sub, err := _ValidatorManager.contract.WatchLogs(opts, "Slashed", outputIndexRule, loserRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ValidatorManagerSlashed) + if err := _ValidatorManager.contract.UnpackLog(event, "Slashed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseSlashed is a log parse operation binding the contract event 0x1237821480ce4d75f917bc39d1641eb17a5e09a2d5bf982cdd8cb2561aa28e68. +// +// Solidity: event Slashed(uint256 indexed outputIndex, address indexed loser, uint128 amount) +func (_ValidatorManager *ValidatorManagerFilterer) ParseSlashed(log types.Log) (*ValidatorManagerSlashed, error) { + event := new(ValidatorManagerSlashed) + if err := _ValidatorManager.contract.UnpackLog(event, "Slashed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ValidatorManagerValidatorActivatedIterator is returned from FilterValidatorActivated and is used to iterate over the raw logs and unpacked data for ValidatorActivated events raised by the ValidatorManager contract. +type ValidatorManagerValidatorActivatedIterator struct { + Event *ValidatorManagerValidatorActivated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ValidatorManagerValidatorActivatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ValidatorManagerValidatorActivated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ValidatorManagerValidatorActivated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ValidatorManagerValidatorActivatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ValidatorManagerValidatorActivatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ValidatorManagerValidatorActivated represents a ValidatorActivated event raised by the ValidatorManager contract. +type ValidatorManagerValidatorActivated struct { + Validator common.Address + ActivatedAt *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorActivated is a free log retrieval operation binding the contract event 0xf33a24861b76047debce215c7ae4915a9befc5d870e97efbd4152df23c72112a. +// +// Solidity: event ValidatorActivated(address indexed validator, uint256 activatedAt) +func (_ValidatorManager *ValidatorManagerFilterer) FilterValidatorActivated(opts *bind.FilterOpts, validator []common.Address) (*ValidatorManagerValidatorActivatedIterator, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _ValidatorManager.contract.FilterLogs(opts, "ValidatorActivated", validatorRule) + if err != nil { + return nil, err + } + return &ValidatorManagerValidatorActivatedIterator{contract: _ValidatorManager.contract, event: "ValidatorActivated", logs: logs, sub: sub}, nil +} + +// WatchValidatorActivated is a free log subscription operation binding the contract event 0xf33a24861b76047debce215c7ae4915a9befc5d870e97efbd4152df23c72112a. +// +// Solidity: event ValidatorActivated(address indexed validator, uint256 activatedAt) +func (_ValidatorManager *ValidatorManagerFilterer) WatchValidatorActivated(opts *bind.WatchOpts, sink chan<- *ValidatorManagerValidatorActivated, validator []common.Address) (event.Subscription, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _ValidatorManager.contract.WatchLogs(opts, "ValidatorActivated", validatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ValidatorManagerValidatorActivated) + if err := _ValidatorManager.contract.UnpackLog(event, "ValidatorActivated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorActivated is a log parse operation binding the contract event 0xf33a24861b76047debce215c7ae4915a9befc5d870e97efbd4152df23c72112a. +// +// Solidity: event ValidatorActivated(address indexed validator, uint256 activatedAt) +func (_ValidatorManager *ValidatorManagerFilterer) ParseValidatorActivated(log types.Log) (*ValidatorManagerValidatorActivated, error) { + event := new(ValidatorManagerValidatorActivated) + if err := _ValidatorManager.contract.UnpackLog(event, "ValidatorActivated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ValidatorManagerValidatorCommissionChangeFinalizedIterator is returned from FilterValidatorCommissionChangeFinalized and is used to iterate over the raw logs and unpacked data for ValidatorCommissionChangeFinalized events raised by the ValidatorManager contract. +type ValidatorManagerValidatorCommissionChangeFinalizedIterator struct { + Event *ValidatorManagerValidatorCommissionChangeFinalized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ValidatorManagerValidatorCommissionChangeFinalizedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ValidatorManagerValidatorCommissionChangeFinalized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ValidatorManagerValidatorCommissionChangeFinalized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ValidatorManagerValidatorCommissionChangeFinalizedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ValidatorManagerValidatorCommissionChangeFinalizedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ValidatorManagerValidatorCommissionChangeFinalized represents a ValidatorCommissionChangeFinalized event raised by the ValidatorManager contract. +type ValidatorManagerValidatorCommissionChangeFinalized struct { + Validator common.Address + OldCommissionRate uint8 + NewCommissionRate uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorCommissionChangeFinalized is a free log retrieval operation binding the contract event 0xa40865ec905b139b9cdbd0566756b576b074c47d9dde9f62388b1d66d3e72a64. +// +// Solidity: event ValidatorCommissionChangeFinalized(address indexed validator, uint8 oldCommissionRate, uint8 newCommissionRate) +func (_ValidatorManager *ValidatorManagerFilterer) FilterValidatorCommissionChangeFinalized(opts *bind.FilterOpts, validator []common.Address) (*ValidatorManagerValidatorCommissionChangeFinalizedIterator, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _ValidatorManager.contract.FilterLogs(opts, "ValidatorCommissionChangeFinalized", validatorRule) + if err != nil { + return nil, err + } + return &ValidatorManagerValidatorCommissionChangeFinalizedIterator{contract: _ValidatorManager.contract, event: "ValidatorCommissionChangeFinalized", logs: logs, sub: sub}, nil +} + +// WatchValidatorCommissionChangeFinalized is a free log subscription operation binding the contract event 0xa40865ec905b139b9cdbd0566756b576b074c47d9dde9f62388b1d66d3e72a64. +// +// Solidity: event ValidatorCommissionChangeFinalized(address indexed validator, uint8 oldCommissionRate, uint8 newCommissionRate) +func (_ValidatorManager *ValidatorManagerFilterer) WatchValidatorCommissionChangeFinalized(opts *bind.WatchOpts, sink chan<- *ValidatorManagerValidatorCommissionChangeFinalized, validator []common.Address) (event.Subscription, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _ValidatorManager.contract.WatchLogs(opts, "ValidatorCommissionChangeFinalized", validatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ValidatorManagerValidatorCommissionChangeFinalized) + if err := _ValidatorManager.contract.UnpackLog(event, "ValidatorCommissionChangeFinalized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorCommissionChangeFinalized is a log parse operation binding the contract event 0xa40865ec905b139b9cdbd0566756b576b074c47d9dde9f62388b1d66d3e72a64. +// +// Solidity: event ValidatorCommissionChangeFinalized(address indexed validator, uint8 oldCommissionRate, uint8 newCommissionRate) +func (_ValidatorManager *ValidatorManagerFilterer) ParseValidatorCommissionChangeFinalized(log types.Log) (*ValidatorManagerValidatorCommissionChangeFinalized, error) { + event := new(ValidatorManagerValidatorCommissionChangeFinalized) + if err := _ValidatorManager.contract.UnpackLog(event, "ValidatorCommissionChangeFinalized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ValidatorManagerValidatorCommissionChangeInitiatedIterator is returned from FilterValidatorCommissionChangeInitiated and is used to iterate over the raw logs and unpacked data for ValidatorCommissionChangeInitiated events raised by the ValidatorManager contract. +type ValidatorManagerValidatorCommissionChangeInitiatedIterator struct { + Event *ValidatorManagerValidatorCommissionChangeInitiated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ValidatorManagerValidatorCommissionChangeInitiatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ValidatorManagerValidatorCommissionChangeInitiated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ValidatorManagerValidatorCommissionChangeInitiated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ValidatorManagerValidatorCommissionChangeInitiatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ValidatorManagerValidatorCommissionChangeInitiatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ValidatorManagerValidatorCommissionChangeInitiated represents a ValidatorCommissionChangeInitiated event raised by the ValidatorManager contract. +type ValidatorManagerValidatorCommissionChangeInitiated struct { + Validator common.Address + OldCommissionRate uint8 + NewCommissionRate uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorCommissionChangeInitiated is a free log retrieval operation binding the contract event 0x9d9fe61047777339f4f4cb36a1f75ee90e3c6aa90c13abd3ffa07f6f86e0a307. +// +// Solidity: event ValidatorCommissionChangeInitiated(address indexed validator, uint8 oldCommissionRate, uint8 newCommissionRate) +func (_ValidatorManager *ValidatorManagerFilterer) FilterValidatorCommissionChangeInitiated(opts *bind.FilterOpts, validator []common.Address) (*ValidatorManagerValidatorCommissionChangeInitiatedIterator, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _ValidatorManager.contract.FilterLogs(opts, "ValidatorCommissionChangeInitiated", validatorRule) + if err != nil { + return nil, err + } + return &ValidatorManagerValidatorCommissionChangeInitiatedIterator{contract: _ValidatorManager.contract, event: "ValidatorCommissionChangeInitiated", logs: logs, sub: sub}, nil +} + +// WatchValidatorCommissionChangeInitiated is a free log subscription operation binding the contract event 0x9d9fe61047777339f4f4cb36a1f75ee90e3c6aa90c13abd3ffa07f6f86e0a307. +// +// Solidity: event ValidatorCommissionChangeInitiated(address indexed validator, uint8 oldCommissionRate, uint8 newCommissionRate) +func (_ValidatorManager *ValidatorManagerFilterer) WatchValidatorCommissionChangeInitiated(opts *bind.WatchOpts, sink chan<- *ValidatorManagerValidatorCommissionChangeInitiated, validator []common.Address) (event.Subscription, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _ValidatorManager.contract.WatchLogs(opts, "ValidatorCommissionChangeInitiated", validatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ValidatorManagerValidatorCommissionChangeInitiated) + if err := _ValidatorManager.contract.UnpackLog(event, "ValidatorCommissionChangeInitiated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorCommissionChangeInitiated is a log parse operation binding the contract event 0x9d9fe61047777339f4f4cb36a1f75ee90e3c6aa90c13abd3ffa07f6f86e0a307. +// +// Solidity: event ValidatorCommissionChangeInitiated(address indexed validator, uint8 oldCommissionRate, uint8 newCommissionRate) +func (_ValidatorManager *ValidatorManagerFilterer) ParseValidatorCommissionChangeInitiated(log types.Log) (*ValidatorManagerValidatorCommissionChangeInitiated, error) { + event := new(ValidatorManagerValidatorCommissionChangeInitiated) + if err := _ValidatorManager.contract.UnpackLog(event, "ValidatorCommissionChangeInitiated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ValidatorManagerValidatorJailedIterator is returned from FilterValidatorJailed and is used to iterate over the raw logs and unpacked data for ValidatorJailed events raised by the ValidatorManager contract. +type ValidatorManagerValidatorJailedIterator struct { + Event *ValidatorManagerValidatorJailed // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ValidatorManagerValidatorJailedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ValidatorManagerValidatorJailed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ValidatorManagerValidatorJailed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ValidatorManagerValidatorJailedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ValidatorManagerValidatorJailedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ValidatorManagerValidatorJailed represents a ValidatorJailed event raised by the ValidatorManager contract. +type ValidatorManagerValidatorJailed struct { + Validator common.Address + ExpiresAt *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorJailed is a free log retrieval operation binding the contract event 0x95a398f2b6b2ad94f281708c97fe502386fc16adca43daed577a1e992a4cc814. +// +// Solidity: event ValidatorJailed(address indexed validator, uint128 expiresAt) +func (_ValidatorManager *ValidatorManagerFilterer) FilterValidatorJailed(opts *bind.FilterOpts, validator []common.Address) (*ValidatorManagerValidatorJailedIterator, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _ValidatorManager.contract.FilterLogs(opts, "ValidatorJailed", validatorRule) + if err != nil { + return nil, err + } + return &ValidatorManagerValidatorJailedIterator{contract: _ValidatorManager.contract, event: "ValidatorJailed", logs: logs, sub: sub}, nil +} + +// WatchValidatorJailed is a free log subscription operation binding the contract event 0x95a398f2b6b2ad94f281708c97fe502386fc16adca43daed577a1e992a4cc814. +// +// Solidity: event ValidatorJailed(address indexed validator, uint128 expiresAt) +func (_ValidatorManager *ValidatorManagerFilterer) WatchValidatorJailed(opts *bind.WatchOpts, sink chan<- *ValidatorManagerValidatorJailed, validator []common.Address) (event.Subscription, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _ValidatorManager.contract.WatchLogs(opts, "ValidatorJailed", validatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ValidatorManagerValidatorJailed) + if err := _ValidatorManager.contract.UnpackLog(event, "ValidatorJailed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorJailed is a log parse operation binding the contract event 0x95a398f2b6b2ad94f281708c97fe502386fc16adca43daed577a1e992a4cc814. +// +// Solidity: event ValidatorJailed(address indexed validator, uint128 expiresAt) +func (_ValidatorManager *ValidatorManagerFilterer) ParseValidatorJailed(log types.Log) (*ValidatorManagerValidatorJailed, error) { + event := new(ValidatorManagerValidatorJailed) + if err := _ValidatorManager.contract.UnpackLog(event, "ValidatorJailed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ValidatorManagerValidatorRegisteredIterator is returned from FilterValidatorRegistered and is used to iterate over the raw logs and unpacked data for ValidatorRegistered events raised by the ValidatorManager contract. +type ValidatorManagerValidatorRegisteredIterator struct { + Event *ValidatorManagerValidatorRegistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ValidatorManagerValidatorRegisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ValidatorManagerValidatorRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ValidatorManagerValidatorRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ValidatorManagerValidatorRegisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ValidatorManagerValidatorRegisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ValidatorManagerValidatorRegistered represents a ValidatorRegistered event raised by the ValidatorManager contract. +type ValidatorManagerValidatorRegistered struct { + Validator common.Address + Activated bool + CommissionRate uint8 + Assets *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorRegistered is a free log retrieval operation binding the contract event 0x36f43e5c63d19ec0a34168ec0838b5bfae77656b9f5b94b896e9d2172a41f4fe. +// +// Solidity: event ValidatorRegistered(address indexed validator, bool activated, uint8 commissionRate, uint128 assets) +func (_ValidatorManager *ValidatorManagerFilterer) FilterValidatorRegistered(opts *bind.FilterOpts, validator []common.Address) (*ValidatorManagerValidatorRegisteredIterator, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _ValidatorManager.contract.FilterLogs(opts, "ValidatorRegistered", validatorRule) + if err != nil { + return nil, err + } + return &ValidatorManagerValidatorRegisteredIterator{contract: _ValidatorManager.contract, event: "ValidatorRegistered", logs: logs, sub: sub}, nil +} + +// WatchValidatorRegistered is a free log subscription operation binding the contract event 0x36f43e5c63d19ec0a34168ec0838b5bfae77656b9f5b94b896e9d2172a41f4fe. +// +// Solidity: event ValidatorRegistered(address indexed validator, bool activated, uint8 commissionRate, uint128 assets) +func (_ValidatorManager *ValidatorManagerFilterer) WatchValidatorRegistered(opts *bind.WatchOpts, sink chan<- *ValidatorManagerValidatorRegistered, validator []common.Address) (event.Subscription, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _ValidatorManager.contract.WatchLogs(opts, "ValidatorRegistered", validatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ValidatorManagerValidatorRegistered) + if err := _ValidatorManager.contract.UnpackLog(event, "ValidatorRegistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorRegistered is a log parse operation binding the contract event 0x36f43e5c63d19ec0a34168ec0838b5bfae77656b9f5b94b896e9d2172a41f4fe. +// +// Solidity: event ValidatorRegistered(address indexed validator, bool activated, uint8 commissionRate, uint128 assets) +func (_ValidatorManager *ValidatorManagerFilterer) ParseValidatorRegistered(log types.Log) (*ValidatorManagerValidatorRegistered, error) { + event := new(ValidatorManagerValidatorRegistered) + if err := _ValidatorManager.contract.UnpackLog(event, "ValidatorRegistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ValidatorManagerValidatorStoppedIterator is returned from FilterValidatorStopped and is used to iterate over the raw logs and unpacked data for ValidatorStopped events raised by the ValidatorManager contract. +type ValidatorManagerValidatorStoppedIterator struct { + Event *ValidatorManagerValidatorStopped // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ValidatorManagerValidatorStoppedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ValidatorManagerValidatorStopped) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ValidatorManagerValidatorStopped) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ValidatorManagerValidatorStoppedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ValidatorManagerValidatorStoppedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ValidatorManagerValidatorStopped represents a ValidatorStopped event raised by the ValidatorManager contract. +type ValidatorManagerValidatorStopped struct { + Validator common.Address + StopsAt *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorStopped is a free log retrieval operation binding the contract event 0xdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d9961. +// +// Solidity: event ValidatorStopped(address indexed validator, uint256 stopsAt) +func (_ValidatorManager *ValidatorManagerFilterer) FilterValidatorStopped(opts *bind.FilterOpts, validator []common.Address) (*ValidatorManagerValidatorStoppedIterator, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _ValidatorManager.contract.FilterLogs(opts, "ValidatorStopped", validatorRule) + if err != nil { + return nil, err + } + return &ValidatorManagerValidatorStoppedIterator{contract: _ValidatorManager.contract, event: "ValidatorStopped", logs: logs, sub: sub}, nil +} + +// WatchValidatorStopped is a free log subscription operation binding the contract event 0xdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d9961. +// +// Solidity: event ValidatorStopped(address indexed validator, uint256 stopsAt) +func (_ValidatorManager *ValidatorManagerFilterer) WatchValidatorStopped(opts *bind.WatchOpts, sink chan<- *ValidatorManagerValidatorStopped, validator []common.Address) (event.Subscription, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _ValidatorManager.contract.WatchLogs(opts, "ValidatorStopped", validatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ValidatorManagerValidatorStopped) + if err := _ValidatorManager.contract.UnpackLog(event, "ValidatorStopped", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorStopped is a log parse operation binding the contract event 0xdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d9961. +// +// Solidity: event ValidatorStopped(address indexed validator, uint256 stopsAt) +func (_ValidatorManager *ValidatorManagerFilterer) ParseValidatorStopped(log types.Log) (*ValidatorManagerValidatorStopped, error) { + event := new(ValidatorManagerValidatorStopped) + if err := _ValidatorManager.contract.UnpackLog(event, "ValidatorStopped", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ValidatorManagerValidatorUnjailedIterator is returned from FilterValidatorUnjailed and is used to iterate over the raw logs and unpacked data for ValidatorUnjailed events raised by the ValidatorManager contract. +type ValidatorManagerValidatorUnjailedIterator struct { + Event *ValidatorManagerValidatorUnjailed // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ValidatorManagerValidatorUnjailedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ValidatorManagerValidatorUnjailed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ValidatorManagerValidatorUnjailed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ValidatorManagerValidatorUnjailedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ValidatorManagerValidatorUnjailedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ValidatorManagerValidatorUnjailed represents a ValidatorUnjailed event raised by the ValidatorManager contract. +type ValidatorManagerValidatorUnjailed struct { + Validator common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorUnjailed is a free log retrieval operation binding the contract event 0x9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f19. +// +// Solidity: event ValidatorUnjailed(address indexed validator) +func (_ValidatorManager *ValidatorManagerFilterer) FilterValidatorUnjailed(opts *bind.FilterOpts, validator []common.Address) (*ValidatorManagerValidatorUnjailedIterator, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _ValidatorManager.contract.FilterLogs(opts, "ValidatorUnjailed", validatorRule) + if err != nil { + return nil, err + } + return &ValidatorManagerValidatorUnjailedIterator{contract: _ValidatorManager.contract, event: "ValidatorUnjailed", logs: logs, sub: sub}, nil +} + +// WatchValidatorUnjailed is a free log subscription operation binding the contract event 0x9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f19. +// +// Solidity: event ValidatorUnjailed(address indexed validator) +func (_ValidatorManager *ValidatorManagerFilterer) WatchValidatorUnjailed(opts *bind.WatchOpts, sink chan<- *ValidatorManagerValidatorUnjailed, validator []common.Address) (event.Subscription, error) { + + var validatorRule []interface{} + for _, validatorItem := range validator { + validatorRule = append(validatorRule, validatorItem) + } + + logs, sub, err := _ValidatorManager.contract.WatchLogs(opts, "ValidatorUnjailed", validatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ValidatorManagerValidatorUnjailed) + if err := _ValidatorManager.contract.UnpackLog(event, "ValidatorUnjailed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorUnjailed is a log parse operation binding the contract event 0x9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f19. +// +// Solidity: event ValidatorUnjailed(address indexed validator) +func (_ValidatorManager *ValidatorManagerFilterer) ParseValidatorUnjailed(log types.Log) (*ValidatorManagerValidatorUnjailed, error) { + event := new(ValidatorManagerValidatorUnjailed) + if err := _ValidatorManager.contract.UnpackLog(event, "ValidatorUnjailed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/kroma-bindings/bindings/validatormanager_more.go b/kroma-bindings/bindings/validatormanager_more.go new file mode 100644 index 0000000000..70321d9811 --- /dev/null +++ b/kroma-bindings/bindings/validatormanager_more.go @@ -0,0 +1,27 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "encoding/json" + + "github.com/ethereum-optimism/optimism/op-bindings/solc" +) + +const ValidatorManagerStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/L1/ValidatorManager.sol:ValidatorManager\",\"label\":\"_nextPriorityValidator\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_address\"},{\"astId\":1001,\"contract\":\"contracts/L1/ValidatorManager.sol:ValidatorManager\",\"label\":\"_validatorTree\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_struct(Tree)1006_storage\"},{\"astId\":1002,\"contract\":\"contracts/L1/ValidatorManager.sol:ValidatorManager\",\"label\":\"_validatorInfo\",\"offset\":0,\"slot\":\"4\",\"type\":\"t_mapping(t_address,t_struct(Validator)1007_storage)\"},{\"astId\":1003,\"contract\":\"contracts/L1/ValidatorManager.sol:ValidatorManager\",\"label\":\"_jail\",\"offset\":0,\"slot\":\"5\",\"type\":\"t_mapping(t_address,t_uint128)\"},{\"astId\":1004,\"contract\":\"contracts/L1/ValidatorManager.sol:ValidatorManager\",\"label\":\"_pendingChallengeReward\",\"offset\":0,\"slot\":\"6\",\"type\":\"t_mapping(t_uint256,t_uint128)\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_mapping(t_address,t_struct(Validator)1007_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e struct IValidatorManager.Validator)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_struct(Validator)1007_storage\"},\"t_mapping(t_address,t_uint128)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint128)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint128\"},\"t_mapping(t_address,t_uint32)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint32)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint32\"},\"t_mapping(t_uint256,t_uint128)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e uint128)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_uint128\"},\"t_mapping(t_uint32,t_struct(Node)1005_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint32 =\u003e struct BalancedWeightTree.Node)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint32\",\"value\":\"t_struct(Node)1005_storage\"},\"t_struct(Node)1005_storage\":{\"encoding\":\"inplace\",\"label\":\"struct BalancedWeightTree.Node\",\"numberOfBytes\":\"64\"},\"t_struct(Tree)1006_storage\":{\"encoding\":\"inplace\",\"label\":\"struct BalancedWeightTree.Tree\",\"numberOfBytes\":\"96\"},\"t_struct(Validator)1007_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IValidatorManager.Validator\",\"numberOfBytes\":\"32\"},\"t_uint120\":{\"encoding\":\"inplace\",\"label\":\"uint120\",\"numberOfBytes\":\"15\"},\"t_uint128\":{\"encoding\":\"inplace\",\"label\":\"uint128\",\"numberOfBytes\":\"16\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint32\":{\"encoding\":\"inplace\",\"label\":\"uint32\",\"numberOfBytes\":\"4\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" + +var ValidatorManagerStorageLayout = new(solc.StorageLayout) + +var ValidatorManagerDeployedBin = "0x608060405234801561001057600080fd5b50600436106102d25760003560e01c8063943e400511610186578063b91b2723116100e3578063cdff5e1911610097578063e0cc26a211610071578063e0cc26a21461080e578063e428c2f414610840578063e7816b7f1461085357600080fd5b8063cdff5e1914610799578063daec6770146107b6578063dff221b5146107dd57600080fd5b8063be119347116100c8578063be1193471461072e578063be995dc214610741578063c26148fe1461075457600080fd5b8063b91b272314610359578063bde022bb1461071b57600080fd5b8063a83871721161013a578063ac6c52511161011f578063ac6c52511461062f578063af6ca762146106a4578063b2653fe3146106f457600080fd5b8063a838717214610609578063ab04b8aa1461061c57600080fd5b80639e449b021161016b5780639e449b02146105bc5780639f8a13d7146105e3578063a3433d07146105f657600080fd5b8063943e400514610579578063970531c11461058157600080fd5b80633ee4d4a3116102345780635bab847f116101e85780637d2243b4116101cd5780637d2243b41461054b578063891aab74146105535780638c1516c71461056657600080fd5b80635bab847f146105115780636874e0421461052457600080fd5b80634cca5e6c116102195780634cca5e6c1461045457806354fd4d501461047b57806356b65e97146104c457600080fd5b80633ee4d4a31461040657806342223ae91461042d57600080fd5b806322009af61161028b57806330ccebb51161027057806330ccebb5146103b75780633a549046146103d75780633ca83045146103df57600080fd5b806322009af614610388578063263a3402146103af57600080fd5b80630763fa7e116102bc5780630763fa7e14610330578063110d6069146103595780631796e52e1461036157600080fd5b80621c2ff6146102d7578063065643ea1461031b575b600080fd5b6102fe7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b61032e61032936600461546c565b61087a565b005b610338602881565b6040516fffffffffffffffffffffffffffffffff9091168152602001610312565b610338606481565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b61032e610ba0565b6103ca6103c53660046154b5565b610c2b565b6040516103129190615501565b6102fe610e87565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6102fe7f000000000000000000000000000000000000000000000000000000000000000081565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6104b76040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516103129190615542565b6105016104d23660046154b5565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff16151590565b6040519015158152602001610312565b61032e61051f3660046155c3565b610fb5565b6102fe7f000000000000000000000000000000000000000000000000000000000000000081565b61032e61112a565b61032e6105613660046154b5565b61126d565b61032e6105743660046154b5565b611380565b61032e6114e4565b61033861058f3660046154b5565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff1690565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6105016105f13660046154b5565b6116f5565b61032e6106043660046155fc565b611728565b61032e6106173660046154b5565b6118f4565b61032e61062a366004615617565b611a27565b61068461063d3660046154b5565b6001600160a01b031660009081526003602090815260408083205463ffffffff168352600290915290206001015461010090046effffffffffffffffffffffffffffff1690565b6040516effffffffffffffffffffffffffffff9091168152602001610312565b6001805468010000000000000000900463ffffffff166000908152600260205260409020015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16610684565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6103386107293660046154b5565b611cc1565b61032e61073c36600461563c565b611d25565b61032e61074f366004615655565b611f04565b6107876107623660046154b5565b6001600160a01b03166000908152600460205260409020546301000000900460ff1690565b60405160ff9091168152602001610312565b6107a16122d7565b60405163ffffffff9091168152602001610312565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b6107876107eb3660046154b5565b6001600160a01b0316600090815260046020526040902054610100900460ff1690565b61078761081c3660046154b5565b6001600160a01b031660009081526004602052604090205462010000900460ff1690565b61032e61084e3660046154b5565b6122fc565b6103387f000000000000000000000000000000000000000000000000000000000000000081565b3332146108b3576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333b156108ec576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108f733610c2b565b6005811115610908576109086154d2565b1461093f576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16836fffffffffffffffffffffffffffffffff1610156109bd576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606460ff831611156109fb576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260046020819052604091829020805460ff871662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff0090911617600117815591517f19412a20000000000000000000000000000000000000000000000000000000008152908101929092526fffffffffffffffffffffffffffffffff851660248301526001600160a01b03838116604484015290917f0000000000000000000000000000000000000000000000000000000000000000909116906319412a2090606401600060405180830381600087803b158015610ae157600080fd5b505af1158015610af5573d6000803e3d6000fd5b505050506fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811690851610801590610b4157610b41336123c0565b60408051821515815260ff861660208201526fffffffffffffffffffffffffffffffff871681830152905133917f36f43e5c63d19ec0a34168ec0838b5bfae77656b9f5b94b896e9d2172a41f4fe919081900360600190a25050505050565b6003610bab33610c2b565b6005811115610bbc57610bbc6154d2565b141580610be95750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b15610c20576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c29336123c0565b565b6001600160a01b03811660009081526004602052604081205460ff16610c5357506000919050565b6040517f981cee530000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16917f00000000000000000000000000000000000000000000000000000000000000009091169063981cee5390602401602060405180830381865afa158015610d08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2c919061567c565b6fffffffffffffffffffffffffffffffff161015610d4c57506001919050565b6001600160a01b03828116600081815260036020526040908190205490517f8abf0af0000000000000000000000000000000000000000000000000000000008152600481019290925263ffffffff161515917f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16917f000000000000000000000000000000000000000000000000000000000000000090911690638abf0af090602401602060405180830381865afa158015610e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e41919061567c565b6fffffffffffffffffffffffffffffffff161015610e705780610e675750600292915050565b50600492915050565b80610e7e5750600392915050565b50600592915050565b600080546001600160a01b031615610f905760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166380446bd26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d9190615699565b9050804210610f7f576000610f3282426156e1565b90507f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16811115610f7d576001600160a01b039250505090565b505b50506000546001600160a01b031690565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000610fc083610c2b565b9050818015610ffb57506001816005811115610fde57610fde6154d2565b1480610ffb57506004816005811115610ff957610ff96154d2565b145b156110595761100b6001846124b8565b1561105457826001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d99614260405161104b91815260200190565b60405180910390a25b505050565b600481600581111561106d5761106d6154d2565b10611054576040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301526111249185917f00000000000000000000000000000000000000000000000000000000000000001690638abf0af090602401602060405180830381865afa1580156110f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111b919061567c565b6001919061265a565b50505050565b336000908152600560205260409020546fffffffffffffffffffffffffffffffff16611182576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260056020526040902054426fffffffffffffffffffffffffffffffff90911611156111df576040517f1dfc20f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111e83361296f565b3360008181526005602052604080822080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055517f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f199190a2600361124e33610c2b565b600581111561125f5761125f6154d2565b03610c2957610c29336123c0565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112cf576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112d9610e87565b90506001600160a01b03808216148015906113065750806001600160a01b0316826001600160a01b031614155b1561133d576040517fc625317600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611346826116f5565b61137c576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140291906156f8565b6001600160a01b0316336001600160a01b03161461144c576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f8c1516c70000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f00000000000000000000000000000000000000000000000000000000000000001690638c1516c7906024015b600060405180830381600087803b1580156114c957600080fd5b505af11580156114dd573d6000803e3d6000fd5b5050505050565b60026114ef33610c2b565b6005811115611500576115006154d2565b108061152c5750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b15611563576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061156e33611cc1565b90507f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16816fffffffffffffffffffffffffffffffff16036115ed576040517fdf80df2100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806fffffffffffffffffffffffffffffffff16421015611639576040517f82225faf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526004602090815260409182902080547fffffffffffffffffffffffff0000000000000000000000000000000000ffffff6301000000820460ff90811662010000818102939093167fffffffffffffffffffffffff000000000000000000000000000000000000ffff851617855586519290930416808252938101829052919492939092917fa40865ec905b139b9cdbd0566756b576b074c47d9dde9f62388b1d66d3e72a6491015b60405180910390a250505050565b6000600561170283610c2b565b6005811115611713576117136154d2565b0361172057506001919050565b506000919050565b600261173333610c2b565b6005811115611744576117446154d2565b10806117705750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b156117a7576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600460205260409020606460ff831611156117f4576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805460ff62010000909104811690831681900361183d576040517f150393f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81547fffffffffffffffffffffffff0000000000000000000000000000000000ffffff16630100000060ff8581169182027fffffffffffffffffffffffff00000000000000000000000000000000ffffffff1692909217640100000000426fffffffffffffffffffffffffffffffff1602178455604080519284168352602083019190915233917f9d9fe61047777339f4f4cb36a1f75ee90e3c6aa90c13abd3ffa07f6f86e0a307910160405180910390a2505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611952573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197691906156f8565b6001600160a01b0316336001600160a01b0316146119c0576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa83871720000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063a8387172906024016114af565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa991906156f8565b6001600160a01b0316336001600160a01b031614611af3576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f536afae40000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063536afae4906024016020604051808303816000875af1158015611b79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9d919061567c565b60008481526006602090815260409182902080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000081166fffffffffffffffffffffffffffffffff918216869003821617909155915191831682529192506001600160a01b0384169185917fe2d313b9d9b90c2930241ea64ee5d6f4ff30dfd44a15cd3f1df2c6cb8021ec07910160405180910390a36001600160a01b03821660008181526005602052604080822080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055517f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f199190a26003611ca283610c2b565b6005811115611cb357611cb36154d2565b0361105457611054826123c0565b6001600160a01b038116600090815260046020526040812054611d1f907f00000000000000000000000000000000000000000000000000000000000000009064010000000090046fffffffffffffffffffffffffffffffff16615715565b92915050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611d87576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d8f6129d4565b506040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0ea09a890602401602060405180830381865afa158015611e11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3591906156f8565b6040517f8c1516c70000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192507f000000000000000000000000000000000000000000000000000000000000000090911690638c1516c790602401600060405180830381600087803b158015611eb657600080fd5b505af1158015611eca573d6000803e3d6000fd5b50506000546001600160a01b03908116908416039150611ef4905057611eef8161296f565b611efc565b611efc61310a565b61137c6131e1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8691906156f8565b6001600160a01b0316336001600160a01b031614611fd0576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5636aabd0000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301526000917f000000000000000000000000000000000000000000000000000000000000000090911690635636aabd906024016020604051808303816000875af1158015612056573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207a919061567c565b6040516fffffffffffffffffffffffffffffffff821681529091506001600160a01b0383169085907f1237821480ce4d75f917bc39d1641eb17a5e09a2d5bf982cdd8cb2561aa28e689060200160405180910390a36120da82600061347b565b837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612139573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215d9190615699565b116121b557600084815260066020526040902080546fffffffffffffffffffffffffffffffff8082168401167fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116179055611124565b6040517fc42996d60000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526fffffffffffffffffffffffffffffffff831660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c42996d6906044016020604051808303816000875af115801561224e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612272919061567c565b905061227f836000610fb5565b6040516fffffffffffffffffffffffffffffffff821681526001600160a01b0384169085907fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa149060200160405180910390a350505050565b6001546000906122f79063ffffffff640100000000820481169116615749565b905090565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461235e576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361236982610c2b565b600581111561237a5761237a6154d2565b1480156123af57506001600160a01b0381166000908152600560205260409020546fffffffffffffffffffffffffffffffff16155b156123bd576123bd816123c0565b50565b6040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301526124729183917f00000000000000000000000000000000000000000000000000000000000000001690638abf0af090602401602060405180830381865afa158015612445573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612469919061567c565b60019190613623565b806001600160a01b03167ff33a24861b76047debce215c7ae4915a9befc5d870e97efbd4152df23c72112a426040516124ad91815260200190565b60405180910390a250565b6001600160a01b038116600090815260028301602052604081205463ffffffff168082036124ea576000915050611d1f565b6001600160a01b03831660009081526002850160209081526040808320805463ffffffff1916905563ffffffff8481168452600180890190935292208054910154740100000000000000000000000000000000000000009091049091169061010090046effffffffffffffffffffffffffffff165b63ffffffff8216156126015763ffffffff91821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff909116179055547401000000000000000000000000000000000000000090049091169061255f565b61260b8684613cf1565b50508354600163ffffffff64010000000080840482168301909116027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff90921691909117855591505092915050565b6001600160a01b038216600090815260028401602052604081205463ffffffff1680820361268c576000915050612968565b63ffffffff80821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff8781166101008181027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff851617909455935492909104169274010000000000000000000000000000000000000000909104169082101561283c5763ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116848803700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff908116820116909202179091555b63ffffffff82161561282c5763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168601909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff909116179055547401000000000000000000000000000000000000000090049091169061278b565b506128378784614516565b612960565b63ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116878503700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff90811682900316909202179091555b63ffffffff8216156129555763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff90911617905554740100000000000000000000000000000000000000009004909116906128b3565b506129608784614722565b600193505050505b9392505050565b6001600160a01b038116600090815260046020526040902054610100900460ff16156123bd576001600160a01b0316600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a599190615699565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166369f16eec6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612abb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612adf9190615699565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6391906156f8565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b8152600401612b9091815260200190565b602060405180830381865afa158015612bad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd1919061576e565b612bde5760009250505090565b6000805b7f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff16108015612c355750828411155b15613049576040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906333727c4d90602401602060405180830381865afa158015612cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cdc919061576e565b15613049576040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0ea09a890602401602060405180830381865afa158015612d5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d8391906156f8565b90506000806000612d9384614b4d565b6040517fad4294510000000000000000000000000000000000000000000000000000000081526001600160a01b0388811660048301526fffffffffffffffffffffffffffffffff858116602484015284811660448401528316606483015293965091945092507f00000000000000000000000000000000000000000000000000000000000000009091169063ad42945190608401600060405180830381600087803b158015612e4157600080fd5b505af1158015612e55573d6000803e3d6000fd5b5050604080516fffffffffffffffffffffffffffffffff8581168252878116602083015286168183015290516001600160a01b03881693508a92507fd74a44a8cd6c73740a70271e07ee96d8a495ff30037ae6381cbcdb8fe7f2a1ea9181900360600190a36000878152600660205260409020546fffffffffffffffffffffffffffffffff168015613029576040517fc42996d60000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526fffffffffffffffffffffffffffffffff831660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c42996d6906044016020604051808303816000875af1158015612f7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f9e919061567c565b60008981526006602090815260409182902080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016905590516fffffffffffffffffffffffffffffffff831681529192506001600160a01b038716918a917fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa14910160405180910390a35b613034856000610fb5565b87600101975085600101955050505050612be2565b6fffffffffffffffffffffffffffffffff8216156130ff576040517f9902cdc0000000000000000000000000000000000000000000000000000000008152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639902cdc090602401600060405180830381600087803b1580156130dc57600080fd5b505af11580156130f0573d6000803e3d6000fd5b50505050600194505050505090565b600094505050505090565b6000546001600160a01b031661311c57565b600080546001600160a01b03168152600460205260409020547f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff1661010090910460ff161061318d57600054610c29906001600160a01b0316600161347b565b600080546001600160a01b03168152600460205260409020805460ff6101008083048216600101909116027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116179055565b6001805468010000000000000000900463ffffffff1660009081526002602052604081209091015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613290573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132b49190615699565b90506000826effffffffffffffffffffffffffffff161180156132d75750600081115b1561344f5760006001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a25ae5576133186001856156e1565b6040518263ffffffff1660e01b815260040161333691815260200190565b608060405180830381865afa158015613353573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613377919061578b565b9050600083826020015143414460014361339191906156e1565b6040805160208101969096528501939093527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606092831b1691840191909152607483015240609482015260b4016040516020818303038152906040528051906020012060001c613402919061585d565b905061340f600182614e7e565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555061137c9050565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555050565b6000816134a8577f00000000000000000000000000000000000000000000000000000000000000006134ca565b7f00000000000000000000000000000000000000000000000000000000000000005b90506000613501846001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff16151590565b6135145761350f8242615715565b61354a565b6001600160a01b03841660009081526005602052604090205461354a9083906fffffffffffffffffffffffffffffffff16615715565b6001600160a01b03851660008181526005602090815260409182902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff8616908117909155915191825292935090917f95a398f2b6b2ad94f281708c97fe502386fc16adca43daed577a1e992a4cc814910160405180910390a26135e36001856124b8565b1561112457836001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d9961426040516116e791815260200190565b6001600160a01b0382166136be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f42616c616e636564576569676874547265653a207a65726f206164647265737360448201527f206e6f7420616c6c6f776564000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6001600160a01b038216600090815260028401602052604090205463ffffffff161561376c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f42616c616e636564576569676874547265653a206e6f646520616c726561647960448201527f206578697374696e67000000000000000000000000000000000000000000000060648201526084016136b5565b60006040518060e00160405280846001600160a01b03168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600115158152602001836effffffffffffffffffffffffffffff168152602001836effffffffffffffffffffffffffffff16815250905083600001600081819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff1602179055505060008460000160009054906101000a900463ffffffff169050818560010160008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160186101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160006101000a81548160ff02191690831515021790555060a08201518160010160016101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555060c08201518160010160106101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555090505080856002016000866001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508460000160089054906101000a900463ffffffff1663ffffffff16600003613a4757845463ffffffff90911668010000000000000000027fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff90911617909355505050565b845468010000000000000000900463ffffffff165b63ffffffff808216600090815260018089016020526040822090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168b01909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff90911617905580549092600160c01b909104169003613b835763ffffffff838116600081815260018a016020526040902080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000938616939093029290921790915581547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b909102178155613b7a8784614516565b50505050505050565b8054600160e01b900463ffffffff16600003613c595763ffffffff838116600081815260018a8101602052604090912080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000948716949094029390931783559190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905581547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e01b909102178155613b7a8784614516565b805463ffffffff600160e01b8204811660009081526001808b016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff70010000000000000000000000000000000092839004811692909104161115613cd9578054600160e01b900463ffffffff169150613ceb565b8054600160c01b900463ffffffff1691505b50613a5c565b63ffffffff81166000908152600183016020526040902080546001600160a01b0316613d9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f42616c616e636564576569676874547265653a206e6f6465206e6f742065786960448201527f737473000000000000000000000000000000000000000000000000000000000060648201526084016136b5565b8054600160c01b900463ffffffff1660000361406d578054600160e01b900463ffffffff16600003613f1c57805474010000000000000000000000000000000000000000900463ffffffff16600003613e1d5782547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff168355613ed8565b600181015460ff1615613e8557805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff169055613ed8565b805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690555b5063ffffffff1660009081526001918201602052604081209081550180547fff00000000000000000000000000000000000000000000000000000000000000169055565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690614510565b8054600160e01b900463ffffffff166000036141d457805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690614510565b805463ffffffff600160e01b82048116600090815260018087016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff610100928390048116929091041611156143a257805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff821681178355600160e01b9096048c168a52868a20909801549254700100000000000000000000000000000000908190048316938190048316939093019091169091027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9093167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951791909117909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690614510565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559354600160c01b9096048c168a52868a2090980154700100000000000000000000000000000000908190048316958190048316959095019091169093027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091167fff000000000000000000000000000000000000000000000000000000000000ff90961695909517949094179055915490951682526002880190945292909220805494821663ffffffff1990951694909417909355815404909116905b50613cf1565b63ffffffff80821660009081526001840160205260408082208054740100000000000000000000000000000000000000009004909316825290205b815474010000000000000000000000000000000000000000900463ffffffff16158015906145a45750600180820154908301546effffffffffffffffffffffffffffff6101009283900481169290910416115b1561112457815481547fffffffffffffffffffffffff00000000000000000000000000000000000000008083166001600160a01b03928316178555835416918116919091178255600180840180548483018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117875584549584900483169384029516949094179092558354929003700100000000000000000000000000000000808404831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790558354821660009081526002870160209081526040808320805463ffffffff998a1663ffffffff199182161790915587549654909516835280832080549095167401000000000000000000000000000000000000000096879004891617909455945484900486168082529187019094528184208054939093049094168352909120614551565b5b63ffffffff8082166000908152600180850160205260408083208054600160e01b810486168552828520840154600160c01b90910490951684529220015490916effffffffffffffffffffffffffffff61010091829004811691909204909116111561496b57600180820154825463ffffffff600160c01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff6101009283900481169290910416111561105457805463ffffffff600160c01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c1617905588548690048716808652928252838520549097168452959095529020805490951690921790935590540416614723565b600180820154825463ffffffff600160e01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff6101009283900481169290910416111561105457805463ffffffff600160e01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c1617905588548690048716808652928252838520549097168452959095529020805490951690921790935590540416614723565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663360864176040518163ffffffff1660e01b8152600401602060405180830381865afa158015614bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614bd491906156f8565b6001600160a01b0316846001600160a01b031603614c1a5750600091508190507f0000000000000000000000000000000000000000000000000000000000000000614e77565b6001600160a01b03841660009081526004602052604081205462010000900460ff1690614c468661504d565b9050600080614c8b6fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000850116856064615183565b9050614cce6fffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016606486810390615183565b9150614cf16fffffffffffffffffffffffffffffffff8416606486810390615183565b6040517f981cee530000000000000000000000000000000000000000000000000000000081526001600160a01b038a811660048301529194506000917f0000000000000000000000000000000000000000000000000000000000000000169063981cee5390602401602060405180830381865afa158015614d76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d9a919061567c565b6040517f6b9ffeac0000000000000000000000000000000000000000000000000000000081526001600160a01b038b811660048301529192506000917f00000000000000000000000000000000000000000000000000000000000000001690636b9ffeac90602401602060405180830381865afa158015614e1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e43919061567c565b90506000614e666fffffffffffffffffffffffffffffffff861684808501615183565b948590039950949750505001925050505b9193909250565b815460009068010000000000000000900463ffffffff165b63ffffffff80821660009081526001808701602052604080832054600160c01b9004909316825291902001546effffffffffffffffffffffffffffff808516700100000000000000000000000000000000909204161115614f175763ffffffff9081166000908152600185016020526040902054600160c01b900416614e96565b63ffffffff8181166000818152600187810160205260408083208054600160c01b9004909516835282208101549290915291909101547001000000000000000000000000000000009091046effffffffffffffffffffffffffffff90811690940393848116610100909204161115614fb05763ffffffff1660009081526001840160205260409020546001600160a01b03169050611d1f565b63ffffffff818116600090815260018681016020526040808320808301549054600160e01b9004909416835290912001546101009091046effffffffffffffffffffffffffffff908116909403938481167001000000000000000000000000000000009092041611156150435763ffffffff9081166000908152600185016020526040902054600160e01b900416614e96565b6000915050611d1f565b6040517f913f1a9f0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015260009182917f0000000000000000000000000000000000000000000000000000000000000000169063913f1a9f90602401602060405180830381865afa1580156150d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150f5919061567c565b905060006151386fffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660286064615183565b905061517b816fffffffffffffffffffffffffffffffff1665010000000000615174856fffffffffffffffffffffffffffffffff166064615232565b91906152f9565b949350505050565b6000838302608081901c6fffffffffffffffffffffffffffffffff841611615207576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f55696e743132384d6174683a206d756c446976206f766572666c6f770000000060448201526064016136b5565b826fffffffffffffffffffffffffffffffff1681816152285761522861582e565b0495945050505050565b600080838310801561524b576001811461525e5761526d565b650100000000008502849004915061526d565b65010000000000840285900491505b506402ef6c3406818002602890811c808402821c808202831c808302841c808402851c938402851c95909502841c641da06a6e33909502841c6455232d2bb2909202841c640d4ca0c283909302841c643177d95571909102841c64fffe4bcada90960290931c9490940191909101039190910303905081831115611d1f576501921fb544430392915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003615351578382816153475761534761582e565b0492505050612968565b8084116153ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d6174683a206d756c446976206f766572666c6f77000000000000000000000060448201526064016136b5565b60008486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091026000889003889004909101858311909403939093029303949094049190911702949350505050565b6fffffffffffffffffffffffffffffffff811681146123bd57600080fd5b803560ff8116811461545257600080fd5b919050565b6001600160a01b03811681146123bd57600080fd5b60008060006060848603121561548157600080fd5b833561548c81615423565b925061549a60208501615441565b915060408401356154aa81615457565b809150509250925092565b6000602082840312156154c757600080fd5b813561296881615457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016006831061553c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b600060208083528351808285015260005b8181101561556f57858101830151858201604001528201615553565b81811115615581576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b80151581146123bd57600080fd5b600080604083850312156155d657600080fd5b82356155e181615457565b915060208301356155f1816155b5565b809150509250929050565b60006020828403121561560e57600080fd5b61296882615441565b6000806040838503121561562a57600080fd5b8235915060208301356155f181615457565b60006020828403121561564e57600080fd5b5035919050565b60008060006060848603121561566a57600080fd5b83359250602084013561549a81615457565b60006020828403121561568e57600080fd5b815161296881615423565b6000602082840312156156ab57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156156f3576156f36156b2565b500390565b60006020828403121561570a57600080fd5b815161296881615457565b60006fffffffffffffffffffffffffffffffff808316818516808303821115615740576157406156b2565b01949350505050565b600063ffffffff83811690831681811015615766576157666156b2565b039392505050565b60006020828403121561578057600080fd5b8151612968816155b5565b60006080828403121561579d57600080fd5b6040516080810181811067ffffffffffffffff821117156157e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405282516157f581615457565b815260208381015190820152604083015161580f81615423565b6040820152606083015161582281615423565b60608201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006effffffffffffffffffffffffffffff808416806158a6577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b9216919091069291505056fea164736f6c634300080f000a" + + +func init() { + if err := json.Unmarshal([]byte(ValidatorManagerStorageLayoutJSON), ValidatorManagerStorageLayout); err != nil { + panic(err) + } + + layouts["ValidatorManager"] = ValidatorManagerStorageLayout + deployedBytecodes["ValidatorManager"] = ValidatorManagerDeployedBin + immutableReferences["ValidatorManager"] = true +} diff --git a/kroma-bindings/bindings/validatorpool.go b/kroma-bindings/bindings/validatorpool.go index da160dfdb8..92ee1da50e 100644 --- a/kroma-bindings/bindings/validatorpool.go +++ b/kroma-bindings/bindings/validatorpool.go @@ -31,8 +31,8 @@ var ( // ValidatorPoolMetaData contains all meta data concerning the ValidatorPool contract. var ValidatorPoolMetaData = &bind.MetaData{ - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_l2OutputOracle\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"},{\"name\":\"_portal\",\"type\":\"address\",\"internalType\":\"contractKromaPortal\"},{\"name\":\"_securityCouncil\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_trustedValidator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_requiredBondAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_maxUnbond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_roundDuration\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"L2_ORACLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_UNBOND\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PORTAL\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractKromaPortal\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"REQUIRED_BOND_AMOUNT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ROUND_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"SECURITY_COUNCIL\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"TAX_DENOMINATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"TAX_NUMERATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"TRUSTED_VALIDATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VAULT_REWARD_GAS_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addPendingBond\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"_addr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createBond\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_expiresAt\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"getBond\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTypes.Bond\",\"components\":[{\"name\":\"amount\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"expiresAt\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingBond\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBond\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isValidator\",\"inputs\":[{\"name\":\"_addr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextValidator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"releasePendingBond\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unbond\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawTo\",\"inputs\":[{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BondIncreased\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Bonded\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"},{\"name\":\"expiresAt\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingBondAdded\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingBondReleased\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unbonded\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false}]", - Bin: "0x6101606040523480156200001257600080fd5b5060405162002b4d38038062002b4d83398101604081905262000035916200024f565b6001600160a01b0380881660805286811660a05285811660c052841660e0526001600160801b038316610100526101208290526101408190526200007862000085565b50505050505050620002d6565b600054610100900460ff1615808015620000a65750600054600160ff909116105b80620000d65750620000c330620001b760201b6200193f1760201c565b158015620000d6575060005460ff166001145b6200013f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000163576000805461ff0019166101001790555b6200016d620001c6565b8015620001b4576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6001600160a01b03163b151590565b600054610100900460ff16620002335760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840162000136565b60018055565b6001600160a01b0381168114620001b457600080fd5b600080600080600080600060e0888a0312156200026b57600080fd5b8751620002788162000239565b60208901519097506200028b8162000239565b60408901519096506200029e8162000239565b6060890151909550620002b18162000239565b809450506080880151925060a0880151915060c0880151905092959891949750929550565b60805160a05160c05160e051610100516101205161014051612789620003c4600039600081816103c50152610ba001526000818161049a0152611d7f01526000818161051301528181610dca01528181610e4b015281816113670152818161139f01528181611a430152611c410152600081816103060152610bee01526000818161029d015281816118550152611c8e01526000818161022701526121ca0152600081816101b7015281816107e301528181610a6a01528181610af801528181610c1201528181611175015281816112ec0152818161156401528181611e49015261200501526127896000f3fe6080604052600436106101a05760003560e01c806370a08231116100e1578063ab91f1901161008a578063d38dc7ee11610064578063d38dc7ee1461053d578063d8fe76421461055d578063dd215c5d146105ad578063facd743b146105cd57600080fd5b8063ab91f190146104d1578063b7d636a514610501578063d0e30db01461053557600080fd5b80638f09ade4116100bb5780638f09ade414610468578063946765fd14610488578063a51c9ace146104bc57600080fd5b806370a08231146103e75780638129fc1c1461041d57806382dae3aa1461043257600080fd5b806336b834691161014e57806354fd4d501161012857806354fd4d50146103285780635a5447421461037e5780635df6a6bc1461039e5780636641ea08146103b357600080fd5b806336b83469146102bf5780633a549046146102df5780633ee4d4a3146102f457600080fd5b8063205c28781161017f578063205c2878146102495780632e1a7d4d1461026b578063360864171461028b57600080fd5b80621c2ff6146101a55780630f43a677146101f65780630ff754ea14610215575b600080fd5b3480156101b157600080fd5b506101d97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561020257600080fd5b506036545b6040519081526020016101ed565b34801561022157600080fd5b506101d97f000000000000000000000000000000000000000000000000000000000000000081565b34801561025557600080fd5b5061026961026436600461233c565b6105fd565b005b34801561027757600080fd5b50610269610286366004612368565b610730565b34801561029757600080fd5b506101d97f000000000000000000000000000000000000000000000000000000000000000081565b3480156102cb57600080fd5b506102696102da366004612381565b6107e1565b3480156102eb57600080fd5b506101d9610a52565b34801561030057600080fd5b506101d97f000000000000000000000000000000000000000000000000000000000000000081565b34801561033457600080fd5b506103716040518060400160405280600581526020017f312e302e3100000000000000000000000000000000000000000000000000000081525081565b6040516101ed919061242e565b34801561038a57600080fd5b50610269610399366004612441565b610c10565b3480156103aa57600080fd5b50610269610eb9565b3480156103bf57600080fd5b506102077f000000000000000000000000000000000000000000000000000000000000000081565b3480156103f357600080fd5b50610207610402366004612471565b6001600160a01b031660009081526033602052604090205490565b34801561042957600080fd5b50610269610f38565b34801561043e57600080fd5b50610447601481565b6040516fffffffffffffffffffffffffffffffff90911681526020016101ed565b34801561047457600080fd5b50610447610483366004612441565b6110af565b34801561049457600080fd5b506102077f000000000000000000000000000000000000000000000000000000000000000081565b3480156104c857600080fd5b50610447606481565b3480156104dd57600080fd5b506104e8620186a081565b60405167ffffffffffffffff90911681526020016101ed565b34801561050d57600080fd5b506104477f000000000000000000000000000000000000000000000000000000000000000081565b61026961115e565b34801561054957600080fd5b506102696105583660046124ac565b61116a565b34801561056957600080fd5b5061057d610578366004612368565b611443565b6040805182516fffffffffffffffffffffffffffffffff90811682526020938401511692810192909252016101ed565b3480156105b957600080fd5b506102696105c8366004612441565b611562565b3480156105d957600080fd5b506105ed6105e8366004612471565b6118c8565b60405190151581526020016101ed565b61060561194e565b6001600160a01b0382166106865760405162461bcd60e51b815260206004820152603260248201527f56616c696461746f72506f6f6c3a2063616e6e6f74207769746864726177207460448201527f6f20746865207a65726f2061646472657373000000000000000000000000000060648201526084015b60405180910390fd5b61069033826119a7565b60006106ad835a8460405180602001604052806000815250611bf9565b9050806107225760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f72506f6f6c3a20455448207472616e73666572206661696c60448201527f6564000000000000000000000000000000000000000000000000000000000000606482015260840161067d565b5061072c60018055565b5050565b61073861194e565b61074233826119a7565b600061075f335a8460405180602001604052806000815250611bf9565b9050806107d45760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f72506f6f6c3a20455448207472616e73666572206661696c60448201527f6564000000000000000000000000000000000000000000000000000000000000606482015260840161067d565b506107de60018055565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561083f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086391906124d1565b6001600160a01b0316336001600160a01b0316146108e95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f7420436f6c60448201527f6f737365756d0000000000000000000000000000000000000000000000000000606482015260840161067d565b60008381526039602090815260408083206001600160a01b03861684529091529020546fffffffffffffffffffffffffffffffff16806109915760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a207468652070656e64696e6720626f6e642060448201527f646f6573206e6f74206578697374000000000000000000000000000000000000606482015260840161067d565b60008481526039602090815260408083206001600160a01b0387168452909152902080547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690556109f5826fffffffffffffffffffffffffffffffff8316611c19565b6040516fffffffffffffffffffffffffffffffff821681526001600160a01b03808416919085169086907f8c95336a279406edcc768d685e8eb6667368a77d840a188144b8e3719423198f9060200160405180910390a450505050565b6038546000906001600160a01b031615610beb5760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dcec33486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ac6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aea91906124ee565b905060006001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663d1de856c610b28846001612536565b6040518263ffffffff1660e01b8152600401610b4691815260200190565b602060405180830381865afa158015610b63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8791906124ee565b9050804210610bd8576000610b9c824261254e565b90507f0000000000000000000000000000000000000000000000000000000000000000811115610bd6576001600160a01b03935050505090565b505b50506038546001600160a01b0316919050565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9291906124d1565b6001600160a01b0316336001600160a01b031614610d185760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f7420436f6c60448201527f6f737365756d0000000000000000000000000000000000000000000000000000606482015260840161067d565b60008281526034602052604090208054427001000000000000000000000000000000009091046fffffffffffffffffffffffffffffffff161015610dc45760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a20746865206f757470757420697320616c7260448201527f656164792066696e616c697a6564000000000000000000000000000000000000606482015260840161067d565b610e00827f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff166119a7565b60008381526039602090815260408083206001600160a01b0386168085529083529281902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000167f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16908117909155905190815285917f2904258f32adf74dd8f23ad6f17ff50209896039c8ee3d4728ff55bd05c4cf2a910160405180910390a3505050565b6000610ec3611d4d565b9050806107de5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f72506f6f6c3a206e6f20626f6e6420746861742063616e2060448201527f626520756e626f6e640000000000000000000000000000000000000000000000606482015260840161067d565b600054610100900460ff1615808015610f585750600054600160ff909116105b80610f725750303b158015610f72575060005460ff166001145b610fe45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161067d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561104257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b61104a611f6b565b80156107de57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b60008281526039602090815260408083206001600160a01b03851684529091528120546fffffffffffffffffffffffffffffffff16806111575760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a207468652070656e64696e6720626f6e642060448201527f646f6573206e6f74206578697374000000000000000000000000000000000000606482015260840161067d565b9392505050565b6111683334611c19565b565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112085760405162461bcd60e51b815260206004820152602b60248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f74204c324f60448201527f75747075744f7261636c65000000000000000000000000000000000000000000606482015260840161067d565b6000828152603460205260409020805470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16156112b15760405162461bcd60e51b815260206004820152603c60248201527f56616c696461746f72506f6f6c3a20626f6e64206f662074686520676976656e60448201527f206f757470757420696e64657820616c72656164792065786973747300000000606482015260840161067d565b6112b9611d4d565b506040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018490526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0ea09a890602401602060405180830381865afa15801561133b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135f91906124d1565b905061139d817f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff166119a7565b7f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff9081167001000000000000000000000000000000009185169182028117845560408051918252602082019290925285916001600160a01b038416917f5ca130257b8f76f72ad2965efcbe166f3918d820e4a49956e70081ea311f97c4910160405180910390a361143d611fe8565b50505050565b6040805180820190915260008082526020820152600082815260346020526040902080546fffffffffffffffffffffffffffffffff16158015906114ad5750805470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1615155b61151f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2074686520626f6e6420646f6573206e6f7460448201527f2065786973740000000000000000000000000000000000000000000000000000606482015260840161067d565b6040805180820190915290546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000090910416602082015292915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e491906124d1565b6001600160a01b0316336001600160a01b03161461166a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f7420436f6c60448201527f6f737365756d0000000000000000000000000000000000000000000000000000606482015260840161067d565b60008281526034602052604090208054427001000000000000000000000000000000009091046fffffffffffffffffffffffffffffffff1610156117165760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a20746865206f757470757420697320616c7260448201527f656164792066696e616c697a6564000000000000000000000000000000000000606482015260840161067d565b60008381526039602090815260408083206001600160a01b03861684529091529020546fffffffffffffffffffffffffffffffff16806117be5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a207468652070656e64696e6720626f6e642060448201527f646f6573206e6f74206578697374000000000000000000000000000000000000606482015260840161067d565b600060646117cd601484612565565b6117d791906125cc565b905060006117e582846125fb565b60008781526039602090815260408083206001600160a01b038a811680865291845282852080547fffffffffffffffffffffffffffffffff000000000000000000000000000000009081169091558a549081166fffffffffffffffffffffffffffffffff91821688018216178b557f00000000000000000000000000000000000000000000000000000000000000009091168552603384529382902080548886160190559051928416835292935088917f383f9b8b5a1fc2ec555726eb895621a312042e18b764135fa12ef1a520ad30db910160405180910390a3505050505050565b60365460009081036118dc57506000919050565b6001600160a01b0382166118f257506000919050565b6001600160a01b03821660008181526037602052604090205460368054919291839081106119225761192261262c565b6000918252602090912001546001600160a01b0316149392505050565b6001600160a01b03163b151590565b6002600154036119a05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161067d565b6002600155565b6001600160a01b03821660009081526033602052604090205481811015611a355760405162461bcd60e51b8152602060048201526024808201527f56616c696461746f72506f6f6c3a20696e73756666696369656e742062616c6160448201527f6e63657300000000000000000000000000000000000000000000000000000000606482015260840161067d565b611a3f828261254e565b90507f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff1681108015611a865750611a86836118c8565b15611bd957603654600090611a9d9060019061254e565b90508015611b55576001600160a01b0384166000908152603760205260408120546036805491929184908110611ad557611ad561262c565b600091825260209091200154603680546001600160a01b039092169250829184908110611b0457611b0461262c565b600091825260208083209190910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03948516179055929091168152603790915260409020555b6001600160a01b0384166000908152603760205260408120556036805480611b7f57611b7f61265b565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055505b6001600160a01b0390921660009081526033602052604090209190915550565b600080600080845160208601878a8af19695505050505050565b60018055565b6001600160a01b038216600090815260336020526040812054611c3d908390612536565b90507f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff168110158015611c875750611c85836118c8565b155b15611bd9577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614611bd957603680546001600160a01b03949094166000818152603760209081526040808320889055600188019094557f4a11f94e20a93c79f6ec743a1954ec4fc2c08429ae2122118bf234b2185c81b890960180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690921790915560339094529092209190915550565b60355460408051608081018252600080825260208201819052918101829052606081018290529091908290819060005b7f0000000000000000000000000000000000000000000000000000000000000000811015611f4857600085815260346020526040902080546fffffffffffffffffffffffffffffffff80821696509194507001000000000000000000000000000000009004164210801590611e0457506000846fffffffffffffffffffffffffffffffff16115b15611f485760008581526034602052604080822091909155517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018690527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa158015611e98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebc919061268a565b9150611ede8260000151856fffffffffffffffffffffffffffffffff16611c19565b81516040516fffffffffffffffffffffffffffffffff861681526001600160a01b039091169086907f7047a0fb8bfae78c0ebbd4117437945bb85240453235ac4fd2e55712eb5bf0c39060200160405180910390a3611f3c826121b6565b60019485019401611d7d565b8015611f5f57505050603591909155506001919050565b60009550505050505090565b600054610100900460ff16611c135760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161067d565b6036548015801590611ffc57506000603554115b1561218b5760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a25ae5576001603554612041919061254e565b6040518263ffffffff1660e01b815260040161205f91815260200190565b608060405180830381865afa15801561207c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a0919061268a565b905060008282602001514341446001436120ba919061254e565b6040805160208101969096528501939093527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606092831b1691840191909152607483015240609482015260b4016040516020818303038152906040528051906020012060001c61212b919061272d565b9050603681815481106121405761214061262c565b600091825260209091200154603880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216919091179055506107de9050565b603880547fffffffffffffffffffffffff000000000000000000000000000000000000000016905550565b805160608201516040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263c30af3889273420000000000000000000000000000000000000892620186a0927f21670f220000000000000000000000000000000000000000000000000000000092612260926024016001600160a01b039290921682526fffffffffffffffffffffffffffffffff16602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b90921682526122f2939291600401612741565b600060405180830381600087803b15801561230c57600080fd5b505af1158015612320573d6000803e3d6000fd5b5050505050565b6001600160a01b03811681146107de57600080fd5b6000806040838503121561234f57600080fd5b823561235a81612327565b946020939093013593505050565b60006020828403121561237a57600080fd5b5035919050565b60008060006060848603121561239657600080fd5b8335925060208401356123a881612327565b915060408401356123b881612327565b809150509250925092565b6000815180845260005b818110156123e9576020818501810151868301820152016123cd565b818111156123fb576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061115760208301846123c3565b6000806040838503121561245457600080fd5b82359150602083013561246681612327565b809150509250929050565b60006020828403121561248357600080fd5b813561115781612327565b6fffffffffffffffffffffffffffffffff811681146107de57600080fd5b600080604083850312156124bf57600080fd5b8235915060208301356124668161248e565b6000602082840312156124e357600080fd5b815161115781612327565b60006020828403121561250057600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561254957612549612507565b500190565b60008282101561256057612560612507565b500390565b60006fffffffffffffffffffffffffffffffff8083168185168183048111821515161561259457612594612507565b02949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006fffffffffffffffffffffffffffffffff808416806125ef576125ef61259d565b92169190910492915050565b60006fffffffffffffffffffffffffffffffff8381169083168181101561262457612624612507565b039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006080828403121561269c57600080fd5b6040516080810181811067ffffffffffffffff821117156126e6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405282516126f481612327565b815260208381015190820152604083015161270e8161248e565b604082015260608301516127218161248e565b60608201529392505050565b60008261273c5761273c61259d565b500690565b6001600160a01b038416815267ffffffffffffffff8316602082015260606040820152600061277360608301846123c3565b9594505050505056fea164736f6c634300080f000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_l2OutputOracle\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"},{\"name\":\"_portal\",\"type\":\"address\",\"internalType\":\"contractKromaPortal\"},{\"name\":\"_securityCouncil\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_trustedValidator\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_requiredBondAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_maxUnbond\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_roundDuration\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_terminateOutputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"L2_ORACLE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractL2OutputOracle\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAX_UNBOND\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"PORTAL\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractKromaPortal\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"REQUIRED_BOND_AMOUNT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"ROUND_DURATION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"SECURITY_COUNCIL\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"TAX_DENOMINATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"TAX_NUMERATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"TERMINATE_OUTPUT_INDEX\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"TRUSTED_VALIDATOR\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"VAULT_REWARD_GAS_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"addPendingBond\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"balanceOf\",\"inputs\":[{\"name\":\"_addr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"createBond\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_expiresAt\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"deposit\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"getBond\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structTypes.Bond\",\"components\":[{\"name\":\"amount\",\"type\":\"uint128\",\"internalType\":\"uint128\"},{\"name\":\"expiresAt\",\"type\":\"uint128\",\"internalType\":\"uint128\"}]}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"getPendingBond\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"uint128\",\"internalType\":\"uint128\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"increaseBond\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"isTerminated\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"isValidator\",\"inputs\":[{\"name\":\"_addr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"nextValidator\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"releasePendingBond\",\"inputs\":[{\"name\":\"_outputIndex\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_challenger\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_recipient\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"unbond\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"validatorCount\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"version\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"withdraw\",\"inputs\":[{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"withdrawTo\",\"inputs\":[{\"name\":\"_to\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"BondIncreased\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Bonded\",\"inputs\":[{\"name\":\"submitter\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"},{\"name\":\"expiresAt\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint8\",\"indexed\":false,\"internalType\":\"uint8\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingBondAdded\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"PendingBondReleased\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"challenger\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Unbonded\",\"inputs\":[{\"name\":\"outputIndex\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint128\",\"indexed\":false,\"internalType\":\"uint128\"}],\"anonymous\":false}]", + Bin: "0x6101806040523480156200001257600080fd5b5060405162002d3f38038062002d3f833981016040819052620000359162000256565b6001600160a01b0380891660805287811660a05286811660c052851660e0526001600160801b038416610100526101208390526101608190526101408290526200007e6200008c565b5050505050505050620002e5565b600054610100900460ff1615808015620000ad5750600054600160ff909116105b80620000dd5750620000ca30620001be60201b62001a6f1760201c565b158015620000dd575060005460ff166001145b620001465760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff1916600117905580156200016a576000805461ff0019166101001790555b62000174620001cd565b8015620001bb576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6001600160a01b03163b151590565b600054610100900460ff166200023a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016200013d565b60018055565b6001600160a01b0381168114620001bb57600080fd5b600080600080600080600080610100898b0312156200027457600080fd5b8851620002818162000240565b60208a0151909850620002948162000240565b60408a0151909750620002a78162000240565b60608a0151909650620002ba8162000240565b60808a015160a08b015160c08c015160e0909c01519a9d999c50979a91999098919650945092505050565b60805160a05160c05160e0516101005161012051610140516101605161294c620003f36000396000818161030701528181610568015261114d01526000818161040f0152610b8d0152600081816104e40152611eaf0152600081816105ad01528181610db401528181610e3501528181611497015281816114cf01528181611b730152611d710152600081816103500152610bd80152600081816102b3015281816119850152611dbe01526000818161023d015261238d0152600081816101cd0152818161086d01528181610af401528181610bfc01528181611175015281816112a50152818161141c0152818161169401528181611f79015281816120b201526121c8015261294c6000f3fe6080604052600436106101b65760003560e01c806370a08231116100ec578063ad36d6cc1161008a578063d38dc7ee11610064578063d38dc7ee146105d7578063d8fe7642146105f7578063dd215c5d14610647578063facd743b1461066757600080fd5b8063ad36d6cc1461054b578063b7d636a51461059b578063d0e30db0146105cf57600080fd5b80638f09ade4116100c65780638f09ade4146104b2578063946765fd146104d2578063a51c9ace14610506578063ab91f1901461051b57600080fd5b806370a08231146104315780638129fc1c1461046757806382dae3aa1461047c57600080fd5b806339111af81161015957806354fd4d501161013357806354fd4d50146103725780635a544742146103c85780635df6a6bc146103e85780636641ea08146103fd57600080fd5b806339111af8146102f55780633a549046146103295780633ee4d4a31461033e57600080fd5b8063205c287811610195578063205c28781461025f5780632e1a7d4d1461028157806336086417146102a157806336b83469146102d557600080fd5b80621c2ff6146101bb5780630f43a6771461020c5780630ff754ea1461022b575b600080fd5b3480156101c757600080fd5b506101ef7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561021857600080fd5b506036545b604051908152602001610203565b34801561023757600080fd5b506101ef7f000000000000000000000000000000000000000000000000000000000000000081565b34801561026b57600080fd5b5061027f61027a3660046124ff565b610687565b005b34801561028d57600080fd5b5061027f61029c36600461252b565b6107ba565b3480156102ad57600080fd5b506101ef7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102e157600080fd5b5061027f6102f0366004612544565b61086b565b34801561030157600080fd5b5061021d7f000000000000000000000000000000000000000000000000000000000000000081565b34801561033557600080fd5b506101ef610adc565b34801561034a57600080fd5b506101ef7f000000000000000000000000000000000000000000000000000000000000000081565b34801561037e57600080fd5b506103bb6040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161020391906125f1565b3480156103d457600080fd5b5061027f6103e3366004612604565b610bfa565b3480156103f457600080fd5b5061027f610ea3565b34801561040957600080fd5b5061021d7f000000000000000000000000000000000000000000000000000000000000000081565b34801561043d57600080fd5b5061021d61044c366004612634565b6001600160a01b031660009081526033602052604090205490565b34801561047357600080fd5b5061027f610f22565b34801561048857600080fd5b50610491601481565b6040516fffffffffffffffffffffffffffffffff9091168152602001610203565b3480156104be57600080fd5b506104916104cd366004612604565b611099565b3480156104de57600080fd5b5061021d7f000000000000000000000000000000000000000000000000000000000000000081565b34801561051257600080fd5b50610491606481565b34801561052757600080fd5b50610532620186a081565b60405167ffffffffffffffff9091168152602001610203565b34801561055757600080fd5b5061058b61056636600461252b565b7f00000000000000000000000000000000000000000000000000000000000000001090565b6040519015158152602001610203565b3480156105a757600080fd5b506104917f000000000000000000000000000000000000000000000000000000000000000081565b61027f611148565b3480156105e357600080fd5b5061027f6105f236600461266f565b61129a565b34801561060357600080fd5b5061061761061236600461252b565b611573565b6040805182516fffffffffffffffffffffffffffffffff9081168252602093840151169281019290925201610203565b34801561065357600080fd5b5061027f610662366004612604565b611692565b34801561067357600080fd5b5061058b610682366004612634565b6119f8565b61068f611a7e565b6001600160a01b0382166107105760405162461bcd60e51b815260206004820152603260248201527f56616c696461746f72506f6f6c3a2063616e6e6f74207769746864726177207460448201527f6f20746865207a65726f2061646472657373000000000000000000000000000060648201526084015b60405180910390fd5b61071a3382611ad7565b6000610737835a8460405180602001604052806000815250611d29565b9050806107ac5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f72506f6f6c3a20455448207472616e73666572206661696c60448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610707565b506107b660018055565b5050565b6107c2611a7e565b6107cc3382611ad7565b60006107e9335a8460405180602001604052806000815250611d29565b90508061085e5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f72506f6f6c3a20455448207472616e73666572206661696c60448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610707565b5061086860018055565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ed9190612694565b6001600160a01b0316336001600160a01b0316146109735760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f7420436f6c60448201527f6f737365756d00000000000000000000000000000000000000000000000000006064820152608401610707565b60008381526039602090815260408083206001600160a01b03861684529091529020546fffffffffffffffffffffffffffffffff1680610a1b5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a207468652070656e64696e6720626f6e642060448201527f646f6573206e6f742065786973740000000000000000000000000000000000006064820152608401610707565b60008481526039602090815260408083206001600160a01b0387168452909152902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055610a7f826fffffffffffffffffffffffffffffffff8316611d49565b6040516fffffffffffffffffffffffffffffffff821681526001600160a01b03808416919085169086907f8c95336a279406edcc768d685e8eb6667368a77d840a188144b8e3719423198f9060200160405180910390a450505050565b6038546000906001600160a01b031615610bd55760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166380446bd26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7491906126b1565b9050804210610bc4576000610b8982426126f9565b90507f0000000000000000000000000000000000000000000000000000000000000000811115610bc2576001600160a01b039250505090565b505b50506038546001600160a01b031690565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7c9190612694565b6001600160a01b0316336001600160a01b031614610d025760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f7420436f6c60448201527f6f737365756d00000000000000000000000000000000000000000000000000006064820152608401610707565b60008281526034602052604090208054427001000000000000000000000000000000009091046fffffffffffffffffffffffffffffffff161015610dae5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a20746865206f757470757420697320616c7260448201527f656164792066696e616c697a65640000000000000000000000000000000000006064820152608401610707565b610dea827f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16611ad7565b60008381526039602090815260408083206001600160a01b0386168085529083529281902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000167f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16908117909155905190815285917f2904258f32adf74dd8f23ad6f17ff50209896039c8ee3d4728ff55bd05c4cf2a910160405180910390a3505050565b6000610ead611e7d565b9050806108685760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f72506f6f6c3a206e6f20626f6e6420746861742063616e2060448201527f626520756e626f6e6400000000000000000000000000000000000000000000006064820152608401610707565b600054610100900460ff1615808015610f425750600054600160ff909116105b80610f5c5750303b158015610f5c575060005460ff166001145b610fce5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610707565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561102c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b61103461212e565b801561086857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b60008281526039602090815260408083206001600160a01b03851684529091528120546fffffffffffffffffffffffffffffffff16806111415760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a207468652070656e64696e6720626f6e642060448201527f646f6573206e6f742065786973740000000000000000000000000000000000006064820152608401610707565b9392505050565b6111737f00000000000000000000000000000000000000000000000000000000000000006001612710565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636abcf5636040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f591906126b1565b1061128e5760405162461bcd60e51b815260206004820152604260248201527f56616c696461746f72506f6f6c3a206f6e6c792063616e206465706f7369742060448201527f746f2056616c696461746f72506f6f6c206265666f7265207465726d696e617460648201527f6564000000000000000000000000000000000000000000000000000000000000608482015260a401610707565b6112983334611d49565b565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113385760405162461bcd60e51b815260206004820152602b60248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f74204c324f60448201527f75747075744f7261636c650000000000000000000000000000000000000000006064820152608401610707565b6000828152603460205260409020805470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16156113e15760405162461bcd60e51b815260206004820152603c60248201527f56616c696461746f72506f6f6c3a20626f6e64206f662074686520676976656e60448201527f206f757470757420696e64657820616c726561647920657869737473000000006064820152608401610707565b6113e9611e7d565b506040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018490526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0ea09a890602401602060405180830381865afa15801561146b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148f9190612694565b90506114cd817f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16611ad7565b7f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff9081167001000000000000000000000000000000009185169182028117845560408051918252602082019290925285916001600160a01b038416917f5ca130257b8f76f72ad2965efcbe166f3918d820e4a49956e70081ea311f97c4910160405180910390a361156d6121ab565b50505050565b6040805180820190915260008082526020820152600082815260346020526040902080546fffffffffffffffffffffffffffffffff16158015906115dd5750805470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1615155b61164f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2074686520626f6e6420646f6573206e6f7460448201527f20657869737400000000000000000000000000000000000000000000000000006064820152608401610707565b6040805180820190915290546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000090910416602082015292915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117149190612694565b6001600160a01b0316336001600160a01b03161461179a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f7420436f6c60448201527f6f737365756d00000000000000000000000000000000000000000000000000006064820152608401610707565b60008281526034602052604090208054427001000000000000000000000000000000009091046fffffffffffffffffffffffffffffffff1610156118465760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a20746865206f757470757420697320616c7260448201527f656164792066696e616c697a65640000000000000000000000000000000000006064820152608401610707565b60008381526039602090815260408083206001600160a01b03861684529091529020546fffffffffffffffffffffffffffffffff16806118ee5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a207468652070656e64696e6720626f6e642060448201527f646f6573206e6f742065786973740000000000000000000000000000000000006064820152608401610707565b600060646118fd601484612728565b611907919061278f565b9050600061191582846127be565b60008781526039602090815260408083206001600160a01b038a811680865291845282852080547fffffffffffffffffffffffffffffffff000000000000000000000000000000009081169091558a549081166fffffffffffffffffffffffffffffffff91821688018216178b557f00000000000000000000000000000000000000000000000000000000000000009091168552603384529382902080548886160190559051928416835292935088917f383f9b8b5a1fc2ec555726eb895621a312042e18b764135fa12ef1a520ad30db910160405180910390a3505050505050565b6036546000908103611a0c57506000919050565b6001600160a01b038216611a2257506000919050565b6001600160a01b0382166000818152603760205260409020546036805491929183908110611a5257611a526127ef565b6000918252602090912001546001600160a01b0316149392505050565b6001600160a01b03163b151590565b600260015403611ad05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610707565b6002600155565b6001600160a01b03821660009081526033602052604090205481811015611b655760405162461bcd60e51b8152602060048201526024808201527f56616c696461746f72506f6f6c3a20696e73756666696369656e742062616c6160448201527f6e636573000000000000000000000000000000000000000000000000000000006064820152608401610707565b611b6f82826126f9565b90507f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff1681108015611bb65750611bb6836119f8565b15611d0957603654600090611bcd906001906126f9565b90508015611c85576001600160a01b0384166000908152603760205260408120546036805491929184908110611c0557611c056127ef565b600091825260209091200154603680546001600160a01b039092169250829184908110611c3457611c346127ef565b600091825260208083209190910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03948516179055929091168152603790915260409020555b6001600160a01b0384166000908152603760205260408120556036805480611caf57611caf61281e565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055505b6001600160a01b0390921660009081526033602052604090209190915550565b600080600080845160208601878a8af19695505050505050565b60018055565b6001600160a01b038216600090815260336020526040812054611d6d908390612710565b90507f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff168110158015611db75750611db5836119f8565b155b15611d09577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614611d0957603680546001600160a01b03949094166000818152603760209081526040808320889055600188019094557f4a11f94e20a93c79f6ec743a1954ec4fc2c08429ae2122118bf234b2185c81b890960180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690921790915560339094529092209190915550565b60355460408051608081018252600080825260208201819052918101829052606081018290529091908290819060005b7f000000000000000000000000000000000000000000000000000000000000000081101561207857600085815260346020526040902080546fffffffffffffffffffffffffffffffff80821696509194507001000000000000000000000000000000009004164210801590611f3457506000846fffffffffffffffffffffffffffffffff16115b156120785760008581526034602052604080822091909155517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018690527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa158015611fc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fec919061284d565b915061200e8260000151856fffffffffffffffffffffffffffffffff16611d49565b81516040516fffffffffffffffffffffffffffffffff861681526001600160a01b039091169086907f7047a0fb8bfae78c0ebbd4117437945bb85240453235ac4fd2e55712eb5bf0c39060200160405180910390a361206c82612379565b60019485019401611ead565b80156121225760358590556040517f9902cdc0000000000000000000000000000000000000000000000000000000008152600481018690527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639902cdc090602401600060405180830381600087803b1580156120fe57600080fd5b505af1158015612112573d6000803e3d6000fd5b5050505060019550505050505090565b60009550505050505090565b600054610100900460ff16611d435760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610707565b60365480158015906121bf57506000603554115b1561234e5760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a25ae557600160355461220491906126f9565b6040518263ffffffff1660e01b815260040161222291815260200190565b608060405180830381865afa15801561223f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612263919061284d565b9050600082826020015143414460014361227d91906126f9565b6040805160208101969096528501939093527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606092831b1691840191909152607483015240609482015260b4016040516020818303038152906040528051906020012060001c6122ee91906128f0565b905060368181548110612303576123036127ef565b600091825260209091200154603880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216919091179055506108689050565b603880547fffffffffffffffffffffffff000000000000000000000000000000000000000016905550565b805160608201516040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263c30af3889273420000000000000000000000000000000000000892620186a0927f21670f220000000000000000000000000000000000000000000000000000000092612423926024016001600160a01b039290921682526fffffffffffffffffffffffffffffffff16602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b90921682526124b5939291600401612904565b600060405180830381600087803b1580156124cf57600080fd5b505af11580156124e3573d6000803e3d6000fd5b5050505050565b6001600160a01b038116811461086857600080fd5b6000806040838503121561251257600080fd5b823561251d816124ea565b946020939093013593505050565b60006020828403121561253d57600080fd5b5035919050565b60008060006060848603121561255957600080fd5b83359250602084013561256b816124ea565b9150604084013561257b816124ea565b809150509250925092565b6000815180845260005b818110156125ac57602081850181015186830182015201612590565b818111156125be576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006111416020830184612586565b6000806040838503121561261757600080fd5b823591506020830135612629816124ea565b809150509250929050565b60006020828403121561264657600080fd5b8135611141816124ea565b6fffffffffffffffffffffffffffffffff8116811461086857600080fd5b6000806040838503121561268257600080fd5b82359150602083013561262981612651565b6000602082840312156126a657600080fd5b8151611141816124ea565b6000602082840312156126c357600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561270b5761270b6126ca565b500390565b60008219821115612723576127236126ca565b500190565b60006fffffffffffffffffffffffffffffffff80831681851681830481118215151615612757576127576126ca565b02949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006fffffffffffffffffffffffffffffffff808416806127b2576127b2612760565b92169190910492915050565b60006fffffffffffffffffffffffffffffffff838116908316818110156127e7576127e76126ca565b039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006080828403121561285f57600080fd5b6040516080810181811067ffffffffffffffff821117156128a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405282516128b7816124ea565b81526020838101519082015260408301516128d181612651565b604082015260608301516128e481612651565b60608201529392505050565b6000826128ff576128ff612760565b500690565b6001600160a01b038416815267ffffffffffffffff831660208201526060604082015260006129366060830184612586565b9594505050505056fea164736f6c634300080f000a", } // ValidatorPoolABI is the input ABI used to generate the binding from. @@ -44,7 +44,7 @@ var ValidatorPoolABI = ValidatorPoolMetaData.ABI var ValidatorPoolBin = ValidatorPoolMetaData.Bin // DeployValidatorPool deploys a new Ethereum contract, binding an instance of ValidatorPool to it. -func DeployValidatorPool(auth *bind.TransactOpts, backend bind.ContractBackend, _l2OutputOracle common.Address, _portal common.Address, _securityCouncil common.Address, _trustedValidator common.Address, _requiredBondAmount *big.Int, _maxUnbond *big.Int, _roundDuration *big.Int) (common.Address, *types.Transaction, *ValidatorPool, error) { +func DeployValidatorPool(auth *bind.TransactOpts, backend bind.ContractBackend, _l2OutputOracle common.Address, _portal common.Address, _securityCouncil common.Address, _trustedValidator common.Address, _requiredBondAmount *big.Int, _maxUnbond *big.Int, _roundDuration *big.Int, _terminateOutputIndex *big.Int) (common.Address, *types.Transaction, *ValidatorPool, error) { parsed, err := ValidatorPoolMetaData.GetAbi() if err != nil { return common.Address{}, nil, nil, err @@ -53,7 +53,7 @@ func DeployValidatorPool(auth *bind.TransactOpts, backend bind.ContractBackend, return common.Address{}, nil, nil, errors.New("GetABI returned nil") } - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ValidatorPoolBin), backend, _l2OutputOracle, _portal, _securityCouncil, _trustedValidator, _requiredBondAmount, _maxUnbond, _roundDuration) + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ValidatorPoolBin), backend, _l2OutputOracle, _portal, _securityCouncil, _trustedValidator, _requiredBondAmount, _maxUnbond, _roundDuration, _terminateOutputIndex) if err != nil { return common.Address{}, nil, nil, err } @@ -450,6 +450,37 @@ func (_ValidatorPool *ValidatorPoolCallerSession) TAXNUMERATOR() (*big.Int, erro return _ValidatorPool.Contract.TAXNUMERATOR(&_ValidatorPool.CallOpts) } +// TERMINATEOUTPUTINDEX is a free data retrieval call binding the contract method 0x39111af8. +// +// Solidity: function TERMINATE_OUTPUT_INDEX() view returns(uint256) +func (_ValidatorPool *ValidatorPoolCaller) TERMINATEOUTPUTINDEX(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ValidatorPool.contract.Call(opts, &out, "TERMINATE_OUTPUT_INDEX") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// TERMINATEOUTPUTINDEX is a free data retrieval call binding the contract method 0x39111af8. +// +// Solidity: function TERMINATE_OUTPUT_INDEX() view returns(uint256) +func (_ValidatorPool *ValidatorPoolSession) TERMINATEOUTPUTINDEX() (*big.Int, error) { + return _ValidatorPool.Contract.TERMINATEOUTPUTINDEX(&_ValidatorPool.CallOpts) +} + +// TERMINATEOUTPUTINDEX is a free data retrieval call binding the contract method 0x39111af8. +// +// Solidity: function TERMINATE_OUTPUT_INDEX() view returns(uint256) +func (_ValidatorPool *ValidatorPoolCallerSession) TERMINATEOUTPUTINDEX() (*big.Int, error) { + return _ValidatorPool.Contract.TERMINATEOUTPUTINDEX(&_ValidatorPool.CallOpts) +} + // TRUSTEDVALIDATOR is a free data retrieval call binding the contract method 0x3ee4d4a3. // // Solidity: function TRUSTED_VALIDATOR() view returns(address) @@ -605,6 +636,37 @@ func (_ValidatorPool *ValidatorPoolCallerSession) GetPendingBond(_outputIndex *b return _ValidatorPool.Contract.GetPendingBond(&_ValidatorPool.CallOpts, _outputIndex, _challenger) } +// IsTerminated is a free data retrieval call binding the contract method 0xad36d6cc. +// +// Solidity: function isTerminated(uint256 _outputIndex) view returns(bool) +func (_ValidatorPool *ValidatorPoolCaller) IsTerminated(opts *bind.CallOpts, _outputIndex *big.Int) (bool, error) { + var out []interface{} + err := _ValidatorPool.contract.Call(opts, &out, "isTerminated", _outputIndex) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsTerminated is a free data retrieval call binding the contract method 0xad36d6cc. +// +// Solidity: function isTerminated(uint256 _outputIndex) view returns(bool) +func (_ValidatorPool *ValidatorPoolSession) IsTerminated(_outputIndex *big.Int) (bool, error) { + return _ValidatorPool.Contract.IsTerminated(&_ValidatorPool.CallOpts, _outputIndex) +} + +// IsTerminated is a free data retrieval call binding the contract method 0xad36d6cc. +// +// Solidity: function isTerminated(uint256 _outputIndex) view returns(bool) +func (_ValidatorPool *ValidatorPoolCallerSession) IsTerminated(_outputIndex *big.Int) (bool, error) { + return _ValidatorPool.Contract.IsTerminated(&_ValidatorPool.CallOpts, _outputIndex) +} + // IsValidator is a free data retrieval call binding the contract method 0xfacd743b. // // Solidity: function isValidator(address _addr) view returns(bool) diff --git a/kroma-bindings/bindings/validatorpool_more.go b/kroma-bindings/bindings/validatorpool_more.go index 2da7c7ab16..21183474d8 100644 --- a/kroma-bindings/bindings/validatorpool_more.go +++ b/kroma-bindings/bindings/validatorpool_more.go @@ -13,7 +13,7 @@ const ValidatorPoolStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract var ValidatorPoolStorageLayout = new(solc.StorageLayout) -var ValidatorPoolDeployedBin = "0x6080604052600436106101a05760003560e01c806370a08231116100e1578063ab91f1901161008a578063d38dc7ee11610064578063d38dc7ee1461053d578063d8fe76421461055d578063dd215c5d146105ad578063facd743b146105cd57600080fd5b8063ab91f190146104d1578063b7d636a514610501578063d0e30db01461053557600080fd5b80638f09ade4116100bb5780638f09ade414610468578063946765fd14610488578063a51c9ace146104bc57600080fd5b806370a08231146103e75780638129fc1c1461041d57806382dae3aa1461043257600080fd5b806336b834691161014e57806354fd4d501161012857806354fd4d50146103285780635a5447421461037e5780635df6a6bc1461039e5780636641ea08146103b357600080fd5b806336b83469146102bf5780633a549046146102df5780633ee4d4a3146102f457600080fd5b8063205c28781161017f578063205c2878146102495780632e1a7d4d1461026b578063360864171461028b57600080fd5b80621c2ff6146101a55780630f43a677146101f65780630ff754ea14610215575b600080fd5b3480156101b157600080fd5b506101d97f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561020257600080fd5b506036545b6040519081526020016101ed565b34801561022157600080fd5b506101d97f000000000000000000000000000000000000000000000000000000000000000081565b34801561025557600080fd5b5061026961026436600461233c565b6105fd565b005b34801561027757600080fd5b50610269610286366004612368565b610730565b34801561029757600080fd5b506101d97f000000000000000000000000000000000000000000000000000000000000000081565b3480156102cb57600080fd5b506102696102da366004612381565b6107e1565b3480156102eb57600080fd5b506101d9610a52565b34801561030057600080fd5b506101d97f000000000000000000000000000000000000000000000000000000000000000081565b34801561033457600080fd5b506103716040518060400160405280600581526020017f312e302e3100000000000000000000000000000000000000000000000000000081525081565b6040516101ed919061242e565b34801561038a57600080fd5b50610269610399366004612441565b610c10565b3480156103aa57600080fd5b50610269610eb9565b3480156103bf57600080fd5b506102077f000000000000000000000000000000000000000000000000000000000000000081565b3480156103f357600080fd5b50610207610402366004612471565b6001600160a01b031660009081526033602052604090205490565b34801561042957600080fd5b50610269610f38565b34801561043e57600080fd5b50610447601481565b6040516fffffffffffffffffffffffffffffffff90911681526020016101ed565b34801561047457600080fd5b50610447610483366004612441565b6110af565b34801561049457600080fd5b506102077f000000000000000000000000000000000000000000000000000000000000000081565b3480156104c857600080fd5b50610447606481565b3480156104dd57600080fd5b506104e8620186a081565b60405167ffffffffffffffff90911681526020016101ed565b34801561050d57600080fd5b506104477f000000000000000000000000000000000000000000000000000000000000000081565b61026961115e565b34801561054957600080fd5b506102696105583660046124ac565b61116a565b34801561056957600080fd5b5061057d610578366004612368565b611443565b6040805182516fffffffffffffffffffffffffffffffff90811682526020938401511692810192909252016101ed565b3480156105b957600080fd5b506102696105c8366004612441565b611562565b3480156105d957600080fd5b506105ed6105e8366004612471565b6118c8565b60405190151581526020016101ed565b61060561194e565b6001600160a01b0382166106865760405162461bcd60e51b815260206004820152603260248201527f56616c696461746f72506f6f6c3a2063616e6e6f74207769746864726177207460448201527f6f20746865207a65726f2061646472657373000000000000000000000000000060648201526084015b60405180910390fd5b61069033826119a7565b60006106ad835a8460405180602001604052806000815250611bf9565b9050806107225760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f72506f6f6c3a20455448207472616e73666572206661696c60448201527f6564000000000000000000000000000000000000000000000000000000000000606482015260840161067d565b5061072c60018055565b5050565b61073861194e565b61074233826119a7565b600061075f335a8460405180602001604052806000815250611bf9565b9050806107d45760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f72506f6f6c3a20455448207472616e73666572206661696c60448201527f6564000000000000000000000000000000000000000000000000000000000000606482015260840161067d565b506107de60018055565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561083f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086391906124d1565b6001600160a01b0316336001600160a01b0316146108e95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f7420436f6c60448201527f6f737365756d0000000000000000000000000000000000000000000000000000606482015260840161067d565b60008381526039602090815260408083206001600160a01b03861684529091529020546fffffffffffffffffffffffffffffffff16806109915760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a207468652070656e64696e6720626f6e642060448201527f646f6573206e6f74206578697374000000000000000000000000000000000000606482015260840161067d565b60008481526039602090815260408083206001600160a01b0387168452909152902080547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690556109f5826fffffffffffffffffffffffffffffffff8316611c19565b6040516fffffffffffffffffffffffffffffffff821681526001600160a01b03808416919085169086907f8c95336a279406edcc768d685e8eb6667368a77d840a188144b8e3719423198f9060200160405180910390a450505050565b6038546000906001600160a01b031615610beb5760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663dcec33486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ac6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aea91906124ee565b905060006001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663d1de856c610b28846001612536565b6040518263ffffffff1660e01b8152600401610b4691815260200190565b602060405180830381865afa158015610b63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8791906124ee565b9050804210610bd8576000610b9c824261254e565b90507f0000000000000000000000000000000000000000000000000000000000000000811115610bd6576001600160a01b03935050505090565b505b50506038546001600160a01b0316919050565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9291906124d1565b6001600160a01b0316336001600160a01b031614610d185760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f7420436f6c60448201527f6f737365756d0000000000000000000000000000000000000000000000000000606482015260840161067d565b60008281526034602052604090208054427001000000000000000000000000000000009091046fffffffffffffffffffffffffffffffff161015610dc45760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a20746865206f757470757420697320616c7260448201527f656164792066696e616c697a6564000000000000000000000000000000000000606482015260840161067d565b610e00827f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff166119a7565b60008381526039602090815260408083206001600160a01b0386168085529083529281902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000167f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16908117909155905190815285917f2904258f32adf74dd8f23ad6f17ff50209896039c8ee3d4728ff55bd05c4cf2a910160405180910390a3505050565b6000610ec3611d4d565b9050806107de5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f72506f6f6c3a206e6f20626f6e6420746861742063616e2060448201527f626520756e626f6e640000000000000000000000000000000000000000000000606482015260840161067d565b600054610100900460ff1615808015610f585750600054600160ff909116105b80610f725750303b158015610f72575060005460ff166001145b610fe45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161067d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561104257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b61104a611f6b565b80156107de57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b60008281526039602090815260408083206001600160a01b03851684529091528120546fffffffffffffffffffffffffffffffff16806111575760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a207468652070656e64696e6720626f6e642060448201527f646f6573206e6f74206578697374000000000000000000000000000000000000606482015260840161067d565b9392505050565b6111683334611c19565b565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112085760405162461bcd60e51b815260206004820152602b60248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f74204c324f60448201527f75747075744f7261636c65000000000000000000000000000000000000000000606482015260840161067d565b6000828152603460205260409020805470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16156112b15760405162461bcd60e51b815260206004820152603c60248201527f56616c696461746f72506f6f6c3a20626f6e64206f662074686520676976656e60448201527f206f757470757420696e64657820616c72656164792065786973747300000000606482015260840161067d565b6112b9611d4d565b506040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018490526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0ea09a890602401602060405180830381865afa15801561133b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135f91906124d1565b905061139d817f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff166119a7565b7f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff9081167001000000000000000000000000000000009185169182028117845560408051918252602082019290925285916001600160a01b038416917f5ca130257b8f76f72ad2965efcbe166f3918d820e4a49956e70081ea311f97c4910160405180910390a361143d611fe8565b50505050565b6040805180820190915260008082526020820152600082815260346020526040902080546fffffffffffffffffffffffffffffffff16158015906114ad5750805470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1615155b61151f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2074686520626f6e6420646f6573206e6f7460448201527f2065786973740000000000000000000000000000000000000000000000000000606482015260840161067d565b6040805180820190915290546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000090910416602082015292915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e491906124d1565b6001600160a01b0316336001600160a01b03161461166a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f7420436f6c60448201527f6f737365756d0000000000000000000000000000000000000000000000000000606482015260840161067d565b60008281526034602052604090208054427001000000000000000000000000000000009091046fffffffffffffffffffffffffffffffff1610156117165760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a20746865206f757470757420697320616c7260448201527f656164792066696e616c697a6564000000000000000000000000000000000000606482015260840161067d565b60008381526039602090815260408083206001600160a01b03861684529091529020546fffffffffffffffffffffffffffffffff16806117be5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a207468652070656e64696e6720626f6e642060448201527f646f6573206e6f74206578697374000000000000000000000000000000000000606482015260840161067d565b600060646117cd601484612565565b6117d791906125cc565b905060006117e582846125fb565b60008781526039602090815260408083206001600160a01b038a811680865291845282852080547fffffffffffffffffffffffffffffffff000000000000000000000000000000009081169091558a549081166fffffffffffffffffffffffffffffffff91821688018216178b557f00000000000000000000000000000000000000000000000000000000000000009091168552603384529382902080548886160190559051928416835292935088917f383f9b8b5a1fc2ec555726eb895621a312042e18b764135fa12ef1a520ad30db910160405180910390a3505050505050565b60365460009081036118dc57506000919050565b6001600160a01b0382166118f257506000919050565b6001600160a01b03821660008181526037602052604090205460368054919291839081106119225761192261262c565b6000918252602090912001546001600160a01b0316149392505050565b6001600160a01b03163b151590565b6002600154036119a05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161067d565b6002600155565b6001600160a01b03821660009081526033602052604090205481811015611a355760405162461bcd60e51b8152602060048201526024808201527f56616c696461746f72506f6f6c3a20696e73756666696369656e742062616c6160448201527f6e63657300000000000000000000000000000000000000000000000000000000606482015260840161067d565b611a3f828261254e565b90507f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff1681108015611a865750611a86836118c8565b15611bd957603654600090611a9d9060019061254e565b90508015611b55576001600160a01b0384166000908152603760205260408120546036805491929184908110611ad557611ad561262c565b600091825260209091200154603680546001600160a01b039092169250829184908110611b0457611b0461262c565b600091825260208083209190910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03948516179055929091168152603790915260409020555b6001600160a01b0384166000908152603760205260408120556036805480611b7f57611b7f61265b565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055505b6001600160a01b0390921660009081526033602052604090209190915550565b600080600080845160208601878a8af19695505050505050565b60018055565b6001600160a01b038216600090815260336020526040812054611c3d908390612536565b90507f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff168110158015611c875750611c85836118c8565b155b15611bd9577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614611bd957603680546001600160a01b03949094166000818152603760209081526040808320889055600188019094557f4a11f94e20a93c79f6ec743a1954ec4fc2c08429ae2122118bf234b2185c81b890960180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690921790915560339094529092209190915550565b60355460408051608081018252600080825260208201819052918101829052606081018290529091908290819060005b7f0000000000000000000000000000000000000000000000000000000000000000811015611f4857600085815260346020526040902080546fffffffffffffffffffffffffffffffff80821696509194507001000000000000000000000000000000009004164210801590611e0457506000846fffffffffffffffffffffffffffffffff16115b15611f485760008581526034602052604080822091909155517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018690527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa158015611e98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebc919061268a565b9150611ede8260000151856fffffffffffffffffffffffffffffffff16611c19565b81516040516fffffffffffffffffffffffffffffffff861681526001600160a01b039091169086907f7047a0fb8bfae78c0ebbd4117437945bb85240453235ac4fd2e55712eb5bf0c39060200160405180910390a3611f3c826121b6565b60019485019401611d7d565b8015611f5f57505050603591909155506001919050565b60009550505050505090565b600054610100900460ff16611c135760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161067d565b6036548015801590611ffc57506000603554115b1561218b5760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a25ae5576001603554612041919061254e565b6040518263ffffffff1660e01b815260040161205f91815260200190565b608060405180830381865afa15801561207c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a0919061268a565b905060008282602001514341446001436120ba919061254e565b6040805160208101969096528501939093527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606092831b1691840191909152607483015240609482015260b4016040516020818303038152906040528051906020012060001c61212b919061272d565b9050603681815481106121405761214061262c565b600091825260209091200154603880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216919091179055506107de9050565b603880547fffffffffffffffffffffffff000000000000000000000000000000000000000016905550565b805160608201516040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263c30af3889273420000000000000000000000000000000000000892620186a0927f21670f220000000000000000000000000000000000000000000000000000000092612260926024016001600160a01b039290921682526fffffffffffffffffffffffffffffffff16602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b90921682526122f2939291600401612741565b600060405180830381600087803b15801561230c57600080fd5b505af1158015612320573d6000803e3d6000fd5b5050505050565b6001600160a01b03811681146107de57600080fd5b6000806040838503121561234f57600080fd5b823561235a81612327565b946020939093013593505050565b60006020828403121561237a57600080fd5b5035919050565b60008060006060848603121561239657600080fd5b8335925060208401356123a881612327565b915060408401356123b881612327565b809150509250925092565b6000815180845260005b818110156123e9576020818501810151868301820152016123cd565b818111156123fb576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061115760208301846123c3565b6000806040838503121561245457600080fd5b82359150602083013561246681612327565b809150509250929050565b60006020828403121561248357600080fd5b813561115781612327565b6fffffffffffffffffffffffffffffffff811681146107de57600080fd5b600080604083850312156124bf57600080fd5b8235915060208301356124668161248e565b6000602082840312156124e357600080fd5b815161115781612327565b60006020828403121561250057600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561254957612549612507565b500190565b60008282101561256057612560612507565b500390565b60006fffffffffffffffffffffffffffffffff8083168185168183048111821515161561259457612594612507565b02949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006fffffffffffffffffffffffffffffffff808416806125ef576125ef61259d565b92169190910492915050565b60006fffffffffffffffffffffffffffffffff8381169083168181101561262457612624612507565b039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006080828403121561269c57600080fd5b6040516080810181811067ffffffffffffffff821117156126e6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405282516126f481612327565b815260208381015190820152604083015161270e8161248e565b604082015260608301516127218161248e565b60608201529392505050565b60008261273c5761273c61259d565b500690565b6001600160a01b038416815267ffffffffffffffff8316602082015260606040820152600061277360608301846123c3565b9594505050505056fea164736f6c634300080f000a" +var ValidatorPoolDeployedBin = "0x6080604052600436106101b65760003560e01c806370a08231116100ec578063ad36d6cc1161008a578063d38dc7ee11610064578063d38dc7ee146105d7578063d8fe7642146105f7578063dd215c5d14610647578063facd743b1461066757600080fd5b8063ad36d6cc1461054b578063b7d636a51461059b578063d0e30db0146105cf57600080fd5b80638f09ade4116100c65780638f09ade4146104b2578063946765fd146104d2578063a51c9ace14610506578063ab91f1901461051b57600080fd5b806370a08231146104315780638129fc1c1461046757806382dae3aa1461047c57600080fd5b806339111af81161015957806354fd4d501161013357806354fd4d50146103725780635a544742146103c85780635df6a6bc146103e85780636641ea08146103fd57600080fd5b806339111af8146102f55780633a549046146103295780633ee4d4a31461033e57600080fd5b8063205c287811610195578063205c28781461025f5780632e1a7d4d1461028157806336086417146102a157806336b83469146102d557600080fd5b80621c2ff6146101bb5780630f43a6771461020c5780630ff754ea1461022b575b600080fd5b3480156101c757600080fd5b506101ef7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561021857600080fd5b506036545b604051908152602001610203565b34801561023757600080fd5b506101ef7f000000000000000000000000000000000000000000000000000000000000000081565b34801561026b57600080fd5b5061027f61027a3660046124ff565b610687565b005b34801561028d57600080fd5b5061027f61029c36600461252b565b6107ba565b3480156102ad57600080fd5b506101ef7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102e157600080fd5b5061027f6102f0366004612544565b61086b565b34801561030157600080fd5b5061021d7f000000000000000000000000000000000000000000000000000000000000000081565b34801561033557600080fd5b506101ef610adc565b34801561034a57600080fd5b506101ef7f000000000000000000000000000000000000000000000000000000000000000081565b34801561037e57600080fd5b506103bb6040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161020391906125f1565b3480156103d457600080fd5b5061027f6103e3366004612604565b610bfa565b3480156103f457600080fd5b5061027f610ea3565b34801561040957600080fd5b5061021d7f000000000000000000000000000000000000000000000000000000000000000081565b34801561043d57600080fd5b5061021d61044c366004612634565b6001600160a01b031660009081526033602052604090205490565b34801561047357600080fd5b5061027f610f22565b34801561048857600080fd5b50610491601481565b6040516fffffffffffffffffffffffffffffffff9091168152602001610203565b3480156104be57600080fd5b506104916104cd366004612604565b611099565b3480156104de57600080fd5b5061021d7f000000000000000000000000000000000000000000000000000000000000000081565b34801561051257600080fd5b50610491606481565b34801561052757600080fd5b50610532620186a081565b60405167ffffffffffffffff9091168152602001610203565b34801561055757600080fd5b5061058b61056636600461252b565b7f00000000000000000000000000000000000000000000000000000000000000001090565b6040519015158152602001610203565b3480156105a757600080fd5b506104917f000000000000000000000000000000000000000000000000000000000000000081565b61027f611148565b3480156105e357600080fd5b5061027f6105f236600461266f565b61129a565b34801561060357600080fd5b5061061761061236600461252b565b611573565b6040805182516fffffffffffffffffffffffffffffffff9081168252602093840151169281019290925201610203565b34801561065357600080fd5b5061027f610662366004612604565b611692565b34801561067357600080fd5b5061058b610682366004612634565b6119f8565b61068f611a7e565b6001600160a01b0382166107105760405162461bcd60e51b815260206004820152603260248201527f56616c696461746f72506f6f6c3a2063616e6e6f74207769746864726177207460448201527f6f20746865207a65726f2061646472657373000000000000000000000000000060648201526084015b60405180910390fd5b61071a3382611ad7565b6000610737835a8460405180602001604052806000815250611d29565b9050806107ac5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f72506f6f6c3a20455448207472616e73666572206661696c60448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610707565b506107b660018055565b5050565b6107c2611a7e565b6107cc3382611ad7565b60006107e9335a8460405180602001604052806000815250611d29565b90508061085e5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f72506f6f6c3a20455448207472616e73666572206661696c60448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610707565b5061086860018055565b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ed9190612694565b6001600160a01b0316336001600160a01b0316146109735760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f7420436f6c60448201527f6f737365756d00000000000000000000000000000000000000000000000000006064820152608401610707565b60008381526039602090815260408083206001600160a01b03861684529091529020546fffffffffffffffffffffffffffffffff1680610a1b5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a207468652070656e64696e6720626f6e642060448201527f646f6573206e6f742065786973740000000000000000000000000000000000006064820152608401610707565b60008481526039602090815260408083206001600160a01b0387168452909152902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055610a7f826fffffffffffffffffffffffffffffffff8316611d49565b6040516fffffffffffffffffffffffffffffffff821681526001600160a01b03808416919085169086907f8c95336a279406edcc768d685e8eb6667368a77d840a188144b8e3719423198f9060200160405180910390a450505050565b6038546000906001600160a01b031615610bd55760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166380446bd26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7491906126b1565b9050804210610bc4576000610b8982426126f9565b90507f0000000000000000000000000000000000000000000000000000000000000000811115610bc2576001600160a01b039250505090565b505b50506038546001600160a01b031690565b507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7c9190612694565b6001600160a01b0316336001600160a01b031614610d025760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f7420436f6c60448201527f6f737365756d00000000000000000000000000000000000000000000000000006064820152608401610707565b60008281526034602052604090208054427001000000000000000000000000000000009091046fffffffffffffffffffffffffffffffff161015610dae5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a20746865206f757470757420697320616c7260448201527f656164792066696e616c697a65640000000000000000000000000000000000006064820152608401610707565b610dea827f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16611ad7565b60008381526039602090815260408083206001600160a01b0386168085529083529281902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000167f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16908117909155905190815285917f2904258f32adf74dd8f23ad6f17ff50209896039c8ee3d4728ff55bd05c4cf2a910160405180910390a3505050565b6000610ead611e7d565b9050806108685760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f72506f6f6c3a206e6f20626f6e6420746861742063616e2060448201527f626520756e626f6e6400000000000000000000000000000000000000000000006064820152608401610707565b600054610100900460ff1615808015610f425750600054600160ff909116105b80610f5c5750303b158015610f5c575060005460ff166001145b610fce5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610707565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561102c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b61103461212e565b801561086857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b60008281526039602090815260408083206001600160a01b03851684529091528120546fffffffffffffffffffffffffffffffff16806111415760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a207468652070656e64696e6720626f6e642060448201527f646f6573206e6f742065786973740000000000000000000000000000000000006064820152608401610707565b9392505050565b6111737f00000000000000000000000000000000000000000000000000000000000000006001612710565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636abcf5636040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f591906126b1565b1061128e5760405162461bcd60e51b815260206004820152604260248201527f56616c696461746f72506f6f6c3a206f6e6c792063616e206465706f7369742060448201527f746f2056616c696461746f72506f6f6c206265666f7265207465726d696e617460648201527f6564000000000000000000000000000000000000000000000000000000000000608482015260a401610707565b6112983334611d49565b565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113385760405162461bcd60e51b815260206004820152602b60248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f74204c324f60448201527f75747075744f7261636c650000000000000000000000000000000000000000006064820152608401610707565b6000828152603460205260409020805470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16156113e15760405162461bcd60e51b815260206004820152603c60248201527f56616c696461746f72506f6f6c3a20626f6e64206f662074686520676976656e60448201527f206f757470757420696e64657820616c726561647920657869737473000000006064820152608401610707565b6113e9611e7d565b506040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018490526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b0ea09a890602401602060405180830381865afa15801561146b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148f9190612694565b90506114cd817f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff16611ad7565b7f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff9081167001000000000000000000000000000000009185169182028117845560408051918252602082019290925285916001600160a01b038416917f5ca130257b8f76f72ad2965efcbe166f3918d820e4a49956e70081ea311f97c4910160405180910390a361156d6121ab565b50505050565b6040805180820190915260008082526020820152600082815260346020526040902080546fffffffffffffffffffffffffffffffff16158015906115dd5750805470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1615155b61164f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2074686520626f6e6420646f6573206e6f7460448201527f20657869737400000000000000000000000000000000000000000000000000006064820152608401610707565b6040805180820190915290546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000090910416602082015292915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117149190612694565b6001600160a01b0316336001600160a01b03161461179a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f7420436f6c60448201527f6f737365756d00000000000000000000000000000000000000000000000000006064820152608401610707565b60008281526034602052604090208054427001000000000000000000000000000000009091046fffffffffffffffffffffffffffffffff1610156118465760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a20746865206f757470757420697320616c7260448201527f656164792066696e616c697a65640000000000000000000000000000000000006064820152608401610707565b60008381526039602090815260408083206001600160a01b03861684529091529020546fffffffffffffffffffffffffffffffff16806118ee5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a207468652070656e64696e6720626f6e642060448201527f646f6573206e6f742065786973740000000000000000000000000000000000006064820152608401610707565b600060646118fd601484612728565b611907919061278f565b9050600061191582846127be565b60008781526039602090815260408083206001600160a01b038a811680865291845282852080547fffffffffffffffffffffffffffffffff000000000000000000000000000000009081169091558a549081166fffffffffffffffffffffffffffffffff91821688018216178b557f00000000000000000000000000000000000000000000000000000000000000009091168552603384529382902080548886160190559051928416835292935088917f383f9b8b5a1fc2ec555726eb895621a312042e18b764135fa12ef1a520ad30db910160405180910390a3505050505050565b6036546000908103611a0c57506000919050565b6001600160a01b038216611a2257506000919050565b6001600160a01b0382166000818152603760205260409020546036805491929183908110611a5257611a526127ef565b6000918252602090912001546001600160a01b0316149392505050565b6001600160a01b03163b151590565b600260015403611ad05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610707565b6002600155565b6001600160a01b03821660009081526033602052604090205481811015611b655760405162461bcd60e51b8152602060048201526024808201527f56616c696461746f72506f6f6c3a20696e73756666696369656e742062616c6160448201527f6e636573000000000000000000000000000000000000000000000000000000006064820152608401610707565b611b6f82826126f9565b90507f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff1681108015611bb65750611bb6836119f8565b15611d0957603654600090611bcd906001906126f9565b90508015611c85576001600160a01b0384166000908152603760205260408120546036805491929184908110611c0557611c056127ef565b600091825260209091200154603680546001600160a01b039092169250829184908110611c3457611c346127ef565b600091825260208083209190910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03948516179055929091168152603790915260409020555b6001600160a01b0384166000908152603760205260408120556036805480611caf57611caf61281e565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055505b6001600160a01b0390921660009081526033602052604090209190915550565b600080600080845160208601878a8af19695505050505050565b60018055565b6001600160a01b038216600090815260336020526040812054611d6d908390612710565b90507f00000000000000000000000000000000000000000000000000000000000000006fffffffffffffffffffffffffffffffff168110158015611db75750611db5836119f8565b155b15611d09577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614611d0957603680546001600160a01b03949094166000818152603760209081526040808320889055600188019094557f4a11f94e20a93c79f6ec743a1954ec4fc2c08429ae2122118bf234b2185c81b890960180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690921790915560339094529092209190915550565b60355460408051608081018252600080825260208201819052918101829052606081018290529091908290819060005b7f000000000000000000000000000000000000000000000000000000000000000081101561207857600085815260346020526040902080546fffffffffffffffffffffffffffffffff80821696509194507001000000000000000000000000000000009004164210801590611f3457506000846fffffffffffffffffffffffffffffffff16115b156120785760008581526034602052604080822091909155517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018690527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a25ae55790602401608060405180830381865afa158015611fc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fec919061284d565b915061200e8260000151856fffffffffffffffffffffffffffffffff16611d49565b81516040516fffffffffffffffffffffffffffffffff861681526001600160a01b039091169086907f7047a0fb8bfae78c0ebbd4117437945bb85240453235ac4fd2e55712eb5bf0c39060200160405180910390a361206c82612379565b60019485019401611ead565b80156121225760358590556040517f9902cdc0000000000000000000000000000000000000000000000000000000008152600481018690527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639902cdc090602401600060405180830381600087803b1580156120fe57600080fd5b505af1158015612112573d6000803e3d6000fd5b5050505060019550505050505090565b60009550505050505090565b600054610100900460ff16611d435760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610707565b60365480158015906121bf57506000603554115b1561234e5760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a25ae557600160355461220491906126f9565b6040518263ffffffff1660e01b815260040161222291815260200190565b608060405180830381865afa15801561223f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612263919061284d565b9050600082826020015143414460014361227d91906126f9565b6040805160208101969096528501939093527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606092831b1691840191909152607483015240609482015260b4016040516020818303038152906040528051906020012060001c6122ee91906128f0565b905060368181548110612303576123036127ef565b600091825260209091200154603880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216919091179055506108689050565b603880547fffffffffffffffffffffffff000000000000000000000000000000000000000016905550565b805160608201516040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263c30af3889273420000000000000000000000000000000000000892620186a0927f21670f220000000000000000000000000000000000000000000000000000000092612423926024016001600160a01b039290921682526fffffffffffffffffffffffffffffffff16602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b90921682526124b5939291600401612904565b600060405180830381600087803b1580156124cf57600080fd5b505af11580156124e3573d6000803e3d6000fd5b5050505050565b6001600160a01b038116811461086857600080fd5b6000806040838503121561251257600080fd5b823561251d816124ea565b946020939093013593505050565b60006020828403121561253d57600080fd5b5035919050565b60008060006060848603121561255957600080fd5b83359250602084013561256b816124ea565b9150604084013561257b816124ea565b809150509250925092565b6000815180845260005b818110156125ac57602081850181015186830182015201612590565b818111156125be576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006111416020830184612586565b6000806040838503121561261757600080fd5b823591506020830135612629816124ea565b809150509250929050565b60006020828403121561264657600080fd5b8135611141816124ea565b6fffffffffffffffffffffffffffffffff8116811461086857600080fd5b6000806040838503121561268257600080fd5b82359150602083013561262981612651565b6000602082840312156126a657600080fd5b8151611141816124ea565b6000602082840312156126c357600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561270b5761270b6126ca565b500390565b60008219821115612723576127236126ca565b500190565b60006fffffffffffffffffffffffffffffffff80831681851681830481118215151615612757576127576126ca565b02949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006fffffffffffffffffffffffffffffffff808416806127b2576127b2612760565b92169190910492915050565b60006fffffffffffffffffffffffffffffffff838116908316818110156127e7576127e76126ca565b039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006080828403121561285f57600080fd5b6040516080810181811067ffffffffffffffff821117156128a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405282516128b7816124ea565b81526020838101519082015260408301516128d181612651565b604082015260608301516128e481612651565b60608201529392505050565b6000826128ff576128ff612760565b500690565b6001600160a01b038416815267ffffffffffffffff831660208201526060604082015260006129366060830184612586565b9594505050505056fea164736f6c634300080f000a" func init() { diff --git a/kroma-bindings/bindings/zkverifier_more.go b/kroma-bindings/bindings/zkverifier_more.go index aedd57db34..f80fc5287e 100644 --- a/kroma-bindings/bindings/zkverifier_more.go +++ b/kroma-bindings/bindings/zkverifier_more.go @@ -15,6 +15,7 @@ var ZKVerifierStorageLayout = new(solc.StorageLayout) var ZKVerifierDeployedBin = "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80634292dc3e1461003b57806354fd4d5014610063575b600080fd5b61004e61004936600461576f565b6100ac565b60405190151581526020015b60405180910390f35b61009f6040518060400160405280600581526020017f302e312e3500000000000000000000000000000000000000000000000000000081525081565b60405161005a91906157e3565b60006100b661560c565b848460008181106100c9576100c9615856565b9050602002013570ffffffffffffffffffffffffffffffffff16816000600681106100f6576100f6615856565b602002015260888585600181811061011057610110615856565b90506020020135600116901b60888686600081811061013157610131615856565b90506020020135901c61014491906158b4565b60208201528484600281811061015c5761015c615856565b9050602002013570ffffffffffffffffffffffffffffffffff168160026006811061018957610189615856565b60200201526088858560038181106101a3576101a3615856565b90506020020135600116901b6088868660028181106101c4576101c4615856565b90506020020135901c6101d791906158b4565b606080830191909152608084811c908301526fffffffffffffffffffffffffffffffff841660a08301526040805160028082529281019091526000918291829182918291816020015b60408051808201909152600080825260208201528152602001906001900390816102205750506040805160028082526060820190925291925060009190602082015b61026a61562a565b81526020019060019003908161026257905050905061028a8d8d896104fb565b85519399509097509095509350869083906000906102aa576102aa615856565b6020026020010151600001818152505083826000815181106102ce576102ce615856565b6020026020010151602001818152505084826001815181106102f2576102f2615856565b60200260200101516000018181525050828260018151811061031657610316615856565b6020026020010151602001818152505061032e614a63565b8160008151811061034157610341615856565b6020026020010181905250610354614b0e565b8160018151811061036757610367615856565b602002602001018190525061037c8282614bb5565b6103905760009750505050505050506104f2565b8a8a60008181106103a3576103a3615856565b90506020020135826000815181106103bd576103bd615856565b6020908102919091010151528a8a60018181106103dc576103dc615856565b90506020020135826000815181106103f6576103f6615856565b602002602001015160200181815250508a8a600281811061041957610419615856565b905060200201358260018151811061043357610433615856565b6020908102919091010151528a8a600381811061045257610452615856565b905060200201358260018151811061046c5761046c615856565b60200260200101516020018181525050610484614a63565b8160008151811061049757610497615856565b60200260200101819052506104aa614b0e565b816001815181106104bd576104bd615856565b60200260200101819052506104d28282614bb5565b6104e65760009750505050505050506104f2565b60019750505050505050505b95945050505050565b60008060008061050961564f565b61051161566e565b6000806105667f2754b04f3f510d0e86a0d0e811f0fc16f92b722514e1729066d2abf90811d6f27f1816b0f9909a5a979bd34c559e57b4096bee5cce7eb668bc0a9805677f40dc858b845b6020020151614e89565b90925090506105c07f174fa57071f8f6e53fcb31a5ecc33274ec76e4e186eeb0b64255d2f314cd50b27f1c399365e85e4de2761ebcf350da85ff4518cc82f7cef64a477a7a5fd11d4a448b60015b60200201518585614eef565b90925090506106127f259a4d5cd83279b6dc9ca2008b669f82e91f23804e2524c5087a2452d52c33bd7f303abddb7ae0f35e3a6bd39314b347c3c3a433f72833dda1998ad2176258baa38b60026105b4565b90925090506106647f252b158900f31a7c0c00b924e7d3c8d61a60c5e9fd2b83251ba73d1dc0b680f57f29c8c2b3f0d74267bc2b0f9f3568838cdb0eee4719391790d93d0015c00ce5af8b60036105b4565b90925090506106b67f0c25f9f3c38b6a128d7d38c5625a3976d389b5f9f33098bb419968e4d18e150e7f21fb777462c7f4af71940423babc7f882f0c97be9620ef84f6f11974ee0edb8e8b60046105b4565b90925090506107087f2280a0fd7dbf95c450830906ffc607a373d5b9b56b9101138e925ad557eb355a7f0697ab7e9a5377e2759ab6d1283301ccae9c72bad14946a9513ee19be1ec825e8b60056105b4565b6020860152845261073b7f0000000000000000000000000000000000000000000000000000000000000000846000614f3b565b8351602085015161074f9190856002614f87565b600091505b600482116107ed576107db8b8b61076c8560026158fb565b6107779060006158b4565b81811061078657610786615856565b905060200201358c8c85600261079c91906158fb565b6107a79060016158b4565b8181106107b6576107b6615856565b90506020020135858560036107cb91906158fb565b6107d69060056158b4565b614f87565b816107e581615938565b925050610754565b6107f8836014614ff7565b6040850152600091505b600d8211610896576108848b8b61081a8560026158fb565b61082590600a6158b4565b81811061083457610834615856565b905060200201358c8c85600261084a91906158fb565b61085590600b6158b4565b81811061086457610864615856565b905060200201358585600361087991906158fb565b6107d69060016158b4565b8161088e81615938565b925050610802565b6108a183602b614ff7565b60608501526108b1836001614ff7565b6080850152600091505b600982116109205761090e8b8b6108d38560026158fb565b6108de9060266158b4565b8181106108ed576108ed615856565b905060200201358c8c85600261090391906158fb565b6108559060276158b4565b8161091881615938565b9250506108bb565b61092b83601f614ff7565b60a0850152600091505b6003821161099a576109888b8b61094d8560026158fb565b61095890603a6158b4565b81811061096757610967615856565b905060200201358c8c85600261097d91906158fb565b61085590603b6158b4565b8161099281615938565b925050610935565b6109a583600d614ff7565b60c0850152600091505b60468211610a1857610a068b8b6109c78560016158fb565b6109d29060426158b4565b8181106109e1576109e1615856565b90506020020135848460026109f691906158fb565b610a019060016158b4565b614f3b565b81610a1081615938565b9250506109af565b610a2383608f614ff7565b60e0850152600091505b60038211610a9257610a808b8b610a458560026158fb565b610a509060896158b4565b818110610a5f57610a5f615856565b905060200201358c8c856002610a7591906158fb565b61085590608a6158b4565b81610a8a81615938565b925050610a2d565b610a9d83600d614ff7565b61010085015260c0840151600080516020615a46833981519152907f1dba8b5bdd64ef6ce29a9039aca3c0e524395c43b9227b96c75090cc6cc7ec97900961012085015260c0840151600080516020615a46833981519152907f24a1fcd63e9f03b27281db85fe631ec8e5c466f8178a4ee94d4942b7ccd90e1c900961014085015260c0840151600080516020615a46833981519152907f20bab6e5f766b4edf82399e9c5ff0e40d4b6875321a3d8020e18521d8f5c7241900961016085015260c0840151610b70906304000000615059565b610180850152600080516020615a46833981519152610b90600182615970565b610180860151086101a08501819052600080516020615a46833981519152907f30644e66c81e03716be83b486d6feabcc7ddd0fe6cbf5e72d585d142f7829b05096101c0850152600080516020615a46833981519152610bf1600182615970565b60c0860151089150610c0b84600e5b6020020151836150c0565b6101c08501526101a0840151600080516020615a46833981519152907f07baaa5b7af9cf52cd226bc56865f0f99ef8fcd4219060f09f43e9a148b5ab68096101e0850152600080516020615a46833981519152610c887f20bab6e5f766b4edf82399e9c5ff0e40d4b6875321a3d8020e18521d8f5c724182615970565b60c0860151089150610c9b84600f610c00565b6101e08501526101a0840151600080516020615a46833981519152907f1c699f652457365bf2fc4fa2c5c63d6c4349b03cb46d633d7a2655c5da4b900a09610200850152600080516020615a46833981519152610d187f19277f31ecb5bfe8604677099c09556812b0b5c50cceb2b584098183a5a6c5c882615970565b60c0860151089150610d2b846010610c00565b6102008501526101a0840151600080516020615a46833981519152907f205cdbaf03903a5c23e60eef0df90673bc65a25762694c501e3281153b4e588a09610220850152600080516020615a46833981519152610da87f082a7bd4c0a7e4352229d332c27a160da18f0d7c651f3047df41b80345532f6e82615970565b60c0860151089150610dbb846011610c00565b6102208501526101a0840151600080516020615a46833981519152907f27db73b1a831278e143aab90091db38afdea3294c4ba05d1c697a392eb09cc7909610240850152600080516020615a46833981519152610e387f26501ebfe559ea5826f023d3e76e4b66f170cd940408eb5590a4075c80b498d682615970565b60c0860151089150610e4b846012610c00565b6102408501526101a0840151600080516020615a46833981519152907f0204822d629ab653697f028f5fa17d23ac2ba08c60c7112d98ebd28f325f0af609610260850152600080516020615a46833981519152610ec87f0d5eb4c216db2c3262de3f6a2ef71a9be95ff21a7a1a50ed069d6131e7d54e5f82615970565b60c0860151089150610edb846013610c00565b6102608501526101a0840151600080516020615a46833981519152907f2622622a60c0d9327ccf066a0f1fce13c48601b976affd1f41c2a72a9f77da6409610280850152600080516020615a46833981519152610f587f24a1fcd63e9f03b27281db85fe631ec8e5c466f8178a4ee94d4942b7ccd90e1c82615970565b60c0860151089150610f6b846014610c00565b6102808501526102008401516101e0850151600080516020615a468339815191529190089150600080516020615a46833981519152846011602002015183089150600080516020615a46833981519152846012602002015183089150600080516020615a46833981519152846013602002015183086101e085015261103c8b8b604a818110610ffc57610ffc615856565b905060200201358c8c604881811061101657611016615856565b905060200201358d8d604981811061103057611030615856565b905060200201356150f0565b915061107b8b8b604b81811061105457611054615856565b905060200201358c8c604381811061106e5761106e615856565b90506020020135846150f0565b91506110ad8b8b604c81811061109357611093615856565b905060200201358c8c604481811061106e5761106e615856565b91506110df8b8b604d8181106110c5576110c5615856565b905060200201358c8c604581811061106e5761106e615856565b91506111118b8b604e8181106110f7576110f7615856565b905060200201358c8c604681811061106e5761106e615856565b91506111438b8b604f81811061112957611129615856565b905060200201358c8c604781811061106e5761106e615856565b610200850152600080516020615a468339815191528b8b604481811061116b5761116b615856565b905060200201358c8c604381811061118557611185615856565b905060200201350991506111ca8b8b60508181106111a5576111a5615856565b9050602002013583866010605481106111c0576111c0615856565b60200201516150f0565b610200850152600080516020615a468339815191528b8b60468181106111f2576111f2615856565b905060200201358c8c604581811061120c5761120c615856565b9050602002013509915061122c8b8b60518181106111a5576111a5615856565b610200850152600080516020615a468339815191528b8b606181811061125457611254615856565b90506020020135600080516020615a468339815191526112749190615970565b6001089150600080516020615a468339815191528285600e602002015109610220850152600080516020615a468339815191528b8b60648181106112ba576112ba615856565b905060200201358c8c60648181106112d4576112d4615856565b90506020020135099150600080516020615a468339815191528b8b606481811061130057611300615856565b90506020020135600080516020615a468339815191526113209190615970565b83089150600080516020615a4683398151915282856014602002015109610240850152600080516020615a468339815191528b8b606381811061136557611365615856565b90506020020135600080516020615a468339815191526113859190615970565b8c8c606481811061139857611398615856565b90506020020135089150600080516020615a4683398151915284600e6020020151830961026085015260c08401516060850151600080516020615a468339815191529190096102a08501526101e0840151610280850151600080516020615a468339815191529190089150600080516020615a4683398151915261142a83600080516020615a46833981519152615970565b6001086101e08501526080840151600080516020615a46833981519152908c8c604381811061145b5761145b615856565b90506020020135086102c08501526114a68b8b605b81811061147f5761147f615856565b905060200201358560036054811061149957611499615856565b60200201518660166111c0565b9150600080516020615a468339815191528b8b60628181106114ca576114ca615856565b9050602002013583096102e08501526102a08401516102c0850151600080516020615a468339815191529190089150600080516020615a468339815191528b8b606181811061151b5761151b615856565b9050602002013583096102c08501526102a0840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096103008501526080840151600080516020615a46833981519152908c8c604481811061159057611590615856565b90506020020135086103208501526115db8b8b605c8181106115b4576115b4615856565b90506020020135856003605481106115ce576115ce615856565b60200201518660196111c0565b9150600080516020615a46833981519152846017602002015183096102e0850152610300840151610320850151600080516020615a468339815191529190089150600080516020615a46833981519152846016602002015183096102c0850152610300840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096103008501526080840151600080516020615a46833981519152908c8c60458181106116a1576116a1615856565b90506020020135086103208501526116c58b8b605d8181106115b4576115b4615856565b9150600080516020615a46833981519152846017602002015183096102e0850152610300840151610320850151600080516020615a468339815191529190089150600080516020615a46833981519152846016602002015183096102c0850152610300840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096103008501526102c0840151600080516020615a46833981519152906117839082615970565b6102e0860151089150600080516020615a4683398151915284600f602002015183096102c08501526102a0840151600080516020615a46833981519152907f18afdf23e9bd9302673fc1e076a492d4d65bd18ebc4d854ed189139bab313e5290096102a08501526080840151600080516020615a46833981519152908c8c604681811061181257611812615856565b90506020020135086102e085015261185d8b8b605e81811061183657611836615856565b905060200201358560036054811061185057611850615856565b60200201518660176111c0565b9150600080516020615a468339815191528b8b606581811061188157611881615856565b9050602002013583096103008501526102a08401516102e0850151600080516020615a468339815191529190089150600080516020615a468339815191528b8b60648181106118d2576118d2615856565b9050602002013583096102e08501526102a0840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096102a08501526080840151600080516020615a46833981519152908c8c604781811061194757611947615856565b905060200201350861032085015261196b8b8b605f8181106115b4576115b4615856565b9150600080516020615a46833981519152846018602002015183096103008501526102a0840151610320850151600080516020615a468339815191529190089150600080516020615a46833981519152846017602002015183096102e08501526102a0840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096102a08501526080840151600080516020615a46833981519152908c8c6042818110611a3157611a31615856565b9050602002013508610320850152611a558b8b60608181106115b4576115b4615856565b9150600080516020615a46833981519152846018602002015183096103008501526102a0840151610320850151600080516020615a468339815191529190089150600080516020615a46833981519152846017602002015183096102e08501526102a0840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096102a08501526102e0840151600080516020615a4683398151915290611b139082615970565b610300860151089150600080516020615a4683398151915284600f602002015183096102a08501526060840151600080516020615a46833981519152908c8c6068818110611b6357611b63615856565b90506020020135089150600080516020615a46833981519152828c8c6067818110611b9057611b90615856565b90506020020135096102e08501526080840151600080516020615a46833981519152908c8c606a818110611bc657611bc6615856565b90506020020135089150600080516020615a46833981519152828560176020020151096102e0850152600080516020615a468339815191528b8b6052818110611c1157611c11615856565b905060200201358c8c6043818110611c2b57611c2b615856565b90506020020135096103008501526040840151600080516020615a468339815191529060000960408501819052610300850151600080516020615a468339815191529108610300850152600080516020615a468339815191528b8b6053818110611c9757611c97615856565b9050602002013585600260548110611cb157611cb1615856565b602002015108610320850152600080516020615a468339815191528b8b606a818110611cdf57611cdf615856565b90506020020135600080516020615a46833981519152611cff9190615970565b8c8c6068818110611d1257611d12615856565b9050602002013508610340850152600080516020615a468339815191528b8b6066818110611d4257611d42615856565b90506020020135600080516020615a46833981519152611d629190615970565b6001089150600080516020615a468339815191528285600e602002015109610360850152600080516020615a468339815191528b8b6066818110611da857611da8615856565b905060200201358c8c6066818110611dc257611dc2615856565b90506020020135099150600080516020615a468339815191528b8b6066818110611dee57611dee615856565b90506020020135600080516020615a46833981519152611e0e9190615970565b83089150600080516020615a46833981519152828560146020020151096103808501526060840151610300850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c6066818110611e7357611e73615856565b90506020020135096103008501526080840151610320850151600080516020615a468339815191529190086103208501819052610300850151600080516020615a468339815191529190099150600080516020615a46833981519152611ee783600080516020615a46833981519152615970565b6102e0860151089150600080516020615a4683398151915284600f602002015183096102e08501526103408401516101c0850151600080516020615a46833981519152919009610300850152600080516020615a468339815191528b8b6069818110611f5557611f55615856565b90506020020135600080516020615a46833981519152611f759190615970565b8c8c6068818110611f8857611f88615856565b90506020020135089150600080516020615a468339815191528285601a6020020151099150600080516020615a4683398151915284600f602002015183096103408501526060840151600080516020615a46833981519152908c8c606d818110611ff457611ff4615856565b90506020020135089150600080516020615a46833981519152828c8c606c81811061202157612021615856565b90506020020135096103a08501526080840151600080516020615a46833981519152908c8c606f81811061205757612057615856565b90506020020135089150600080516020615a468339815191528285601d6020020151096103a08501526120ca8b8b605281811061209657612096615856565b905060200201358c8c60448181106120b0576120b0615856565b90506020020135866002605481106111c0576111c0615856565b6103c0850152600080516020615a468339815191528b8b606f8181106120f2576120f2615856565b90506020020135600080516020615a468339815191526121129190615970565b8c8c606d81811061212557612125615856565b90506020020135086103e0850152600080516020615a468339815191528b8b606b81811061215557612155615856565b90506020020135600080516020615a468339815191526121759190615970565b6001089150600080516020615a468339815191528285600e602002015109610400850152600080516020615a468339815191528b8b606b8181106121bb576121bb615856565b905060200201358c8c606b8181106121d5576121d5615856565b90506020020135099150600080516020615a468339815191528b8b606b81811061220157612201615856565b90506020020135600080516020615a468339815191526122219190615970565b83089150600080516020615a468339815191528285601460200201510961042085015260608401516103c0850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c606b81811061228657612286615856565b90506020020135099150600080516020615a46833981519152846019602002015183099150600080516020615a468339815191526122d283600080516020615a46833981519152615970565b6103a0860151089150600080516020615a4683398151915284600f602002015183096103a08501526103e08401516101c0850151600080516020615a468339815191529190096103c0850152600080516020615a468339815191528b8b606e81811061234057612340615856565b90506020020135600080516020615a468339815191526123609190615970565b8c8c606d81811061237357612373615856565b90506020020135089150600080516020615a468339815191528285601f6020020151099150600080516020615a4683398151915284600f602002015183096103e08501526060840151600080516020615a46833981519152908c8c60728181106123df576123df615856565b90506020020135089150600080516020615a46833981519152828c8c607181811061240c5761240c615856565b90506020020135096104408501526080840151600080516020615a46833981519152908c8c607481811061244257612442615856565b90506020020135089150600080516020615a468339815191528285602260200201510961044085015261249b8b8b605281811061248157612481615856565b905060200201358c8c60458181106120b0576120b0615856565b610460850152600080516020615a468339815191528b8b60748181106124c3576124c3615856565b90506020020135600080516020615a468339815191526124e39190615970565b8c8c60728181106124f6576124f6615856565b9050602002013508610480850152600080516020615a468339815191528b8b607081811061252657612526615856565b90506020020135600080516020615a468339815191526125469190615970565b6001089150600080516020615a468339815191528285600e6020020151096104a0850152600080516020615a468339815191528b8b607081811061258c5761258c615856565b905060200201358c8c60708181106125a6576125a6615856565b90506020020135099150600080516020615a468339815191528b8b60708181106125d2576125d2615856565b90506020020135600080516020615a468339815191526125f29190615970565b83089150600080516020615a46833981519152828560146020020151096104c08501526060840151610460850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c607081811061265757612657615856565b90506020020135099150600080516020615a46833981519152846019602002015183099150600080516020615a468339815191526126a383600080516020615a46833981519152615970565b610440860151089150600080516020615a4683398151915284600f602002015183096104408501526104808401516101c0850151600080516020615a46833981519152919009610460850152600080516020615a468339815191528b8b607381811061271157612711615856565b90506020020135600080516020615a468339815191526127319190615970565b8c8c607281811061274457612744615856565b90506020020135089150600080516020615a46833981519152828560246020020151099150600080516020615a4683398151915284600f602002015183096104808501526060840151600080516020615a46833981519152908c8c60778181106127b0576127b0615856565b90506020020135089150600080516020615a46833981519152828c8c60768181106127dd576127dd615856565b90506020020135096104e08501526080840151600080516020615a46833981519152908c8c607981811061281357612813615856565b90506020020135089150600080516020615a46833981519152828560276020020151096104e085015261286c8b8b605281811061285257612852615856565b905060200201358c8c60468181106120b0576120b0615856565b610500850152600080516020615a468339815191528b8b607981811061289457612894615856565b90506020020135600080516020615a468339815191526128b49190615970565b8c8c60778181106128c7576128c7615856565b9050602002013508610520850152600080516020615a468339815191528b8b60758181106128f7576128f7615856565b90506020020135600080516020615a468339815191526129179190615970565b6001089150600080516020615a468339815191528285600e602002015109610540850152600080516020615a468339815191528b8b607581811061295d5761295d615856565b905060200201358c8c607581811061297757612977615856565b90506020020135099150600080516020615a468339815191528b8b60758181106129a3576129a3615856565b90506020020135600080516020615a468339815191526129c39190615970565b83089150600080516020615a46833981519152828560146020020151096105608501526060840151610500850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c6075818110612a2857612a28615856565b90506020020135099150600080516020615a46833981519152846019602002015183099150600080516020615a46833981519152612a7483600080516020615a46833981519152615970565b6104e0860151089150600080516020615a4683398151915284600f602002015183096103208501526105208401516101c0850151600080516020615a468339815191529190096104e0850152600080516020615a468339815191528b8b6078818110612ae257612ae2615856565b90506020020135600080516020615a46833981519152612b029190615970565b8c8c6077818110612b1557612b15615856565b90506020020135089150600080516020615a46833981519152828560296020020151099150600080516020615a4683398151915284600f602002015183096105008501526060840151600080516020615a46833981519152908c8c607c818110612b8157612b81615856565b90506020020135089150600080516020615a46833981519152828c8c607b818110612bae57612bae615856565b90506020020135096105208501526080840151600080516020615a46833981519152908c8c607e818110612be457612be4615856565b90506020020135089150600080516020615a4683398151915282856029602002015109610520850152612c3d8b8b6054818110612c2357612c23615856565b905060200201358c8c60438181106120b0576120b0615856565b610580850152600080516020615a468339815191528b8b6055818110612c6557612c65615856565b9050602002013585600260548110612c7f57612c7f615856565b6020020151086105a0850152600080516020615a468339815191528b8b607e818110612cad57612cad615856565b90506020020135600080516020615a46833981519152612ccd9190615970565b8c8c607c818110612ce057612ce0615856565b90506020020135086105c0850152600080516020615a468339815191528b8b607a818110612d1057612d10615856565b90506020020135600080516020615a46833981519152612d309190615970565b6001089150600080516020615a468339815191528285600e6020020151096105e0850152600080516020615a468339815191528b8b607a818110612d7657612d76615856565b905060200201358c8c607a818110612d9057612d90615856565b90506020020135099150600080516020615a468339815191528b8b607a818110612dbc57612dbc615856565b90506020020135600080516020615a46833981519152612ddc9190615970565b83089150600080516020615a46833981519152828560146020020151096106008501526060840151610580850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c607a818110612e4157612e41615856565b905060200201350961058085015260808401516105a0850151600080516020615a468339815191529190089150600080516020615a468339815191528285602c6020020151099150600080516020615a46833981519152612eb083600080516020615a46833981519152615970565b610520860151089150600080516020615a4683398151915284600f602002015183096105208501526105c08401516101c0850151600080516020615a46833981519152919009610580850152600080516020615a468339815191528b8b607d818110612f1e57612f1e615856565b90506020020135600080516020615a46833981519152612f3e9190615970565b8c8c607c818110612f5157612f51615856565b90506020020135089150600080516020615a468339815191528285602e6020020151099150600080516020615a4683398151915284600f602002015183096105a08501526060840151600080516020615a46833981519152908c8c6081818110612fbd57612fbd615856565b90506020020135089150600080516020615a46833981519152828c8c6080818110612fea57612fea615856565b90506020020135096105c08501526080840151600080516020615a46833981519152908c8c608381811061302057613020615856565b90506020020135089150600080516020615a468339815191528285602e6020020151096105c085015261305f8b8b6056818110612c2357612c23615856565b610620850152600080516020615a468339815191528b8b605781811061308757613087615856565b90506020020135856002605481106130a1576130a1615856565b602002015108610640850152600080516020615a468339815191528b8b60838181106130cf576130cf615856565b90506020020135600080516020615a468339815191526130ef9190615970565b8c8c608181811061310257613102615856565b9050602002013508610660850152600080516020615a468339815191528b8b607f81811061313257613132615856565b90506020020135600080516020615a468339815191526131529190615970565b6001089150600080516020615a468339815191528285600e602002015109610680850152600080516020615a468339815191528b8b607f81811061319857613198615856565b905060200201358c8c607f8181106131b2576131b2615856565b90506020020135099150600080516020615a468339815191528b8b607f8181106131de576131de615856565b90506020020135600080516020615a468339815191526131fe9190615970565b83089150600080516020615a46833981519152828560146020020151096106a08501526060840151610620850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c607f81811061326357613263615856565b90506020020135096106208501526080840151610640850151600080516020615a468339815191529190089150600080516020615a46833981519152828560316020020151099150600080516020615a468339815191526132d283600080516020615a46833981519152615970565b6105c0860151089150600080516020615a4683398151915284600f602002015183096105c08501526106608401516101c0850151600080516020615a46833981519152919009610620850152600080516020615a468339815191528b8b608281811061334057613340615856565b90506020020135600080516020615a468339815191526133609190615970565b8c8c608181811061337357613373615856565b90506020020135089150600080516020615a46833981519152828560336020020151099150600080516020615a4683398151915284600f602002015183096106408501526060840151600080516020615a46833981519152908c8c60868181106133df576133df615856565b90506020020135089150600080516020615a46833981519152828c8c608581811061340c5761340c615856565b90506020020135096106608501526080840151600080516020615a46833981519152908c8c608881811061344257613442615856565b90506020020135089150600080516020615a46833981519152828560336020020151096106608501526134818b8b6058818110612c2357612c23615856565b6106c0850152600080516020615a468339815191528b8b60598181106134a9576134a9615856565b90506020020135856002605481106134c3576134c3615856565b6020020151086040850152600080516020615a468339815191528b8b60888181106134f0576134f0615856565b90506020020135600080516020615a468339815191526135109190615970565b8c8c608681811061352357613523615856565b90506020020135086106e0850152600080516020615a468339815191528b8b608481811061355357613553615856565b90506020020135600080516020615a468339815191526135739190615970565b6001089150600080516020615a468339815191528285600e602002015109610700850152600080516020615a468339815191528b8b60848181106135b9576135b9615856565b905060200201358c8c60848181106135d3576135d3615856565b90506020020135099150600080516020615a468339815191528b8b60848181106135ff576135ff615856565b90506020020135600080516020615a4683398151915261361f9190615970565b83089150600080516020615a468339815191528285601460200201510961028085015260608401516106c0850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c608481811061368457613684615856565b9050602002013509606085015260808401516040850151600080516020615a468339815191529190089150600080516020615a46833981519152828560036020020151099150600080516020615a468339815191526136f183600080516020615a46833981519152615970565b610660860151089150600080516020615a4683398151915284600f6020020151830960408501526106e08401516101c0850151600080516020615a468339815191529190096060850152600080516020615a468339815191528b8b608781811061375d5761375d615856565b90506020020135600080516020615a4683398151915261377d9190615970565b8c8c608681811061379057613790615856565b90506020020135089150600080516020615a46833981519152828560376020020151099150600080516020615a4683398151915284600f60200201518309608085015260a08401516137e69060008660106111c0565b915061381b8480600560200201517f35342d2c29302f2827192b2a24232226251f1e1d21201a18171c1b15161312118561511d565b915061383984806005602002015168ff040302143832312e8561511d565b915061384c8285600d60200201516150c0565b6040850152610100840151600080516020615a4683398151915290800960608501819052610100850151600080516020615a46833981519152910960808501526138d68b8b608f8181106138a2576138a2615856565b905060200201358c8c60908181106138bc576138bc615856565b905060200201358660046054811061055c5761055c615856565b90925090506138ef848c8c65ffff088b038d86866151a0565b909250905061393282828d8d608981811061390c5761390c615856565b905060200201358e8e608a81811061392657613926615856565b905060200201356152a8565b6101e08601526101c08501526101608401516080850151600080516020615a4683398151915291900960a085015260e08401516080850151600080516020615a46833981519152919009610160850181905260e0850151600080516020615a4683398151915291096101a0850181905260e0850151600080516020615a468339815191529109610200850181905260e0850151600080516020615a468339815191529109610220850181905260e0850151600080516020615a468339815191529109610240850181905260e0850151600080516020615a468339815191529109610260850152600080516020615a468339815191528b8b6087818110613a3a57613a3a615856565b9050602002013585601360548110613a5457613a54615856565b6020020151099150613a75848c8c6bffff0b6e0d731078117d128286615316565b9150613ab28b8b6069818110613a8d57613a8d615856565b9050602002013585600460548110613aa757613aa7615856565b6020020151846150f0565b6102808501526101408401516060850151600080516020615a46833981519152919009610140850152613b188b8b6063818110613af157613af1615856565b9050602002013585600360548110613b0b57613b0b615856565b60200201518660146111c0565b610280850152610120840151610100850151600080516020615a4683398151915291900961012085015260e0840151610100850151600080516020615a468339815191529190096102a0850152600091505b6008821015613c1957600080516020615a4683398151915284613b8e8460006158fb565b613b999060076158b4565b60548110613ba957613ba9615856565b602002015185613bba8560016158fb565b613bc59060156158b4565b60548110613bd557613bd5615856565b60200201510984613be78460016158fb565b613bf29060166158b4565b60548110613c0257613c02615856565b602002015281613c1181615938565b925050613b6a565b600080516020615a468339815191528b8b6085818110613c3b57613c3b615856565b9050602002013585601d60548110613c5557613c55615856565b6020020151099150613c7e848c8c73ffff0848156216651767186c19711a761b7b1c8086615316565b9150600080516020615a46833981519152828560146020020151086102808501526102a08401516060850151600080516020615a46833981519152919008606085015260e0840151600080516020615a468339815191529080096102a0850181905260e0850151600080516020615a4683398151915291096103c0850152600091505b6032821015613db057600080516020615a4683398151915284613d258460006158fb565b613d309060076158b4565b60548110613d4057613d40615856565b602002015185613d518560016158fb565b613d5c90601e6158b4565b60548110613d6c57613d6c615856565b60200201510984613d7e8460016158fb565b613d8990601f6158b4565b60548110613d9957613d99615856565b602002015281613da881615938565b925050613d01565b600080516020615a468339815191528b8b605a818110613dd257613dd2615856565b9050602002013585605060548110613dec57613dec615856565b602002015109610a208501526101808401516109e0850151600080516020615a46833981519152919009610a408501819052610180850151600080516020615a468339815191529109610a608501819052610180850151600080516020615a4683398151915291096101808501526109e08401516040850151613e7291908660516111c0565b9150613ea1848c8c7f3f50405141524253435444554556465747584859495b4a5c4b5d4c5e4d5f4e6086615316565b9150613ed0848c8c7f2f7a307c317e327f338134833584368637883849394a3a4b3b4c3c4d3d4e3e4f86615316565b9150613eff848c8c7f1f4620472161226423662468256a266b276d286f29702a722b742c752d772e7986615316565b9150613f16848c8c67ffff074315441e4586615316565b9150600080516020615a468339815191528b8b6042818110613f3a57613f3a615856565b9050602002013583089150600080516020615a468339815191528285601460200201510860408501526106c0840151610260850151600080516020615a468339815191529190086102608501526106a08401516103a0850151600080516020615a46833981519152919008610280850152610660840151610240850151600080516020615a46833981519152919008610240850152610640840151610380850151600080516020615a46833981519152919008610380850152610600840151610220850151600080516020615a468339815191529190086102208501526105e0840151610360850151600080516020615a468339815191529190086103608501526105a0840151610200850151600080516020615a46833981519152919008610200850152610580840151610340850151600080516020615a468339815191529190086103408501526105408401516101a0850151600080516020615a468339815191529190086101a0850152610520840151610320850151600080516020615a468339815191529190086103208501526104e0840151610160850151600080516020615a468339815191529190086101608501526104c0840151610300850151600080516020615a468339815191529190086103008501526104808401516080850151600080516020615a4683398151915291900860808501526104608401516102e0850151600080516020615a468339815191529190086102e08501526104408401516102c0850151600080516020615a468339815191529190086102c08501526104208401516060850151600080516020615a468339815191529190086060850152610400840151610100850151600080516020615a4683398151915291900861010085015261420d8b8b608f8181106141d9576141d9615856565b905060200201358c8c60908181106141f3576141f3615856565b905060200201358660056054811061055c5761055c615856565b9092509050614240848c8c7f182c192e1a301b321c341436098b03260a8d040a0b0e0d121016111a121e132286866151a0565b9092509050614267848c8c73ffff4f3a523c533e0c405038068908081628172a86866151a0565b90925090506142b97f22cbc20a434be99c890d0fbf8c441feaf0dfb2178561a82783b0e74fad5d91eb7f186f16fd4e05464ed8a90fea4fac4fa3a80944bcaf19d9f536f8a67e301e75f386604e6105b4565b909250905061430b7f034336e9ed495c46a1c3ca745bad166bbb675c8ee31092792d0b3d435d3da0a77f120d0016a186defe5e27918247f5fb2c6f578d8ed259080a6a91ed9e503bc79c86604d6105b4565b909250905061435d7f2c4cbb935d4c9990fcaae8d9b0a244ee3f5327a7ca816aa58a58a40c8e00457e7f130d42ccd64a2e29acce747d0e976a363ab4b22f78b8a11b13ca81cf3549943986604c6105b4565b90925090506143af7f05ba13020527a88585e1f01f1d23dd68ee0d64cad4dcb82fce758883bafc1ef27f01696dcfadbe9736c07870ef063e349b30fddbd9ce85ccc7f7b19d1b18ddaf4b86604b6105b4565b90925090506144017f1adae7001a26c1f2f5640d6c60724b413dc22ae2ed96aaaccc659021a3ae1a307f2e6ff83e2f71937c1be92fe36ad1280cb68bcdf07699ee52e4d5540fef5a4bf386604a6105b4565b90925090506144537f1b9a33b5b4544142fd3f804b5f9457c34a4ff7da0852efc4b8d4241954ef859b7f2dc9f73c2504de7a2996b6c20aac9e53a6d6bee0e32ccdd44562c3498bd57a4e8660496105b4565b90925090506144a57f2bf75d9dd944249cd720ee71585980774cb83905b860feb5af3da42ca043b1157f07b4ff44a8e4250bf3ce16c06e8430b585a7a1e85243febe565a7929db37cc9f8660486105b4565b90925090506144f77f2444b554a3ef28ed5743cf5883acf229c2d774bf5076626197ca3093666a7fe57f2f54a38842d7fb7870618b48df360608f1a801e01dfa34b49e5964dc43f989bf8660476105b4565b90925090506145497f25d344a083be7e69cb907b8705b3bab3417d4a23f06d43ca7b287028a88ec5837f2c03f591ec6858cdff27cadaac1a67a1dc9ab7877f898686efe7033e7fd02a168660466105b4565b909250905061459b7f2fd1b96dd6e1ac88d9b5d438bace1ce6e7fe07412454779502af65284fef7e227f2fe224e0009d4ab99131c7c1cc045d0d0d7a50d6757fc12e4cfd720abc066d058660456105b4565b90925090506145ed7f2bf75d9dd944249cd720ee71585980774cb83905b860feb5af3da42ca043b1157f07b4ff44a8e4250bf3ce16c06e8430b585a7a1e85243febe565a7929db37cc9f8660446105b4565b909250905061463f7f1969a5f2f2d86eecccfdee75c39368f79759667bf445eed2f9d2d72c859011bf7f055449f64bace3dadff58d914f1647a98729c5476b53b66f1ff472b9537d183c8660436105b4565b90925090506146917f2fd08ae291ca0c95ada3f562b9f9be896737fd57493c4cefa087979abda4d2d67f04a6506069e2d39e944abcc54e70e881ccdd429ed4c1017fbe1099efeb70465f8660426105b4565b90925090506146e37f0ce55ceb7e62f5d45b387d78d357bc9a8423737e1c47b079a6cd4b64748aca117f2f92a53112cbb38374218eafba1349b77d3647f0423a3b48c8cc622f53c9c3e48660416105b4565b90925090506147357f229f748a69bee4ae7fdc62af12994ec2bd7f47b607216d282cc1f96054dac0787f015e9c5665a513c49920a46fbf7e607586f5b394f7487e045d45e99b7104f4778660406105b4565b90925090506147877f1fbdd7e6e58f01eb5a63b5922c2c6babed9c93d98d28363d97f78cd474cd4f1a7f23a726f04321315f0a8d73d3b596905c3e72eb5a899bd281f18abf3d674d1cfe86603f6105b4565b90925090506147d97f250ebdee646f64bb4af9f5f55fd76ae257408de7f0786f4817032e2581aeb8477f0ec875e3938bc9be9eab457a7d1655c96e5573e0d5c047692c45c3e4eaaa5a4386603e6105b4565b909250905061482b7f2617cd43f1512cc7ec9c2b728bbf4cf18de4b4f30912c811a6bd6d7a90eb35807f0c6dd39b0cb2bde148a8aa1dd84b71f6e47365a1cd726b8428c166e2d6f9e2d886603d6105b4565b909250905061487d7f24f6a4c5ff09d31cca15502ee379d50685bfe70be297201f44d4d967deb8be147f13e3df7f2f1cd670e9f473583298014f5286eb1f2402750ece5f75825484678286603c6105b4565b90925090506148cf7f0102612ad204a0291df816e0cbd8bfb60d03a26493db681420f83add5da28c3e7f0a229f00ff3a8cfce146e4c3ab5447e9d300c83f88e2072c860e05da3b9d60cc86603b6105b4565b90925090506149217f138c357f0a9847d66feca030756c854971c8783fb6a2c2547db480cda037781c7f2c03ebe8c2606106b122920dfe0a42293421ddff6bd205db46eacc956ff2a8a186603a6105b4565b90925090506149737f04a6e8bdc030c8594e55d7fb89399e76dba4d5e9bf60fb6e1fbdb2c0ffed69267f1094abfe954af52dbe746c8cf9aaabad56aa7e4da6a9294a1736fe685fee312f8660396105b4565b90925090506149c57f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008660386105b4565b90925090506149f0848c8c77ffff070015021e041f06250c28102b142e18311c3420372486866151a0565b85516020870151929450909250614a0a91849184916152a8565b60208601528452614a1f60016002868161055c565b85516020870151929450909250614a379184846153b8565b602086018190528186526101c08601516101e090960151959d959c50909a509850929650505050505050565b614a6b61562a565b80517f186282957db913abd99f91db59fe69922e95040603ef44c0bd7aa3adeef8f5ac905280517f17944351223333f260ddc3b4af45191b856689eda9eab5cbcddbbe570ce860d2602091820152810180517f298adc7396bd3865cbf6d6df91bae406694e6d2215baa893bdeadb63052895f49052517f297772d34bc9aa8ae56162486363ffe417b02dc7e8c207fc2cc20203e67a02ad9060015b602002015290565b614b1661562a565b80517f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2905280517f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed602091820152810180517f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec9052517f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d906001614b06565b60008083516006614bc691906158fb565b905060008167ffffffffffffffff811115614be357614be36158cc565b604051908082528060200260200182016040528015614c0c578160200160208202803683370190505b509050614c1761568d565b60008551875114614c2757600080fd5b60005b8751811015614e6057878181518110614c4557614c45615856565b60200260200101516000015184826006614c5f91906158fb565b614c6a9060006158b4565b81518110614c7a57614c7a615856565b602002602001018181525050878181518110614c9857614c98615856565b60200260200101516020015184826006614cb291906158fb565b614cbd9060016158b4565b81518110614ccd57614ccd615856565b602002602001018181525050868181518110614ceb57614ceb615856565b6020908102919091010151515184614d048360066158fb565b614d0f9060026158b4565b81518110614d1f57614d1f615856565b602002602001018181525050868181518110614d3d57614d3d615856565b60209081029190910181015151015184614d588360066158fb565b614d639060036158b4565b81518110614d7357614d73615856565b602002602001018181525050868181518110614d9157614d91615856565b602002602001015160200151600060028110614daf57614daf615856565b602002015184614dc08360066158fb565b614dcb9060046158b4565b81518110614ddb57614ddb615856565b602002602001018181525050868181518110614df957614df9615856565b602002602001015160200151600160028110614e1757614e17615856565b602002015184614e288360066158fb565b614e339060056158b4565b81518110614e4357614e43615856565b602090810291909101015280614e5881615938565b915050614c2a565b50602082602086026020860160085afa905080614e7c57600080fd5b5051151595945050505050565b600080614e946156ab565b6000614eb3604051806040016040528060008152602001600081525090565b8783526020830187905260408084018790528160608560075afa915081614ed957600080fd5b8051602090910151909890975095505050505050565b600080614efa6156c9565b87815260208101879052604081018690526060810185905260808101849052614f22816153fd565b6060810151608090910151909890975095505050505050565b60028282614f4881615938565b935060908110614f5a57614f5a615856565b6020020152828282614f6b81615938565b935060908110614f7d57614f7d615856565b6020020152505050565b60018282614f9481615938565b935060908110614fa657614fa6615856565b6020020152838282614fb781615938565b935060908110614fc957614fc9615856565b6020020152828282614fda81615938565b935060908110614fec57614fec615856565b602002015250505050565b600080838363ffffffff166090811061501257615012615856565b60200201818152505060006150448484602061502e9190615987565b6150399060016159b3565b63ffffffff16615438565b5190506150508161546e565b93525090919050565b600061506361560c565b61506b61568d565b6020808352828101819052604083018190526060830186905260808301859052600080516020615a4683398151915260a08401526000908260c08560055afa9050806150b657600080fd5b5051949350505050565b6000816000036150cf57600080fd5b600080516020615a468339815191526150e7836155e2565b84099392505050565b6000600080516020615a4683398151915282600080516020615a4683398151915285870908949350505050565b6000805b60208110156151965760ff80851690811461517d5760089490941c93600080516020615a4683398151915287826054811061515e5761515e615856565b6020020151600080516020615a46833981519152868909089350615183565b50615196565b5061518f6001826158b4565b9050615121565b5090949350505050565b6000806151ab6156c9565b606081018590526080810184905260005b602081101561528d5760ff80881690811461527457601088901c9760081c60ff168a8a838181106151ef576151ef615856565b905060200201358460006005811061520957615209615856565b60200201528a8a61521b8460016158b4565b81811061522a5761522a615856565b905060200201358460016005811061524457615244615856565b60200201528b816054811061525b5761525b615856565b6020020151604085015261526e846153fd565b5061527a565b5061528d565b506152866002826158b4565b90506151bc565b50606081015160809091015190999098509650505050505050565b60008060006152ca604051806040016040528060008152602001600081525090565b6152d26156e7565b888152602081018890526040808201889052606082018790528260808360065afa9250826152ff57600080fd5b508051602090910151909890975095505050505050565b6000805b60208110156153ad5760ff80851690811461539457601085901c9460081c60ff16600080516020615a4683398151915285600080516020615a468339815191528b846054811061536c5761536c615856565b60200201518b8b8781811061538357615383615856565b90506020020135090894505061539a565b506153ad565b506153a66002826158b4565b905061531a565b509095945050505050565b6000806153f08686866153eb877f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47615970565b6152a8565b9150915094509492505050565b600060406020830160608460075afa90508061541857600080fd5b60406060830160806020850160065afa90508061543457600080fd5b5050565b61544061568d565b6000602082848660026107d05a03fa9050808061545957fe5b5080615467576154676159db565b5092915050565b6000816155c18160008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b6008827fff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0016901c1790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b6010827fffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff000016901c1790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b6020827fffffffff00000000ffffffff00000000ffffffff00000000ffffffff0000000016901c17905060408177ffffffffffffffff0000000000000000ffffffffffffffff16901b6040827fffffffffffffffff0000000000000000ffffffffffffffff000000000000000016901c179050608081901b608082901c179050919050565b90506155db600080516020615a4683398151915282615a0a565b9392505050565b6000615606826156016002600080516020615a46833981519152615970565b615059565b92915050565b6040518060c001604052806006906020820280368337509192915050565b604051806040016040528061563d615705565b815260200161564a615705565b905290565b60405180610a8001604052806054906020820280368337509192915050565b6040518061120001604052806090906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b60405180606001604052806003906020820280368337509192915050565b6040518060a001604052806005906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b60008083601f84011261573557600080fd5b50813567ffffffffffffffff81111561574d57600080fd5b6020830191508360208260051b850101111561576857600080fd5b9250929050565b60008060008060006060868803121561578757600080fd5b853567ffffffffffffffff8082111561579f57600080fd5b6157ab89838a01615723565b909750955060208801359150808211156157c457600080fd5b506157d188828901615723565b96999598509660400135949350505050565b600060208083528351808285015260005b81811015615810578581018301518582016040015282016157f4565b81811115615822576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156158c7576158c7615885565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561593357615933615885565b500290565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361596957615969615885565b5060010190565b60008282101561598257615982615885565b500390565b600063ffffffff808316818516818304811182151516156159aa576159aa615885565b02949350505050565b600063ffffffff8083168185168083038211156159d2576159d2615885565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082615a40577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50069056fe30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a164736f6c634300080f000a" + func init() { if err := json.Unmarshal([]byte(ZKVerifierStorageLayoutJSON), ZKVerifierStorageLayout); err != nil { panic(err) diff --git a/kroma-bindings/predeploys/addresses.go b/kroma-bindings/predeploys/addresses.go index 149d5ccb48..a3d3c223bd 100644 --- a/kroma-bindings/predeploys/addresses.go +++ b/kroma-bindings/predeploys/addresses.go @@ -20,7 +20,6 @@ const ( L2ERC721Bridge = "0x420000000000000000000000000000000000000A" KromaMintableERC20Factory = "0x420000000000000000000000000000000000000B" KromaMintableERC721Factory = "0x420000000000000000000000000000000000000C" - GovernanceToken = "0x42000000000000000000000000000000000000FF" Create2Deployer = "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2" MultiCall3 = "0xcA11bde05977b3631167028862bE2a173976CA11" Safe_v130 = "0x69f4D1788e39c87893C980c06EdF4b7f686e2938" @@ -45,7 +44,6 @@ var ( L1FeeVaultAddr = common.HexToAddress(L1FeeVault) ValidatorRewardVaultAddr = common.HexToAddress(ValidatorRewardVault) L2StandardBridgeAddr = common.HexToAddress(L2StandardBridge) - GovernanceTokenAddr = common.HexToAddress(GovernanceToken) L2ERC721BridgeAddr = common.HexToAddress(L2ERC721Bridge) KromaMintableERC20FactoryAddr = common.HexToAddress(KromaMintableERC20Factory) KromaMintableERC721FactoryAddr = common.HexToAddress(KromaMintableERC721Factory) @@ -89,15 +87,15 @@ func init() { Predeploys["L1FeeVault"] = &oppredeploys.Predeploy{Address: L1FeeVaultAddr} Predeploys["ValidatorRewardVault"] = &oppredeploys.Predeploy{Address: ValidatorRewardVaultAddr} Predeploys["L2StandardBridge"] = &oppredeploys.Predeploy{Address: L2StandardBridgeAddr} + /* [Kroma: START] Predeploys["GovernanceToken"] = &oppredeploys.Predeploy{ Address: GovernanceTokenAddr, - /* [Kroma: START] ProxyDisabled: true, - */ Enabled: func(config oppredeploys.DeployConfig) bool { return config.GovernanceEnabled() }, } + */ Predeploys["L2ERC721Bridge"] = &oppredeploys.Predeploy{Address: L2ERC721BridgeAddr} Predeploys["KromaMintableERC20Factory"] = &oppredeploys.Predeploy{Address: KromaMintableERC20FactoryAddr} Predeploys["KromaMintableERC721Factory"] = &oppredeploys.Predeploy{Address: KromaMintableERC721FactoryAddr} diff --git a/kroma-chain-ops/README.md b/kroma-chain-ops/README.md index e033b0d9c7..77d540e56c 100644 --- a/kroma-chain-ops/README.md +++ b/kroma-chain-ops/README.md @@ -9,8 +9,8 @@ has been configured correctly. It iterates over all 256 predeployed proxies to make sure they are configured correctly with the correct proxy admin address. After that, it checks that all [predeploys](../kroma-bindings/predeploys/addresses.go) are configured and aliased correctly. Additional contract-specific -checks ensure configuration like ownership, version, and storage -is set correctly for the predeploys. +checks ensure configurations like ownership, version, and storage +are set correctly for the predeploys. #### Usage diff --git a/kroma-chain-ops/genesis/config.go b/kroma-chain-ops/genesis/config.go index 72fdeaa8f6..b336e6fd22 100644 --- a/kroma-chain-ops/genesis/config.go +++ b/kroma-chain-ops/genesis/config.go @@ -11,6 +11,9 @@ import ( "reflect" "strings" + "github.com/ethereum-optimism/optimism/op-chain-ops/state" + "github.com/ethereum-optimism/optimism/op-node/rollup" + "github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" gstate "github.com/ethereum/go-ethereum/core/state" @@ -18,9 +21,6 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/rpc" - "github.com/ethereum-optimism/optimism/op-chain-ops/state" - "github.com/ethereum-optimism/optimism/op-node/rollup" - "github.com/ethereum-optimism/optimism/op-service/eth" "github.com/kroma-network/kroma/kroma-bindings/predeploys" "github.com/kroma-network/kroma/kroma-chain-ops/immutables" ) @@ -155,6 +155,7 @@ type DeployConfig struct { GasPriceOracleScalar uint64 `json:"gasPriceOracleScalar"` // EnableGovernance configures whether or not include governance token predeploy. EnableGovernance bool `json:"enableGovernance"` + /* [Kroma: START] // GovernanceTokenSymbol represents the ERC20 symbol of the GovernanceToken. GovernanceTokenSymbol string `json:"governanceTokenSymbol"` // GovernanceTokenName represents the ERC20 name of the GovernanceToken @@ -162,6 +163,23 @@ type DeployConfig struct { // GovernanceTokenOwner represents the owner of the GovernanceToken. Has the ability // to mint and burn tokens. GovernanceTokenOwner common.Address `json:"governanceTokenOwner"` + [Kroma: END] */ + // [Kroma: START] + // GovernanceTokenNotUseCreate2 is used to determine whether not to use CREATE2 to deploy GovernanceTokenProxy. + GovernanceTokenNotUseCreate2 bool `json:"governanceTokenNotUseCreate2,omitempty"` + // GovernanceTokenProxySalt is used to determine GovernanceTokenProxy address on L1 and L2. + GovernanceTokenProxySalt common.Hash `json:"governanceTokenProxySalt"` + // MintManagerOwner represents the owner of the MintManager on L1 and L2. Has the ability to mint initially. + MintManagerOwner common.Address `json:"mintManagerOwner"` + // L1MintManagerRecipients is an array of recipient addresses to receive the minted governance tokens on L1. + L1MintManagerRecipients []common.Address `json:"l1MintManagerRecipients"` + // L1MintManagerShares is an array of each recipient's share of total minted tokens on L1. + L1MintManagerShares []uint64 `json:"l1MintManagerShares"` + // L2MintManagerRecipients is an array of recipient addresses to receive the minted governance tokens on L2. + L2MintManagerRecipients []common.Address `json:"l2MintManagerRecipients"` + // L2MintManagerShares is an array of each recipient's share of total minted tokens on L2. + L2MintManagerShares []uint64 `json:"l2MintManagerShares"` + // [Kroma: END] // DeploymentWaitConfirmations is the number of confirmations to wait during // deployment. This is DEPRECATED and should be removed in a future PR. DeploymentWaitConfirmations int `json:"deploymentWaitConfirmations"` @@ -255,6 +273,40 @@ type DeployConfig struct { ValidatorPoolRequiredBondAmount *hexutil.Big `json:"validatorPoolRequiredBondAmount"` ValidatorPoolMaxUnbond uint64 `json:"validatorPoolMaxUnbond"` ValidatorPoolRoundDuration uint64 `json:"validatorPoolRoundDuration"` + // ValidatorPoolTerminateOutputIndex is the output index where ValidatorPool is terminated after + // in hex value. + ValidatorPoolTerminateOutputIndex *hexutil.Big `json:"validatorPoolTerminateOutputIndex"` + + // ValidatorManagerTrustedValidator represents the address of the trusted validator. + ValidatorManagerTrustedValidator common.Address `json:"validatorManagerTrustedValidator"` + // ValidatorManagerMinRegisterAmount is the amount of the minimum register amount. + ValidatorManagerMinRegisterAmount *hexutil.Big `json:"validatorManagerMinRegisterAmount"` + // ValidatorManagerMinActivateAmount is the amount of the minimum activation amount. + ValidatorManagerMinActivateAmount *hexutil.Big `json:"validatorManagerMinActivateAmount"` + // ValidatorManagerCommissionChangeDelaySeconds is the delay to finalize the commission rate change in seconds. + ValidatorManagerCommissionChangeDelaySeconds uint64 `json:"validatorManagerCommissionChangeDelaySeconds"` + // ValidatorManagerRoundDurationSeconds is the duration of one submission round in seconds. + ValidatorManagerRoundDurationSeconds uint64 `json:"validatorManagerRoundDurationSeconds"` + // ValidatorManagerSoftJailPeriodSeconds is the duration of jail period in seconds in output non-submissions penalty. + ValidatorManagerSoftJailPeriodSeconds uint64 `json:"validatorManagerSoftJailPeriodSeconds"` + // ValidatorManagerHardJailPeriodSeconds is the duration of jail period in seconds in slashing penalty. + ValidatorManagerHardJailPeriodSeconds uint64 `json:"validatorManagerHardJailPeriodSeconds"` + // ValidatorManagerJailThreshold is the threshold of output non-submission to be jailed. + ValidatorManagerJailThreshold uint64 `json:"validatorManagerJailThreshold"` + // ValidatorManagerMaxFinalizations is the max number of output finalizations when distributing + // reward. + ValidatorManagerMaxFinalizations uint64 `json:"validatorManagerMaxFinalizations"` + // ValidatorManagerBaseReward is the amount of the base reward in hex value. + ValidatorManagerBaseReward *hexutil.Big `json:"validatorManagerBaseReward"` + + // AssetManagerKgh represents the address of the KGH NFT contract. + AssetManagerKgh common.Address `json:"assetManagerKgh"` + // AssetManagerVault represents the address of the validator reward vault. + AssetManagerVault common.Address `json:"assetManagerVault"` + // AssetManagerMinDelegationPeriod is the duration of minimum delegation period in seconds. + AssetManagerMinDelegationPeriod uint64 `json:"assetManagerMinDelegationPeriod"` + // AssetManagerBondAmount is the bond amount. + AssetManagerBondAmount *hexutil.Big `json:"assetManagerBondAmount"` ColosseumCreationPeriodSeconds uint64 `json:"colosseumCreationPeriodSeconds"` ColosseumBisectionTimeout uint64 `json:"colosseumBisectionTimeout"` @@ -283,9 +335,6 @@ type DeployConfig struct { ZKVerifierHashScalar *hexutil.Big `json:"zkVerifierHashScalar"` ZKVerifierM56Px *hexutil.Big `json:"zkVerifierM56Px"` ZKVerifierM56Py *hexutil.Big `json:"zkVerifierM56Py"` - - // L1GovernanceTokenProxy represents the address of the L1GovernanceTokenProxy on L1. - L1GovernanceTokenProxy common.Address `json:"l1GovernanceTokenProxy"` // [Kroma: END] } @@ -381,16 +430,36 @@ func (d *DeployConfig) Check() error { return fmt.Errorf("%w: L2 genesis block base fee per gas cannot be nil", ErrInvalidDeployConfig) } if d.EnableGovernance { + /* [Kroma: START] if d.GovernanceTokenName == "" { return fmt.Errorf("%w: GovernanceToken.name cannot be empty", ErrInvalidDeployConfig) } if d.GovernanceTokenSymbol == "" { return fmt.Errorf("%w: GovernanceToken.symbol cannot be empty", ErrInvalidDeployConfig) } + if d.GovernanceTokenOwner == (common.Address{}) { + return fmt.Errorf("%w: GovernanceToken owner cannot be address(0)", ErrInvalidDeployConfig) + } + [Kroma: END] */ // [Kroma: START] - // if d.GovernanceTokenOwner == (common.Address{}) { - // return fmt.Errorf("%w: GovernanceToken owner cannot be address(0)", ErrInvalidDeployConfig) - // } + if d.GovernanceTokenProxySalt == (common.Hash{}) { + return fmt.Errorf("%w: GovernanceTokenProxySalt cannot be empty hash", ErrInvalidDeployConfig) + } + if d.MintManagerOwner == (common.Address{}) { + return fmt.Errorf("%w: MintManagerOwner cannot be address(0)", ErrInvalidDeployConfig) + } + if len(d.L1MintManagerRecipients) == 0 { + return fmt.Errorf("%w: L1MintManagerRecipients array cannot be empty", ErrInvalidDeployConfig) + } + if len(d.L1MintManagerRecipients) != len(d.L1MintManagerShares) { + return fmt.Errorf("%w: L1MintManagerRecipients and L1MintManagerShares must be the same length", ErrInvalidDeployConfig) + } + if len(d.L2MintManagerRecipients) == 0 { + return fmt.Errorf("%w: L2MintManagerRecipients array cannot be empty", ErrInvalidDeployConfig) + } + if len(d.L2MintManagerRecipients) != len(d.L2MintManagerShares) { + return fmt.Errorf("%w: L2MintManagerRecipients and L2MintManagerShares must be the same length", ErrInvalidDeployConfig) + } // [Kroma: END] } // L2 block time must always be smaller than L1 block time @@ -468,6 +537,54 @@ func (d *DeployConfig) Check() error { if d.ValidatorPoolRoundDuration == 0 { return fmt.Errorf("%w: ValidatorPoolRoundDuration cannot be 0", ErrInvalidDeployConfig) } + if d.ValidatorManagerTrustedValidator == (common.Address{}) { + return fmt.Errorf("%w: ValidatorManagerTrustedValidator cannot be address(0)", ErrInvalidDeployConfig) + } + if d.ValidatorManagerMinRegisterAmount == nil { + return fmt.Errorf("%w: ValidatorManagerMinRegisterAmount cannot be nil", ErrInvalidDeployConfig) + } + if d.ValidatorManagerMinActivateAmount == nil { + return fmt.Errorf("%w: ValidatorManagerMinActivateAmount cannot be nil", ErrInvalidDeployConfig) + } + if d.ValidatorManagerMinActivateAmount.ToInt().Cmp(d.ValidatorManagerMinRegisterAmount.ToInt()) < 0 { + return fmt.Errorf("%w: ValidatorManagerMinActivateAmount must equal or more than ValidatorManagerMinRegisterAmount", ErrInvalidDeployConfig) + } + if d.ValidatorManagerCommissionChangeDelaySeconds == 0 { + return fmt.Errorf("%w: ValidatorManagerCommissionChangeDelaySeconds cannot be 0", ErrInvalidDeployConfig) + } + if d.ValidatorManagerRoundDurationSeconds == 0 { + return fmt.Errorf("%w: ValidatorManagerRoundDurationSeconds cannot be 0", ErrInvalidDeployConfig) + } + if d.ValidatorManagerSoftJailPeriodSeconds == 0 { + return fmt.Errorf("%w: ValidatorManagerSoftJailPeriodSeconds cannot be 0", ErrInvalidDeployConfig) + } + if d.ValidatorManagerHardJailPeriodSeconds == 0 { + return fmt.Errorf("%w: ValidatorManagerHardJailPeriodSeconds cannot be 0", ErrInvalidDeployConfig) + } + if d.ValidatorManagerJailThreshold == 0 { + return fmt.Errorf("%w: ValidatorManagerJailThreshold cannot be 0", ErrInvalidDeployConfig) + } + if d.ValidatorManagerMaxFinalizations == 0 { + return fmt.Errorf("%w: ValidatorManagerMaxFinalizations cannot be 0", ErrInvalidDeployConfig) + } + if d.ValidatorManagerBaseReward == nil { + return fmt.Errorf("%w: ValidatorManagerBaseReward cannot be nil", ErrInvalidDeployConfig) + } + if d.AssetManagerKgh == (common.Address{}) { + return fmt.Errorf("%w: AssetManagerKgh cannot be address(0)", ErrInvalidDeployConfig) + } + if d.AssetManagerVault == (common.Address{}) { + return fmt.Errorf("%w: AssetManagerVault cannot be address(0)", ErrInvalidDeployConfig) + } + if d.AssetManagerMinDelegationPeriod == 0 { + return fmt.Errorf("%w: AssetManagerMinDelegationPeriod cannot be 0", ErrInvalidDeployConfig) + } + if d.AssetManagerBondAmount == nil { + return fmt.Errorf("%w: AssetManagerBondAmount cannot be nil", ErrInvalidDeployConfig) + } + if d.L2OutputOracleSubmissionInterval*d.L2BlockTime != d.ValidatorManagerRoundDurationSeconds*2 { + return fmt.Errorf("%w: double of ValidatorManagerRoundDurationSeconds must equal to L2OutputOracleSubmissionInterval", ErrInvalidDeployConfig) + } if d.L2OutputOracleSubmissionInterval*d.L2BlockTime != d.ValidatorPoolRoundDuration*2 { return fmt.Errorf("%w: double of ValidatorPoolRoundDuration must equal to L2OutputOracleSubmissionInterval", ErrInvalidDeployConfig) } @@ -532,12 +649,6 @@ func (d *DeployConfig) CheckAddresses() error { if d.KromaPortalProxy == (common.Address{}) { return fmt.Errorf("%w: KromaPortalProxy cannot be address(0)", ErrInvalidDeployConfig) } - - // [Kroma: START] - if d.L1GovernanceTokenProxy == (common.Address{}) { - return fmt.Errorf("%w: L1GovernanceTokenProxy cannot be address(0)", ErrInvalidDeployConfig) - } - // [Kroma: END] return nil } @@ -551,7 +662,6 @@ func (d *DeployConfig) SetDeployments(deployments *L1Deployments) { // [Kroma: START] d.ValidatorPoolProxy = deployments.ValidatorPoolProxy - d.L1GovernanceTokenProxy = deployments.L1GovernanceTokenProxy // [Kroma: END] } @@ -736,6 +846,7 @@ type L1Deployments struct { ColosseumProxy common.Address `json:"ColosseumProxy"` L1GovernanceToken common.Address `json:"L1GovernanceToken"` L1GovernanceTokenProxy common.Address `json:"L1GovernanceTokenProxy"` + L1MintManager common.Address `json:"L1MintManager"` Poseidon2 common.Address `json:"Poseidon2"` SecurityCouncil common.Address `json:"SecurityCouncil"` SecurityCouncilProxy common.Address `json:"SecurityCouncilProxy"` @@ -747,6 +858,10 @@ type L1Deployments struct { UpgradeGovernorProxy common.Address `json:"UpgradeGovernorProxy"` ValidatorPool common.Address `json:"ValidatorPool"` ValidatorPoolProxy common.Address `json:"ValidatorPoolProxy"` + AssetManager common.Address `json:"AssetManager"` + AssetManagerProxy common.Address `json:"AssetManagerProxy"` + ValidatorManager common.Address `json:"ValidatorManager"` + ValidatorManagerProxy common.Address `json:"ValidatorManagerProxy"` ZKMerkleTrie common.Address `json:"ZKMerkleTrie"` ZKVerifier common.Address `json:"ZKVerifier"` ZKVerifierProxy common.Address `json:"ZKVerifierProxy"` @@ -942,17 +1057,9 @@ func NewL2ImmutableConfig(config *DeployConfig, block *types.Block) (*immutables GasPriceOracle: struct{}{}, L1Block: struct{}{}, /* [Kroma: START] + GovernanceToken: struct{}{}, LegacyMessagePasser: struct{}{}, - [Kroma: END] */ - // [Kroma: START] - GovernanceToken: struct { - Bridge common.Address - RemoteToken common.Address - }{ - Bridge: predeploys.L2StandardBridgeAddr, - RemoteToken: config.L1GovernanceTokenProxy, - }, - // [Kroma: END] + [Kroma: END]*/ L2ERC721Bridge: struct { OtherBridge common.Address Messenger common.Address @@ -973,6 +1080,7 @@ func NewL2ImmutableConfig(config *DeployConfig, block *types.Block) (*immutables Bridge: predeploys.L2StandardBridgeAddr, }, ProxyAdmin: struct{}{}, + // [Kroma: START] ProtocolVault: struct { Recipient common.Address }{ @@ -1062,13 +1170,15 @@ func NewL2StorageConfig(config *DeployConfig, block *types.Block) (state.Storage "symbol": "WETH", "decimals": 18, } + /* [Kroma: START] if config.EnableGovernance { storage["GovernanceToken"] = state.StorageValues{ "_name": config.GovernanceTokenName, "_symbol": config.GovernanceTokenSymbol, - // "_owner": config.GovernanceTokenOwner, + "_owner": config.GovernanceTokenOwner, } } + [Kroma: END] */ storage["ProxyAdmin"] = state.StorageValues{ "_owner": config.ProxyAdminOwner, } diff --git a/kroma-chain-ops/genesis/config_test.go b/kroma-chain-ops/genesis/config_test.go index 91540d1a5d..9f4d25da85 100644 --- a/kroma-chain-ops/genesis/config_test.go +++ b/kroma-chain-ops/genesis/config_test.go @@ -10,7 +10,6 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/rpc" - "github.com/stretchr/testify/require" ) @@ -115,6 +114,10 @@ func TestL1Deployments(t *testing.T) { require.NotEqual(t, deployments.UpgradeGovernorProxy, common.Address{}) require.NotEqual(t, deployments.ValidatorPool, common.Address{}) require.NotEqual(t, deployments.ValidatorPoolProxy, common.Address{}) + require.NotEqual(t, deployments.AssetManager, common.Address{}) + require.NotEqual(t, deployments.AssetManagerProxy, common.Address{}) + require.NotEqual(t, deployments.ValidatorManager, common.Address{}) + require.NotEqual(t, deployments.ValidatorManagerProxy, common.Address{}) require.NotEqual(t, deployments.ZKMerkleTrie, common.Address{}) require.NotEqual(t, deployments.ZKVerifier, common.Address{}) require.NotEqual(t, deployments.ZKVerifierProxy, common.Address{}) diff --git a/kroma-chain-ops/genesis/layer_one.go b/kroma-chain-ops/genesis/layer_one.go index 029dd0dd65..04df14ebbe 100644 --- a/kroma-chain-ops/genesis/layer_one.go +++ b/kroma-chain-ops/genesis/layer_one.go @@ -5,6 +5,7 @@ import ( "fmt" "math/big" + "github.com/ethereum-optimism/optimism/op-chain-ops/state" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/math" "github.com/ethereum/go-ethereum/core" @@ -13,7 +14,6 @@ import ( "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" - "github.com/ethereum-optimism/optimism/op-chain-ops/state" "github.com/kroma-network/kroma/kroma-bindings/bindings" "github.com/kroma-network/kroma/kroma-bindings/predeploys" ) @@ -101,6 +101,8 @@ func BuildL1DeveloperGenesis(config *DeployConfig, dump *gstate.Dump, l1Deployme return memDB.Genesis(), nil } +// [Kroma: START] + // PostProcessL1DeveloperGenesis will apply post processing to the L1 genesis // state. This is required to handle edge cases in the genesis generation. // `block.number` is used during deployment and without specifically setting @@ -119,7 +121,6 @@ func PostProcessL1DeveloperGenesis(stateDB *state.MemoryStateDB, deployments *L1 return fmt.Errorf("portal proxy doesn't exist at %s", deployments.KromaPortalProxy) } - // [Kroma: START] slot, err := getStorageSlot("KromaPortal", "params") if err != nil { return err @@ -192,6 +193,31 @@ func PostProcessL1DeveloperGenesis(stateDB *state.MemoryStateDB, deployments *L1 //setup beacon deposit contract log.Info("Set BeaconDepositContractCode") stateDB.SetCode(predeploys.BeaconDepositContractAddr, predeploys.BeaconDepositContractCode) + + //setup governance token balances on L1 + log.Info("Set GovernanceToken balance on L1") + if !stateDB.Exist(deployments.L1GovernanceTokenProxy) { + return fmt.Errorf("l1GovernanceToken proxy doesn't exist at %s", deployments.L1GovernanceTokenProxy) + } + + slot, err = getStorageSlot("GovernanceToken", "_balances") + if err != nil { + return err + } + + bigVal, success := new(big.Int).SetString("1000000000000000000000000", 10) + if !success { + return fmt.Errorf("failed to set governance token balance") + } + val = common.BigToHash(bigVal) + for _, account := range DevAccounts { + addrToBytes := append(make([]byte, 12), account.Bytes()...) + addrSlot := crypto.Keccak256Hash(append(addrToBytes, slot.Bytes()...)) + stateDB.SetState(deployments.L1GovernanceTokenProxy, addrSlot, val) + + log.Info("Post process update", "name", "GovernanceToken", "address", deployments.L1GovernanceTokenProxy, "slot", addrSlot.Hex(), "afterVal", val.Hex()) + } + return nil } diff --git a/kroma-chain-ops/genesis/layer_one_test.go b/kroma-chain-ops/genesis/layer_one_test.go index a755d21ca8..9f88cb9752 100644 --- a/kroma-chain-ops/genesis/layer_one_test.go +++ b/kroma-chain-ops/genesis/layer_one_test.go @@ -8,19 +8,19 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum-optimism/optimism/op-chain-ops/deployer" "github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/params" + "github.com/stretchr/testify/require" + "github.com/kroma-network/kroma/kroma-bindings/bindings" "github.com/kroma-network/kroma/kroma-bindings/predeploys" - "github.com/stretchr/testify/require" ) // TestBuildL1DeveloperGenesis tests that the L1 genesis block can be built @@ -61,6 +61,10 @@ func TestBuildL1DeveloperGenesis(t *testing.T) { require.NoError(t, err) require.Equal(t, deployments.ValidatorPoolProxy, valPoolAddr) + valMgrAddr, err := oracle.VALIDATORMANAGER(callOpts) + require.NoError(t, err) + require.Equal(t, deployments.ValidatorManagerProxy, valMgrAddr) + colosseumAddr, err := oracle.COLOSSEUM(callOpts) require.NoError(t, err) require.Equal(t, deployments.ColosseumProxy, colosseumAddr) diff --git a/kroma-chain-ops/genesis/layer_two_test.go b/kroma-chain-ops/genesis/layer_two_test.go index 8993a2630d..3c4fcf5cec 100644 --- a/kroma-chain-ops/genesis/layer_two_test.go +++ b/kroma-chain-ops/genesis/layer_two_test.go @@ -55,8 +55,10 @@ func testBuildL2Genesis(t *testing.T, config *genesis.DeployConfig) *core.Genesi require.Greater(t, len(account.Code), 0) adminSlot, ok := account.Storage[genesis.AdminSlot] - isProxy := !predeploy.ProxyDisabled || + isProxy := !predeploy.ProxyDisabled + /* [Kroma: START] (!config.EnableGovernance && addr == predeploys.GovernanceTokenAddr) + [Kroma: END] */ if isProxy { require.Equal(t, true, ok, name) require.Equal(t, eth.AddressAsLeftPaddedHash(predeploys.ProxyAdminAddr), adminSlot) @@ -90,7 +92,7 @@ func TestBuildL2MainnetGenesis(t *testing.T) { config.EnableGovernance = true config.FundDevAccounts = false gen := testBuildL2Genesis(t, config) - require.Equal(t, 537, len(gen.Alloc)) + require.Equal(t, 536, len(gen.Alloc)) } func TestBuildL2MainnetNoGovernanceGenesis(t *testing.T) { diff --git a/kroma-chain-ops/genesis/testdata/allocs-l1.json b/kroma-chain-ops/genesis/testdata/allocs-l1.json index de7a56aa73..0d59848248 100644 --- a/kroma-chain-ops/genesis/testdata/allocs-l1.json +++ b/kroma-chain-ops/genesis/testdata/allocs-l1.json @@ -1,8 +1,8 @@ { - "root": "cf8ec326cfee32971b15243e634760c85cdfe47bc1b532f73dd2029c34728916", + "root": "109739f58f03cb1297da4034e50b91353577bff33a7c3a0a93894a37ac36afc7", "accounts": { "0x0000000000000000000000000000000000000000": { - "balance": "172044992175896875", + "balance": "205840745175896875", "nonce": 0, "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", @@ -74,23 +74,35 @@ "0x0165878a594ca255338adfa4d48449f69242eb8f": { "balance": "0", "nonce": 1, - "root": "0x4238cbf95f2deec02a4d04a3128fbcbca4ba89d98c9f859bc11c696a96f2a124", + "root": "0x581ae04da8e2ffa203420263bc7eb09d342be7035bff8477f5d7e18b5e33c232", "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", "code": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", "storage": { - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "c6e7df5e7b4f2a278906862b61205850344d4e7d", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "59b670e9fa9d0a427751af201d676719a970857b", "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "5fbdb2315678afecb367f032d93f642f64180aa3" }, "key": "0x5df489e29c0253edd77505b9c678fec4c95c2ef043b278ef257f40c6ae972e95" }, + "0x09635f643e140090a9a8dcd712ed6285858cebef": { + "balance": "0", + "nonce": 1, + "root": "0xa7abcc6e1e344abdd761f5e3b08dfacd08b68a6533969baeeaf61e80fde624e4", + "codeHash": "0xb384f6d924b013f5f6d69dd2a55302d90e83b4ff460e8eb4478c367a8da27843", + "code": "0x6080604052600436106101b65760003560e01c806370a08231116100ec578063ad36d6cc1161008a578063d38dc7ee11610064578063d38dc7ee146105d7578063d8fe7642146105f7578063dd215c5d14610647578063facd743b1461066757600080fd5b8063ad36d6cc1461054b578063b7d636a51461059b578063d0e30db0146105cf57600080fd5b80638f09ade4116100c65780638f09ade4146104b2578063946765fd146104d2578063a51c9ace14610506578063ab91f1901461051b57600080fd5b806370a08231146104315780638129fc1c1461046757806382dae3aa1461047c57600080fd5b806339111af81161015957806354fd4d501161013357806354fd4d50146103725780635a544742146103c85780635df6a6bc146103e85780636641ea08146103fd57600080fd5b806339111af8146102f55780633a549046146103295780633ee4d4a31461033e57600080fd5b8063205c287811610195578063205c28781461025f5780632e1a7d4d1461028157806336086417146102a157806336b83469146102d557600080fd5b80621c2ff6146101bb5780630f43a6771461020c5780630ff754ea1461022b575b600080fd5b3480156101c757600080fd5b506101ef7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561021857600080fd5b506036545b604051908152602001610203565b34801561023757600080fd5b506101ef7f0000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e081565b34801561026b57600080fd5b5061027f61027a3660046124ff565b610687565b005b34801561028d57600080fd5b5061027f61029c36600461252b565b6107ba565b3480156102ad57600080fd5b506101ef7f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e81565b3480156102e157600080fd5b5061027f6102f0366004612544565b61086b565b34801561030157600080fd5b5061021d7f000000000000000000000000000000000000000000000000000000000000003281565b34801561033557600080fd5b506101ef610adc565b34801561034a57600080fd5b506101ef7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c881565b34801561037e57600080fd5b506103bb6040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b60405161020391906125f1565b3480156103d457600080fd5b5061027f6103e3366004612604565b610bfa565b3480156103f457600080fd5b5061027f610ea3565b34801561040957600080fd5b5061021d7f000000000000000000000000000000000000000000000000000000000000000481565b34801561043d57600080fd5b5061021d61044c366004612634565b6001600160a01b031660009081526033602052604090205490565b34801561047357600080fd5b5061027f610f22565b34801561048857600080fd5b50610491601481565b6040516fffffffffffffffffffffffffffffffff9091168152602001610203565b3480156104be57600080fd5b506104916104cd366004612604565b611099565b3480156104de57600080fd5b5061021d7f000000000000000000000000000000000000000000000000000000000000000a81565b34801561051257600080fd5b50610491606481565b34801561052757600080fd5b50610532620186a081565b60405167ffffffffffffffff9091168152602001610203565b34801561055757600080fd5b5061058b61056636600461252b565b7f00000000000000000000000000000000000000000000000000000000000000321090565b6040519015158152602001610203565b3480156105a757600080fd5b506104917f000000000000000000000000000000000000000000000000000000000000000181565b61027f611148565b3480156105e357600080fd5b5061027f6105f236600461266f565b61129a565b34801561060357600080fd5b5061061761061236600461252b565b611573565b6040805182516fffffffffffffffffffffffffffffffff9081168252602093840151169281019290925201610203565b34801561065357600080fd5b5061027f610662366004612604565b611692565b34801561067357600080fd5b5061058b610682366004612634565b6119f8565b61068f611a7e565b6001600160a01b0382166107105760405162461bcd60e51b815260206004820152603260248201527f56616c696461746f72506f6f6c3a2063616e6e6f74207769746864726177207460448201527f6f20746865207a65726f2061646472657373000000000000000000000000000060648201526084015b60405180910390fd5b61071a3382611ad7565b6000610737835a8460405180602001604052806000815250611d29565b9050806107ac5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f72506f6f6c3a20455448207472616e73666572206661696c60448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610707565b506107b660018055565b5050565b6107c2611a7e565b6107cc3382611ad7565b60006107e9335a8460405180602001604052806000815250611d29565b90508061085e5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f72506f6f6c3a20455448207472616e73666572206661696c60448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610707565b5061086860018055565b50565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ed9190612694565b6001600160a01b0316336001600160a01b0316146109735760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f7420436f6c60448201527f6f737365756d00000000000000000000000000000000000000000000000000006064820152608401610707565b60008381526039602090815260408083206001600160a01b03861684529091529020546fffffffffffffffffffffffffffffffff1680610a1b5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a207468652070656e64696e6720626f6e642060448201527f646f6573206e6f742065786973740000000000000000000000000000000000006064820152608401610707565b60008481526039602090815260408083206001600160a01b0387168452909152902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055610a7f826fffffffffffffffffffffffffffffffff8316611d49565b6040516fffffffffffffffffffffffffffffffff821681526001600160a01b03808416919085169086907f8c95336a279406edcc768d685e8eb6667368a77d840a188144b8e3719423198f9060200160405180910390a450505050565b6038546000906001600160a01b031615610bd55760007f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03166380446bd26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7491906126b1565b9050804210610bc4576000610b8982426126f9565b90507f0000000000000000000000000000000000000000000000000000000000000004811115610bc2576001600160a01b039250505090565b505b50506038546001600160a01b031690565b507f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c890565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7c9190612694565b6001600160a01b0316336001600160a01b031614610d025760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f7420436f6c60448201527f6f737365756d00000000000000000000000000000000000000000000000000006064820152608401610707565b60008281526034602052604090208054427001000000000000000000000000000000009091046fffffffffffffffffffffffffffffffff161015610dae5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a20746865206f757470757420697320616c7260448201527f656164792066696e616c697a65640000000000000000000000000000000000006064820152608401610707565b610dea827f00000000000000000000000000000000000000000000000000000000000000016fffffffffffffffffffffffffffffffff16611ad7565b60008381526039602090815260408083206001600160a01b0386168085529083529281902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000167f00000000000000000000000000000000000000000000000000000000000000016fffffffffffffffffffffffffffffffff16908117909155905190815285917f2904258f32adf74dd8f23ad6f17ff50209896039c8ee3d4728ff55bd05c4cf2a910160405180910390a3505050565b6000610ead611e7d565b9050806108685760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f72506f6f6c3a206e6f20626f6e6420746861742063616e2060448201527f626520756e626f6e6400000000000000000000000000000000000000000000006064820152608401610707565b600054610100900460ff1615808015610f425750600054600160ff909116105b80610f5c5750303b158015610f5c575060005460ff166001145b610fce5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610707565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561102c57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b61103461212e565b801561086857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b60008281526039602090815260408083206001600160a01b03851684529091528120546fffffffffffffffffffffffffffffffff16806111415760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a207468652070656e64696e6720626f6e642060448201527f646f6573206e6f742065786973740000000000000000000000000000000000006064820152608401610707565b9392505050565b6111737f00000000000000000000000000000000000000000000000000000000000000326001612710565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316636abcf5636040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f591906126b1565b1061128e5760405162461bcd60e51b815260206004820152604260248201527f56616c696461746f72506f6f6c3a206f6e6c792063616e206465706f7369742060448201527f746f2056616c696461746f72506f6f6c206265666f7265207465726d696e617460648201527f6564000000000000000000000000000000000000000000000000000000000000608482015260a401610707565b6112983334611d49565b565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c916146113385760405162461bcd60e51b815260206004820152602b60248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f74204c324f60448201527f75747075744f7261636c650000000000000000000000000000000000000000006064820152608401610707565b6000828152603460205260409020805470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16156113e15760405162461bcd60e51b815260206004820152603c60248201527f56616c696461746f72506f6f6c3a20626f6e64206f662074686520676976656e60448201527f206f757470757420696e64657820616c726561647920657869737473000000006064820152608401610707565b6113e9611e7d565b506040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018490526000907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063b0ea09a890602401602060405180830381865afa15801561146b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061148f9190612694565b90506114cd817f00000000000000000000000000000000000000000000000000000000000000016fffffffffffffffffffffffffffffffff16611ad7565b7f00000000000000000000000000000000000000000000000000000000000000016fffffffffffffffffffffffffffffffff9081167001000000000000000000000000000000009185169182028117845560408051918252602082019290925285916001600160a01b038416917f5ca130257b8f76f72ad2965efcbe166f3918d820e4a49956e70081ea311f97c4910160405180910390a361156d6121ab565b50505050565b6040805180820190915260008082526020820152600082815260346020526040902080546fffffffffffffffffffffffffffffffff16158015906115dd5750805470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1615155b61164f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2074686520626f6e6420646f6573206e6f7460448201527f20657869737400000000000000000000000000000000000000000000000000006064820152608401610707565b6040805180820190915290546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000090910416602082015292915050565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117149190612694565b6001600160a01b0316336001600160a01b03161461179a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f7420436f6c60448201527f6f737365756d00000000000000000000000000000000000000000000000000006064820152608401610707565b60008281526034602052604090208054427001000000000000000000000000000000009091046fffffffffffffffffffffffffffffffff1610156118465760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a20746865206f757470757420697320616c7260448201527f656164792066696e616c697a65640000000000000000000000000000000000006064820152608401610707565b60008381526039602090815260408083206001600160a01b03861684529091529020546fffffffffffffffffffffffffffffffff16806118ee5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a207468652070656e64696e6720626f6e642060448201527f646f6573206e6f742065786973740000000000000000000000000000000000006064820152608401610707565b600060646118fd601484612728565b611907919061278f565b9050600061191582846127be565b60008781526039602090815260408083206001600160a01b038a811680865291845282852080547fffffffffffffffffffffffffffffffff000000000000000000000000000000009081169091558a549081166fffffffffffffffffffffffffffffffff91821688018216178b557f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e9091168552603384529382902080548886160190559051928416835292935088917f383f9b8b5a1fc2ec555726eb895621a312042e18b764135fa12ef1a520ad30db910160405180910390a3505050505050565b6036546000908103611a0c57506000919050565b6001600160a01b038216611a2257506000919050565b6001600160a01b0382166000818152603760205260409020546036805491929183908110611a5257611a526127ef565b6000918252602090912001546001600160a01b0316149392505050565b6001600160a01b03163b151590565b600260015403611ad05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610707565b6002600155565b6001600160a01b03821660009081526033602052604090205481811015611b655760405162461bcd60e51b8152602060048201526024808201527f56616c696461746f72506f6f6c3a20696e73756666696369656e742062616c6160448201527f6e636573000000000000000000000000000000000000000000000000000000006064820152608401610707565b611b6f82826126f9565b90507f00000000000000000000000000000000000000000000000000000000000000016fffffffffffffffffffffffffffffffff1681108015611bb65750611bb6836119f8565b15611d0957603654600090611bcd906001906126f9565b90508015611c85576001600160a01b0384166000908152603760205260408120546036805491929184908110611c0557611c056127ef565b600091825260209091200154603680546001600160a01b039092169250829184908110611c3457611c346127ef565b600091825260208083209190910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03948516179055929091168152603790915260409020555b6001600160a01b0384166000908152603760205260408120556036805480611caf57611caf61281e565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055505b6001600160a01b0390921660009081526033602052604090209190915550565b600080600080845160208601878a8af19695505050505050565b60018055565b6001600160a01b038216600090815260336020526040812054611d6d908390612710565b90507f00000000000000000000000000000000000000000000000000000000000000016fffffffffffffffffffffffffffffffff168110158015611db75750611db5836119f8565b155b15611d09577f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e6001600160a01b0316836001600160a01b031614611d0957603680546001600160a01b03949094166000818152603760209081526040808320889055600188019094557f4a11f94e20a93c79f6ec743a1954ec4fc2c08429ae2122118bf234b2185c81b890960180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690921790915560339094529092209190915550565b60355460408051608081018252600080825260208201819052918101829052606081018290529091908290819060005b7f000000000000000000000000000000000000000000000000000000000000000a81101561207857600085815260346020526040902080546fffffffffffffffffffffffffffffffff80821696509194507001000000000000000000000000000000009004164210801590611f3457506000846fffffffffffffffffffffffffffffffff16115b156120785760008581526034602052604080822091909155517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018690527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063a25ae55790602401608060405180830381865afa158015611fc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fec919061284d565b915061200e8260000151856fffffffffffffffffffffffffffffffff16611d49565b81516040516fffffffffffffffffffffffffffffffff861681526001600160a01b039091169086907f7047a0fb8bfae78c0ebbd4117437945bb85240453235ac4fd2e55712eb5bf0c39060200160405180910390a361206c82612379565b60019485019401611ead565b80156121225760358590556040517f9902cdc0000000000000000000000000000000000000000000000000000000008152600481018690527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031690639902cdc090602401600060405180830381600087803b1580156120fe57600080fd5b505af1158015612112573d6000803e3d6000fd5b5050505060019550505050505090565b60009550505050505090565b600054610100900460ff16611d435760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610707565b60365480158015906121bf57506000603554115b1561234e5760007f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663a25ae557600160355461220491906126f9565b6040518263ffffffff1660e01b815260040161222291815260200190565b608060405180830381865afa15801561223f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612263919061284d565b9050600082826020015143414460014361227d91906126f9565b6040805160208101969096528501939093527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606092831b1691840191909152607483015240609482015260b4016040516020818303038152906040528051906020012060001c6122ee91906128f0565b905060368181548110612303576123036127ef565b600091825260209091200154603880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216919091179055506108689050565b603880547fffffffffffffffffffffffff000000000000000000000000000000000000000016905550565b805160608201516040516001600160a01b037f0000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e0169263c30af3889273420000000000000000000000000000000000000892620186a0927f21670f220000000000000000000000000000000000000000000000000000000092612423926024016001600160a01b039290921682526fffffffffffffffffffffffffffffffff16602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b90921682526124b5939291600401612904565b600060405180830381600087803b1580156124cf57600080fd5b505af11580156124e3573d6000803e3d6000fd5b5050505050565b6001600160a01b038116811461086857600080fd5b6000806040838503121561251257600080fd5b823561251d816124ea565b946020939093013593505050565b60006020828403121561253d57600080fd5b5035919050565b60008060006060848603121561255957600080fd5b83359250602084013561256b816124ea565b9150604084013561257b816124ea565b809150509250925092565b6000815180845260005b818110156125ac57602081850181015186830182015201612590565b818111156125be576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006111416020830184612586565b6000806040838503121561261757600080fd5b823591506020830135612629816124ea565b809150509250929050565b60006020828403121561264657600080fd5b8135611141816124ea565b6fffffffffffffffffffffffffffffffff8116811461086857600080fd5b6000806040838503121561268257600080fd5b82359150602083013561262981612651565b6000602082840312156126a657600080fd5b8151611141816124ea565b6000602082840312156126c357600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561270b5761270b6126ca565b500390565b60008219821115612723576127236126ca565b500190565b60006fffffffffffffffffffffffffffffffff80831681851681830481118215151615612757576127576126ca565b02949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006fffffffffffffffffffffffffffffffff808416806127b2576127b2612760565b92169190910492915050565b60006fffffffffffffffffffffffffffffffff838116908316818110156127e7576127e76126ca565b039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006080828403121561285f57600080fd5b6040516080810181811067ffffffffffffffff821117156128a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405282516128b7816124ea565b81526020838101519082015260408301516128d181612651565b604082015260608301516128e481612651565b60608201529392505050565b6000826128ff576128ff612760565b500690565b6001600160a01b038416815267ffffffffffffffff831660208201526060604082015260006129366060830184612586565b9594505050505056fea164736f6c634300080f000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "01", + "0x0000000000000000000000000000000000000000000000000000000000000001": "01" + }, + "key": "0xaebd2e1514b4e7a57d6aea7d9336de4a0ebf14a8dbe0b3d364f6030b7abedd33" + }, "0x0b306bf915c4d645ff596e518faf3f9669b97016": { "balance": "0", "nonce": 1, - "root": "0x0f2ee44fddf9046798c055026d1b96ed27f580fa54ee11ea497c32a07c0d00fe", + "root": "0xbd2c493f99ef428103cae815ab63a8f0a67756cefb1fbc9915ce3dd2ed7f8e56", "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", "code": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", "storage": { - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "4c5859f0f772848b2d91f1d83e2fe57935348029", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "82e01223d51eb87e16a03e24687edf0f294da6f1", "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "5fbdb2315678afecb367f032d93f642f64180aa3" }, "key": "0xa3571888cfbca68776ab582afabed39268990974a4835e694b767474e2d63a4d" @@ -126,18 +138,63 @@ "code": "0x6080604052600436106101d15760003560e01c80638065657f116100f7578063bc197c8111610095578063d547741f11610064578063d547741f1461068a578063e38335e5146106aa578063f23a6e61146106bd578063f27a0c921461070257600080fd5b8063bc197c81146105d8578063c4c4c7b31461061d578063c4d252f51461063d578063d45c44351461065d57600080fd5b806391d14854116100d157806391d148541461051c578063a217fddf1461056f578063b08e51c014610584578063b1c5f427146105b857600080fd5b80638065657f146104a85780638f2a0bb0146104c85780638f61f4f5146104e857600080fd5b8063248a9ca31161016f57806336568abe1161013e57806336568abe146103f257806354fd4d5014610412578063584b153e1461046857806364d623531461048857600080fd5b8063248a9ca3146103525780632ab0f529146103825780632f2ff15d146103b257806331d50750146103d257600080fd5b80630d3cf6fc116101ab5780630d3cf6fc14610276578063134008d3146102aa57806313bc9f20146102bd578063150b7a02146102dd57600080fd5b806301d5062a146101dd57806301ffc9a7146101ff57806307bd02651461023457600080fd5b366101d857005b600080fd5b3480156101e957600080fd5b506101fd6101f8366004612019565b610717565b005b34801561020b57600080fd5b5061021f61021a36600461208e565b6107ed565b60405190151581526020015b60405180910390f35b34801561024057600080fd5b506102687fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b60405190815260200161022b565b34801561028257600080fd5b506102687f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca581565b6101fd6102b83660046120d0565b610849565b3480156102c957600080fd5b5061021f6102d836600461213c565b610941565b3480156102e957600080fd5b506103216102f8366004612261565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff00000000000000000000000000000000000000000000000000000000909116815260200161022b565b34801561035e57600080fd5b5061026861036d36600461213c565b60009081526065602052604090206001015490565b34801561038e57600080fd5b5061021f61039d36600461213c565b60009081526097602052604090205460011490565b3480156103be57600080fd5b506101fd6103cd3660046122c9565b610967565b3480156103de57600080fd5b5061021f6103ed36600461213c565b610991565b3480156103fe57600080fd5b506101fd61040d3660046122c9565b6109aa565b34801561041e57600080fd5b5061045b6040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161022b9190612321565b34801561047457600080fd5b5061021f61048336600461213c565b610a48565b34801561049457600080fd5b506101fd6104a336600461213c565b610a5f565b3480156104b457600080fd5b506102686104c33660046120d0565b610b15565b3480156104d457600080fd5b506101fd6104e33660046123b7565b610b54565b3480156104f457600080fd5b506102687fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b34801561052857600080fd5b5061021f6105373660046122c9565b600091825260656020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b34801561057b57600080fd5b50610268600081565b34801561059057600080fd5b506102687ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b3480156105c457600080fd5b506102686105d3366004612469565b610d93565b3480156105e457600080fd5b506103216105f33660046125a1565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b34801561062957600080fd5b506101fd6106383660046126ad565b610dd8565b34801561064957600080fd5b506101fd61065836600461213c565b610f58565b34801561066957600080fd5b5061026861067836600461213c565b60009081526097602052604090205490565b34801561069657600080fd5b506101fd6106a53660046122c9565b611039565b6101fd6106b8366004612469565b61105e565b3480156106c957600080fd5b506103216106d836600461272b565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b34801561070e57600080fd5b50609854610268565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610741816112d7565b6000610751898989898989610b15565b905061075d81846112e4565b6000817f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8b8b8b8b8b8a604051610799969594939291906127d9565b60405180910390a383156107e257807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d0387856040516107d991815260200190565b60405180910390a25b505050505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f4e2312e00000000000000000000000000000000000000000000000000000000014806108435750610843826113f8565b92915050565b600080527f7dc9f88e569f94faad6fa0d44dd44858caf3f34f1bd1c985800aedf5793aad8b6020527fa01e231ca478cf51f663e103939e98de36fa76d3e4e0b1de673dc711acc3a01b547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff166108c6576108c6813361148f565b60006108d6888888888888610b15565b90506108e2818561152f565b6108ee88888888611637565b6000817fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b588a8a8a8a6040516109269493929190612824565b60405180910390a36109378161171a565b5050505050505050565b6000818152609760205260408120546001811180156109605750428111155b9392505050565b600082815260656020526040902060010154610982816112d7565b61098c83836117a9565b505050565b60008181526097602052604081205481905b1192915050565b73ffffffffffffffffffffffffffffffffffffffff81163314610a3a5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b610a44828261189d565b5050565b6000818152609760205260408120546001906109a3565b333014610ad45760405162461bcd60e51b815260206004820152602b60248201527f54696d656c6f636b436f6e74726f6c6c65723a2063616c6c6572206d7573742060448201527f62652074696d656c6f636b0000000000000000000000000000000000000000006064820152608401610a31565b60985460408051918252602082018390527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a1609855565b6000868686868686604051602001610b32969594939291906127d9565b6040516020818303038152906040528051906020012090509695505050505050565b7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1610b7e816112d7565b888714610bf35760405162461bcd60e51b815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f74636800000000000000000000000000000000000000000000000000000000006064820152608401610a31565b888514610c685760405162461bcd60e51b815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f74636800000000000000000000000000000000000000000000000000000000006064820152608401610a31565b6000610c7a8b8b8b8b8b8b8b8b610d93565b9050610c8681846112e4565b60005b8a811015610d445780827f4cf4410cc57040e44862ef0f45f3dd5a5e02db8eb8add648d4b0e236f1d07dca8e8e85818110610cc657610cc6612864565b9050602002016020810190610cdb9190612893565b8d8d86818110610ced57610ced612864565b905060200201358c8c87818110610d0657610d06612864565b9050602002810190610d1891906128ae565b8c8b604051610d2c969594939291906127d9565b60405180910390a3610d3d81612942565b9050610c89565b508315610d8657807f20fda5fd27a1ea7bf5b9567f143ac5470bb059374a27e8f67cb44f946f6d038785604051610d7d91815260200190565b60405180910390a25b5050505050505050505050565b60008888888888888888604051602001610db4989796959493929190612a2a565b60405160208183030381529060405280519060200120905098975050505050505050565b600054610100900460ff1615808015610df85750600054600160ff909116105b80610e125750303b158015610e12575060005460ff166001145b610e845760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a31565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610ee257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610eee85858585611958565b8015610f5157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050565b7ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783610f82816112d7565b610f8b82610a48565b610ffd5760405162461bcd60e51b815260206004820152603160248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20636160448201527f6e6e6f742062652063616e63656c6c65640000000000000000000000000000006064820152608401610a31565b6000828152609760205260408082208290555183917fbaa1eb22f2a492ba1a5fea61b8df4d27c6c8b5f3971e63bb58fa14ff72eedb7091a25050565b600082815260656020526040902060010154611054816112d7565b61098c838361189d565b600080527f7dc9f88e569f94faad6fa0d44dd44858caf3f34f1bd1c985800aedf5793aad8b6020527fa01e231ca478cf51f663e103939e98de36fa76d3e4e0b1de673dc711acc3a01b547fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e639060ff166110db576110db813361148f565b8786146111505760405162461bcd60e51b815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f74636800000000000000000000000000000000000000000000000000000000006064820152608401610a31565b8784146111c55760405162461bcd60e51b815260206004820152602360248201527f54696d656c6f636b436f6e74726f6c6c65723a206c656e677468206d69736d6160448201527f74636800000000000000000000000000000000000000000000000000000000006064820152608401610a31565b60006111d78a8a8a8a8a8a8a8a610d93565b90506111e3818561152f565b60005b898110156112c15760008b8b8381811061120257611202612864565b90506020020160208101906112179190612893565b905060008a8a8481811061122d5761122d612864565b9050602002013590503660008a8a8681811061124b5761124b612864565b905060200281019061125d91906128ae565b9150915061126d84848484611637565b84867fc2617efa69bab66782fa219543714338489c4e9e178271560a91b82c3f612b58868686866040516112a49493929190612824565b60405180910390a350505050806112ba90612942565b90506111e6565b506112cb8161171a565b50505050505050505050565b6112e1813361148f565b50565b6112ed82610991565b156113605760405162461bcd60e51b815260206004820152602f60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20616c60448201527f7265616479207363686564756c656400000000000000000000000000000000006064820152608401610a31565b6098548110156113d85760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a20696e73756666696369656e7460448201527f2064656c617900000000000000000000000000000000000000000000000000006064820152608401610a31565b6113e28142612afb565b6000928352609760205260409092209190915550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061084357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610843565b600082815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610a44576114cf816119e7565b6114da836020611a06565b6040516020016114eb929190612b13565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905262461bcd60e51b8252610a3191600401612321565b61153882610941565b6115aa5760405162461bcd60e51b815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f74207265616479000000000000000000000000000000000000000000006064820152608401610a31565b8015806115c557506000818152609760205260409020546001145b610a445760405162461bcd60e51b815260206004820152602660248201527f54696d656c6f636b436f6e74726f6c6c65723a206d697373696e67206465706560448201527f6e64656e637900000000000000000000000000000000000000000000000000006064820152608401610a31565b60008473ffffffffffffffffffffffffffffffffffffffff16848484604051611661929190612b94565b60006040518083038185875af1925050503d806000811461169e576040519150601f19603f3d011682016040523d82523d6000602084013e6116a3565b606091505b5050905080610f515760405162461bcd60e51b815260206004820152603360248201527f54696d656c6f636b436f6e74726f6c6c65723a20756e6465726c79696e67207460448201527f72616e73616374696f6e207265766572746564000000000000000000000000006064820152608401610a31565b61172381610941565b6117955760405162461bcd60e51b815260206004820152602a60248201527f54696d656c6f636b436f6e74726f6c6c65723a206f7065726174696f6e20697360448201527f206e6f74207265616479000000000000000000000000000000000000000000006064820152608401610a31565b600090815260976020526040902060019055565b600082815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16610a4457600082815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561183f3390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b600082815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff1615610a4457600082815260656020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b600054610100900460ff166119d55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a31565b6119e184848484611c2f565b50505050565b606061084373ffffffffffffffffffffffffffffffffffffffff831660145b60606000611a15836002612ba4565b611a20906002612afb565b67ffffffffffffffff811115611a3857611a38612155565b6040519080825280601f01601f191660200182016040528015611a62576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611a9957611a99612864565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611afc57611afc612864565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000611b38846002612ba4565b611b43906001612afb565b90505b6001811115611be0577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110611b8457611b84612864565b1a60f81b828281518110611b9a57611b9a612864565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c93611bd981612be1565b9050611b46565b5083156109605760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a31565b600054610100900460ff16611cac5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a31565b611cd67f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca580611f52565b611d207fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc17f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5611f52565b611d6a7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e637f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5611f52565b611db47ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f7837f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5611f52565b611dde7f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca530611f9d565b73ffffffffffffffffffffffffffffffffffffffff811615611e2457611e247f5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca582611f9d565b60005b8351811015611eb957611e737fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1858381518110611e6657611e66612864565b6020026020010151611f9d565b611ea97ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783858381518110611e6657611e66612864565b611eb281612942565b9050611e27565b5060005b8251811015611f0c57611efc7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63848381518110611e6657611e66612864565b611f0581612942565b9050611ebd565b5060988490556040805160008152602081018690527f11c24f4ead16507c69ac467fbd5e4eed5fb5c699626d2cc6d66421df253886d5910160405180910390a150505050565b600082815260656020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b610a4482826117a9565b803573ffffffffffffffffffffffffffffffffffffffff81168114611fcb57600080fd5b919050565b60008083601f840112611fe257600080fd5b50813567ffffffffffffffff811115611ffa57600080fd5b60208301915083602082850101111561201257600080fd5b9250929050565b600080600080600080600060c0888a03121561203457600080fd5b61203d88611fa7565b965060208801359550604088013567ffffffffffffffff81111561206057600080fd5b61206c8a828b01611fd0565b989b979a50986060810135976080820135975060a09091013595509350505050565b6000602082840312156120a057600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461096057600080fd5b60008060008060008060a087890312156120e957600080fd5b6120f287611fa7565b955060208701359450604087013567ffffffffffffffff81111561211557600080fd5b61212189828a01611fd0565b979a9699509760608101359660809091013595509350505050565b60006020828403121561214e57600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156121cb576121cb612155565b604052919050565b600082601f8301126121e457600080fd5b813567ffffffffffffffff8111156121fe576121fe612155565b61222f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601612184565b81815284602083860101111561224457600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561227757600080fd5b61228085611fa7565b935061228e60208601611fa7565b925060408501359150606085013567ffffffffffffffff8111156122b157600080fd5b6122bd878288016121d3565b91505092959194509250565b600080604083850312156122dc57600080fd5b823591506122ec60208401611fa7565b90509250929050565b60005b838110156123105781810151838201526020016122f8565b838111156119e15750506000910152565b60208152600082518060208401526123408160408501602087016122f5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008083601f84011261238457600080fd5b50813567ffffffffffffffff81111561239c57600080fd5b6020830191508360208260051b850101111561201257600080fd5b600080600080600080600080600060c08a8c0312156123d557600080fd5b893567ffffffffffffffff808211156123ed57600080fd5b6123f98d838e01612372565b909b50995060208c013591508082111561241257600080fd5b61241e8d838e01612372565b909950975060408c013591508082111561243757600080fd5b506124448c828d01612372565b9a9d999c50979a969997986060880135976080810135975060a0013595509350505050565b60008060008060008060008060a0898b03121561248557600080fd5b883567ffffffffffffffff8082111561249d57600080fd5b6124a98c838d01612372565b909a50985060208b01359150808211156124c257600080fd5b6124ce8c838d01612372565b909850965060408b01359150808211156124e757600080fd5b506124f48b828c01612372565b999c989b509699959896976060870135966080013595509350505050565b600067ffffffffffffffff82111561252c5761252c612155565b5060051b60200190565b600082601f83011261254757600080fd5b8135602061255c61255783612512565b612184565b82815260059290921b8401810191818101908684111561257b57600080fd5b8286015b84811015612596578035835291830191830161257f565b509695505050505050565b600080600080600060a086880312156125b957600080fd5b6125c286611fa7565b94506125d060208701611fa7565b9350604086013567ffffffffffffffff808211156125ed57600080fd5b6125f989838a01612536565b9450606088013591508082111561260f57600080fd5b61261b89838a01612536565b9350608088013591508082111561263157600080fd5b5061263e888289016121d3565b9150509295509295909350565b600082601f83011261265c57600080fd5b8135602061266c61255783612512565b82815260059290921b8401810191818101908684111561268b57600080fd5b8286015b84811015612596576126a081611fa7565b835291830191830161268f565b600080600080608085870312156126c357600080fd5b84359350602085013567ffffffffffffffff808211156126e257600080fd5b6126ee8883890161264b565b9450604087013591508082111561270457600080fd5b506127118782880161264b565b92505061272060608601611fa7565b905092959194509250565b600080600080600060a0868803121561274357600080fd5b61274c86611fa7565b945061275a60208701611fa7565b93506040860135925060608601359150608086013567ffffffffffffffff81111561278457600080fd5b61263e888289016121d3565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff8716815285602082015260a06040820152600061280f60a083018688612790565b60608301949094525060800152949350505050565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152600061285a606083018486612790565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156128a557600080fd5b61096082611fa7565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126128e357600080fd5b83018035915067ffffffffffffffff8211156128fe57600080fd5b60200191503681900382131561201257600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361297357612973612913565b5060010190565b81835260006020808501808196508560051b810191508460005b87811015612a1d57828403895281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18836030181126129d357600080fd5b8701858101903567ffffffffffffffff8111156129ef57600080fd5b8036038213156129fe57600080fd5b612a09868284612790565b9a87019a9550505090840190600101612994565b5091979650505050505050565b60a0808252810188905260008960c08301825b8b811015612a785773ffffffffffffffffffffffffffffffffffffffff612a6384611fa7565b16825260209283019290910190600101612a3d565b5083810360208501528881527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff891115612ab157600080fd5b8860051b9150818a602083013781810191505060208101600081526020848303016040850152612ae281888a61297a565b6060850196909652505050608001529695505050505050565b60008219821115612b0e57612b0e612913565b500190565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351612b4b8160178501602088016122f5565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351612b888160288401602088016122f5565b01602801949350505050565b8183823760009101908152919050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612bdc57612bdc612913565b500290565b600081612bf057612bf0612913565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019056fea164736f6c634300080f000a", "key": "0x02cd05fe91acd2c03ff4b49cc68eb47d53a81fbb0da60bf91d843684f767cb39" }, + "0x1291be112d480055dafd8a610b7d1e203891c274": { + "balance": "0", + "nonce": 1, + "root": "0xa7502d7e0c33edc1e464c30248922e1669db5c2bce2c79d47b9b7ab9538c23a1", + "codeHash": "0x8ce20df047bf750856c6c445487e6af6c20f0b6ca0bddbc3e2933e4c9beb255d", + "code": "0x608060405234801561001057600080fd5b50600436106101005760003560e01c80637eb1184511610097578063d1bc76a111610066578063d1bc76a114610229578063e30c39781461023c578063e4fc6b6d1461025a578063f2fde38b1461026257600080fd5b80637eb11845146101ee5780638da5cb5b146101f857806398f1312e14610216578063baee5ed41461022157600080fd5b8063457c3977116100d3578063457c3977146101965780634f02c420146101a9578063715018a6146101de57806379ba5097146101e657600080fd5b80631249c58b1461010557806321e5e2c41461010f57806328df3f18146101425780632efd46d61461014a575b600080fd5b61010d610275565b005b61012f61011d366004610c7a565b60036020526000908152604090205481565b6040519081526020015b60405180910390f35b61010d610557565b6101717f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe5793534802981565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610139565b61010d6101a4366004610c7a565b6105e1565b6001546101ce9074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610139565b61010d61068d565b61010d6106a1565b61012f620186a081565b60005473ffffffffffffffffffffffffffffffffffffffff16610171565b61012f633b9aca0081565b61010d610756565b610171610237366004610cb7565b610870565b60015473ffffffffffffffffffffffffffffffffffffffff16610171565b61010d6108a7565b61010d610270366004610c7a565b610aa3565b61027d610bc8565b60015474010000000000000000000000000000000000000000900460ff161561032d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4d696e744d616e616765723a20616c7265616479206d696e746564206f6e207460448201527f68697320636861696e000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b60007f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe5793534802973ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561039a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103be9190610cd0565b6103c990600a610e44565b6103d790633b9aca00610e53565b90506000805b60025481101561046d576000600282815481106103fc576103fc610e90565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168083526003909152604082205490925090620186a061043f8388610e53565b6104499190610ebf565b90506104558186610efa565b9450505050808061046590610f12565b9150506103dd565b506040517f40c10f19000000000000000000000000000000000000000000000000000000008152306004820152602481018290527f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe5793534802973ffffffffffffffffffffffffffffffffffffffff16906340c10f1990604401600060405180830381600087803b1580156104fc57600080fd5b505af1158015610510573d6000803e3d6000fd5b5050600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905550505050565b61055f610bc8565b7f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe5793534802973ffffffffffffffffffffffffffffffffffffffff166379ba50976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105c757600080fd5b505af11580156105db573d6000803e3d6000fd5b50505050565b6105e9610bc8565b6040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe57935348029169063f2fde38b90602401600060405180830381600087803b15801561067257600080fd5b505af1158015610686573d6000803e3d6000fd5b5050505050565b610695610bc8565b61069f6000610c49565b565b600154339073ffffffffffffffffffffffffffffffffffffffff16811461074a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610324565b61075381610c49565b50565b61075e610bc8565b60015474010000000000000000000000000000000000000000900460ff16610808576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4d696e744d616e616765723a206e6f74206d696e746564206265666f7265207260448201527f656e6f756e6365206f776e6572736869700000000000000000000000000000006064820152608401610324565b7f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe5793534802973ffffffffffffffffffffffffffffffffffffffff1663715018a66040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105c757600080fd5b6002818154811061088057600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b6108af610bc8565b60007f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe5793534802973ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561091c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109409190610cd0565b61094b90600a610e44565b61095990633b9aca00610e53565b905060005b600254811015610a9f5760006002828154811061097d5761097d610e90565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168083526003909152604082205490925090620186a06109c08387610e53565b6109ca9190610ebf565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018390529192507f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe579353480299091169063a9059cbb906044016020604051808303816000875af1158015610a64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a889190610f4a565b505050508080610a9790610f12565b91505061095e565b5050565b610aab610bc8565b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009091168117909155610b0e60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461069f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610324565b600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905561075381610b53565b600060208284031215610c8c57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610cb057600080fd5b9392505050565b600060208284031215610cc957600080fd5b5035919050565b600060208284031215610ce257600080fd5b815160ff81168114610cb057600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b80851115610d7b57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610d6157610d61610cf3565b80851615610d6e57918102915b93841c9390800290610d27565b509250929050565b600082610d9257506001610e3e565b81610d9f57506000610e3e565b8160018114610db55760028114610dbf57610ddb565b6001915050610e3e565b60ff841115610dd057610dd0610cf3565b50506001821b610e3e565b5060208310610133831016604e8410600b8410161715610dfe575081810a610e3e565b610e088383610d22565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610e3a57610e3a610cf3565b0290505b92915050565b6000610cb060ff841683610d83565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610e8b57610e8b610cf3565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082610ef5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008219821115610f0d57610f0d610cf3565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610f4357610f43610cf3565b5060010190565b600060208284031215610f5c57600080fd5b81518015158114610cb057600080fdfea164736f6c634300080f000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "f39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "0x0000000000000000000000000000000000000000000000000000000000000001": "f39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "0x0000000000000000000000000000000000000000000000000000000000000002": "02", + "0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace": "14dc79964da2c08b23698b3d3cc7ca32193d9955", + "0x405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf": "a0ee7a142d267c1f36714e4a8f75612f20a79720", + "0x6a706e96617ceafd46f24757f71aad32b88c8bf0b8ae22ec3de611582d2d4a6c": "0bb8", + "0xc9f51ff2393193a07f116cb1ed67be0783387c719e9662a8d0ec4684dcfc0fa0": "07d0" + }, + "key": "0x9f13a9db1db219667c2765a1d3e186c1b8d46609970857246a8ecb5e24965724" + }, + "0x1613beb3b2c4f22ee086b2b38c1476a3ce7f78e8": { + "balance": "0", + "nonce": 1, + "root": "0xda52dcd6b9f0c4f11844b3c53e8aec08d63878174a1bc8693de739b3d12a180a", + "codeHash": "0xe10ca548324ef0fd3b1824523565d8177bf54c496af23fe5dde19da4ac723b06", + "code": "0x6080604052600436106101475760003560e01c80638c3152e9116100c0578063cff0ab9611610074578063e965084c11610059578063e965084c146104b5578063e9e05c4214610541578063f04987501461055457600080fd5b8063cff0ab96146103f4578063d53a822f1461049557600080fd5b8063a14238e7116100a5578063a14238e714610370578063b98debbf146103a0578063c30af388146103d457600080fd5b80638c3152e9146103235780639bf62d821461034357600080fd5b80635865b607116101175780636dbffb78116100fc5780636dbffb78146102ba578063724c184c146102da5780638456cb591461030e57600080fd5b80635865b6071461025c5780635c975abb1461029057600080fd5b80621c2ff6146101735780630757b244146101d15780633f4ba83a146101f157806354fd4d501461020657600080fd5b3661016e5761016c3334620186a0600060405180602001604052806000815250610588565b005b600080fd5b34801561017f57600080fd5b506101a77f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101dd57600080fd5b5061016c6101ec366004612a08565b61076e565b3480156101fd57600080fd5b5061016c610d72565b34801561021257600080fd5b5061024f6040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516101c89190612b5f565b34801561026857600080fd5b506101a77f00000000000000000000000068b1d87f95878fe05b998f19b66f4baba5de1aed81565b34801561029c57600080fd5b506035546102aa9060ff1681565b60405190151581526020016101c8565b3480156102c657600080fd5b506102aa6102d5366004612b72565b610e7b565b3480156102e657600080fd5b506101a77f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e81565b34801561031a57600080fd5b5061016c610f52565b34801561032f57600080fd5b5061016c61033e366004612b8b565b611057565b34801561034f57600080fd5b506032546101a79073ffffffffffffffffffffffffffffffffffffffff1681565b34801561037c57600080fd5b506102aa61038b366004612b72565b60336020526000908152604090205460ff1681565b3480156103ac57600080fd5b506101a77f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b3480156103e057600080fd5b5061016c6103ef366004612bd8565b611825565b34801561040057600080fd5b5060015461045c906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff92831660208501529116908201526060016101c8565b3480156104a157600080fd5b5061016c6104b0366004612c46565b611983565b3480156104c157600080fd5b506105136104d0366004612b72565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff92831660208501529116908201526060016101c8565b61016c61054f366004612c63565b610588565b34801561056057600080fd5b506101a77f000000000000000000000000e7f1725e7734ce288f8367e1bb143e90bb3f051281565b8260005a905083156106235773ffffffffffffffffffffffffffffffffffffffff8716156106235760405162461bcd60e51b815260206004820152603d60248201527f4b726f6d61506f7274616c3a206d7573742073656e6420746f2061646472657360448201527f73283029207768656e206372656174696e67206120636f6e747261637400000060648201526084015b60405180910390fd5b6152088567ffffffffffffffff1610156106a55760405162461bcd60e51b815260206004820152603560248201527f4b726f6d61506f7274616c3a20676173206c696d6974206d75737420636f766560448201527f7220696e737472696e7369632067617320636f73740000000000000000000000606482015260840161061a565b333281146106c6575033731111000000000000000000000000000000001111015b600034888888886040516020016106e1959493929190612ce0565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32846040516107519190612b5f565b60405180910390a450506107658282611b72565b50505050505050565b60355460ff16156107c15760405162461bcd60e51b815260206004820152601360248201527f4b726f6d61506f7274616c3a2070617573656400000000000000000000000000604482015260640161061a565b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16036108665760405162461bcd60e51b815260206004820152603c60248201527f4b726f6d61506f7274616c3a20796f752063616e6e6f742073656e64206d657360448201527f736167657320746f2074686520706f7274616c20636f6e747261637400000000606482015260840161061a565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018590526000907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c973ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401608060405180830381865afa1580156108f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109189190612d65565b60200151905061093561093036869003860186612ddd565b611e85565b81146109a95760405162461bcd60e51b815260206004820152602660248201527f4b726f6d61506f7274616c3a20696e76616c6964206f757470757420726f6f7460448201527f2070726f6f660000000000000000000000000000000000000000000000000000606482015260840161061a565b60006109b487611f0a565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610ae95750805160408083015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff90911660048201527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c973ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401608060405180830381865afa158015610abe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae29190612d65565b6020015114155b610b5b5760405162461bcd60e51b815260206004820152603460248201527f4b726f6d61506f7274616c3a207769746864726177616c20686173682068617360448201527f20616c7265616479206265656e2070726f76656e000000000000000000000000606482015260840161061a565b60408051602080820185905260008284015282518083038401815260608301808552815191909201207f12e64a7200000000000000000000000000000000000000000000000000000000909152917f00000000000000000000000068b1d87f95878fe05b998f19b66f4baba5de1aed73ffffffffffffffffffffffffffffffffffffffff16916312e64a7291610bfd9185918b918b918e013590606401612e96565b602060405180830381865afa158015610c1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3e9190612f97565b610cb05760405162461bcd60e51b815260206004820152602f60248201527f4b726f6d61506f7274616c3a20696e76616c6964207769746864726177616c2060448201527f696e636c7573696f6e2070726f6f660000000000000000000000000000000000606482015260840161061a565b604080516060810182528581526fffffffffffffffffffffffffffffffff42811660208084019182528c831684860190815260008981526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558b830151908c0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169186917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a4505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e1614610e1d5760405162461bcd60e51b815260206004820152602660248201527f4b726f6d61506f7274616c3a206f6e6c7920677561726469616e2063616e207560448201527f6e70617573650000000000000000000000000000000000000000000000000000606482015260840161061a565b603580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b6040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101829052600090610f4c9073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9169063a25ae55790602401608060405180830381865afa158015610f0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f319190612d65565b604001516fffffffffffffffffffffffffffffffff16611f57565b92915050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e1614610ffc5760405162461bcd60e51b8152602060048201526024808201527f4b726f6d61506f7274616c3a206f6e6c7920677561726469616e2063616e207060448201527f6175736500000000000000000000000000000000000000000000000000000000606482015260840161061a565b603580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001610e71565b60355460ff16156110aa5760405162461bcd60e51b815260206004820152601360248201527f4b726f6d61506f7274616c3a2070617573656400000000000000000000000000604482015260640161061a565b60325473ffffffffffffffffffffffffffffffffffffffff1661dead146111395760405162461bcd60e51b815260206004820152603c60248201527f4b726f6d61506f7274616c3a2063616e206f6e6c792074726967676572206f6e60448201527f65207769746864726177616c20706572207472616e73616374696f6e00000000606482015260840161061a565b600061114482611f0a565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff808216948301859052700100000000000000000000000000000000909104169181019190915292935090036112155760405162461bcd60e51b815260206004820152602f60248201527f4b726f6d61506f7274616c3a207769746864726177616c20686173206e6f742060448201527f6265656e2070726f76656e207965740000000000000000000000000000000000606482015260840161061a565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c973ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa158015611280573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a49190612fb4565b81602001516fffffffffffffffffffffffffffffffff1610156113555760405162461bcd60e51b815260206004820152604860248201527f4b726f6d61506f7274616c3a207769746864726177616c2074696d657374616d60448201527f70206c657373207468616e204c32204f7261636c65207374617274696e67207460648201527f696d657374616d70000000000000000000000000000000000000000000000000608482015260a40161061a565b61137481602001516fffffffffffffffffffffffffffffffff16611f57565b61140c5760405162461bcd60e51b815260206004820152604260248201527f4b726f6d61506f7274616c3a2070726f76656e207769746864726177616c206660448201527f696e616c697a6174696f6e20706572696f6420686173206e6f7420656c61707360648201527f6564000000000000000000000000000000000000000000000000000000000000608482015260a40161061a565b60408181015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff90911660048201526000907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c973ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401608060405180830381865afa1580156114b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d59190612d65565b82516020820151919250146115785760405162461bcd60e51b815260206004820152604660248201527f4b726f6d61506f7274616c3a206f757470757420726f6f742070726f76656e2060448201527f6973206e6f74207468652073616d652061732063757272656e74206f7574707560648201527f7420726f6f740000000000000000000000000000000000000000000000000000608482015260a40161061a565b61159781604001516fffffffffffffffffffffffffffffffff16611f57565b61162f5760405162461bcd60e51b815260206004820152604260248201527f4b726f6d61506f7274616c3a20636865636b706f696e74206f7574707574206660448201527f696e616c697a6174696f6e20706572696f6420686173206e6f7420656c61707360648201527f6564000000000000000000000000000000000000000000000000000000000000608482015260a40161061a565b60008381526033602052604090205460ff16156116b45760405162461bcd60e51b815260206004820152603260248201527f4b726f6d61506f7274616c3a207769746864726177616c2068617320616c726560448201527f616479206265656e2066696e616c697a65640000000000000000000000000000606482015260840161061a565b600083815260336020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055908601516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff00000000000000000000000000000000000000009092169190911790558501516080860151606087015160a088015161175693929190611ffa565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915084907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b906117bb90841515815260200190565b60405180910390a2801580156117d15750326001145b1561181e5760405162461bcd60e51b815260206004820152601e60248201527f4b726f6d61506f7274616c3a207769746864726177616c206661696c65640000604482015260640161061a565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916146118d05760405162461bcd60e51b815260206004820152603f60248201527f4b726f6d61506f7274616c3a2066756e6374696f6e2063616e206f6e6c79206260448201527f652063616c6c65642066726f6d207468652056616c696461746f72506f6f6c00606482015260840161061a565b6040513373111100000000000000000000000000000000111101906000906119049082908190879082908890602001612ce0565b604051602081830303815290604052905060008573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32846040516119749190612b5f565b60405180910390a45050505050565b600054610100900460ff16158080156119a35750600054600160ff909116105b806119bd5750303b1580156119bd575060005460ff166001145b611a2f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161061a565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611a8d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055603580548315157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909116179055611aef612058565b8015611b5257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600154600090611ba8907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643612ffc565b90506000611bb4612121565b90506000816020015160ff16826000015163ffffffff16611bd59190613042565b90508215611d0c57600154600090611c0c908390700100000000000000000000000000000000900467ffffffffffffffff166130aa565b90506000836040015160ff1683611c23919061311e565b600154611c439084906fffffffffffffffffffffffffffffffff1661311e565b611c4d9190613042565b600154909150600090611c9e90611c779084906fffffffffffffffffffffffffffffffff166131da565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff166121e7565b90506001861115611ccd57611cca611c7782876040015160ff1660018a611cc59190612ffc565b612204565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054869190601090611d3f908490700100000000000000000000000000000000900467ffffffffffffffff1661324e565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315611e085760405162461bcd60e51b815260206004820152603e60248201527f5265736f757263654d65746572696e673a2063616e6e6f7420627579206d6f7260448201527f6520676173207468616e20617661696c61626c6520676173206c696d69740000606482015260840161061a565b600154600090611e34906fffffffffffffffffffffffffffffffff1667ffffffffffffffff881661327a565b90506000611e4648633b9aca00612259565b611e5090836132b7565b905060005a611e5f9088612ffc565b905080821115611e7b57611e7b611e768284612ffc565b612271565b5050505050505050565b8051600090611e9757610f4c8261229f565b60405162461bcd60e51b815260206004820152602a60248201527f48617368696e673a20756e6b6e6f776e206f757470757420726f6f742070726f60448201527f6f662076657273696f6e00000000000000000000000000000000000000000000606482015260840161061a565b919050565b80516020808301516040808501516060860151608087015160a08801519351600097611f3a9790969591016132cb565b604051602081830303815290604052805190602001209050919050565b60007f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c973ffffffffffffffffffffffffffffffffffffffff1663f4daa2916040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe89190612fb4565b611ff29083613322565b421192915050565b600080600061200a8660006122e2565b905080612040576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b600054610100900460ff166120d55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161061a565b60408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091527f000000000000000000000000e7f1725e7734ce288f8367e1bb143e90bb3f051273ffffffffffffffffffffffffffffffffffffffff1663cc731b026040518163ffffffff1660e01b815260040160c060405180830381865afa1580156121be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e2919061335f565b905090565b60006121fc6121f68585612300565b8361230f565b949350505050565b6000670de0b6b3a764000061224561221c8583613042565b61222e90670de0b6b3a76400006130aa565b61224085670de0b6b3a764000061311e565b61231e565b61224f908661311e565b6121fc9190613042565b6000818311612268578161226a565b825b9392505050565b6000805a90505b825a6122849083612ffc565b101561229a57612293826133fe565b9150612278565b505050565b80516020808301516040808501516060808701516080808901518551978801989098529386019490945284015282015260a081019190915260009060c001611f3a565b600080603f83619c4001026040850201603f5a021015949350505050565b6000818313612268578161226a565b6000818312612268578161226a565b600061226a670de0b6b3a7640000836123368661234f565b612340919061311e565b61234a9190613042565b612579565b60008082136123a05760405162461bcd60e51b815260206004820152600960248201527f554e444546494e45440000000000000000000000000000000000000000000000604482015260640161061a565b600060606123ad8461279e565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c182136125aa57506000919050565b680755bf798b4a1bf1e582126126025760405162461bcd60e51b815260206004820152600c60248201527f4558505f4f564552464c4f570000000000000000000000000000000000000000604482015260640161061a565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b60008082116127ef5760405162461bcd60e51b815260206004820152600960248201527f554e444546494e45440000000000000000000000000000000000000000000000604482015260640161061a565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff811681146128ab57600080fd5b50565b600082601f8301126128bf57600080fd5b813567ffffffffffffffff808211156128da576128da61285a565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156129205761292061285a565b8160405283815286602085880101111561293957600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060c0828403121561296b57600080fd5b60405160c0810167ffffffffffffffff828210818311171561298f5761298f61285a565b8160405282935084358352602085013591506129aa82612889565b816020840152604085013591506129c082612889565b816040840152606085013560608401526080850135608084015260a08501359150808211156129ee57600080fd5b506129fb858286016128ae565b60a0830152505092915050565b6000806000806000858703610100811215612a2257600080fd5b863567ffffffffffffffff80821115612a3a57600080fd5b612a468a838b01612959565b97506020890135965060a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc084011215612a7f57600080fd5b60408901955060e0890135925080831115612a9957600080fd5b828901925089601f840112612aad57600080fd5b8235915080821115612abe57600080fd5b508860208260051b8401011115612ad457600080fd5b959894975092955050506020019190565b60005b83811015612b00578181015183820152602001612ae8565b83811115612b0f576000848401525b50505050565b60008151808452612b2d816020860160208601612ae5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061226a6020830184612b15565b600060208284031215612b8457600080fd5b5035919050565b600060208284031215612b9d57600080fd5b813567ffffffffffffffff811115612bb457600080fd5b6121fc84828501612959565b803567ffffffffffffffff81168114611f0557600080fd5b600080600060608486031215612bed57600080fd5b8335612bf881612889565b9250612c0660208501612bc0565b9150604084013567ffffffffffffffff811115612c2257600080fd5b612c2e868287016128ae565b9150509250925092565b80151581146128ab57600080fd5b600060208284031215612c5857600080fd5b813561226a81612c38565b600080600080600060a08688031215612c7b57600080fd5b8535612c8681612889565b945060208601359350612c9b60408701612bc0565b92506060860135612cab81612c38565b9150608086013567ffffffffffffffff811115612cc757600080fd5b612cd3888289016128ae565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251612d34816049850160208701612ae5565b919091016049019695505050505050565b80516fffffffffffffffffffffffffffffffff81168114611f0557600080fd5b600060808284031215612d7757600080fd5b6040516080810181811067ffffffffffffffff82111715612d9a57612d9a61285a565b6040528251612da881612889565b815260208381015190820152612dc060408401612d45565b6040820152612dd160608401612d45565b60608201529392505050565b600060a08284031215612def57600080fd5b60405160a0810181811067ffffffffffffffff82111715612e1257612e1261285a565b806040525082358152602083013560208201526040830135604082015260608301356060820152608083013560808201528091505092915050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8481526000602060808184015280608084015260018060a085015260c0840160c060408601528087825260e08601905060e08860051b87010191508860005b89811015612f7f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2088850301835281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18c3603018112612f3657600080fd5b8b01868101903567ffffffffffffffff811115612f5257600080fd5b803603821315612f6157600080fd5b612f6c868284612e4d565b9550505091850191908501908401612ed5565b50505080935050505082606083015295945050505050565b600060208284031215612fa957600080fd5b815161226a81612c38565b600060208284031215612fc657600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561300e5761300e612fcd565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261305157613051613013565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f8000000000000000000000000000000000000000000000000000000000000000831416156130a5576130a5612fcd565b500590565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156130e4576130e4612fcd565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01831381161561311857613118612fcd565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008413600084138583048511828216161561315f5761315f612fcd565b7f8000000000000000000000000000000000000000000000000000000000000000600087128682058812818416161561319a5761319a612fcd565b600087129250878205871284841616156131b6576131b6612fcd565b878505871281841616156131cc576131cc612fcd565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0384138115161561321457613214612fcd565b827f800000000000000000000000000000000000000000000000000000000000000003841281161561324857613248612fcd565b50500190565b600067ffffffffffffffff80831681851680830382111561327157613271612fcd565b01949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156132b2576132b2612fcd565b500290565b6000826132c6576132c6613013565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261331660c0830184612b15565b98975050505050505050565b6000821982111561333557613335612fcd565b500190565b805163ffffffff81168114611f0557600080fd5b805160ff81168114611f0557600080fd5b600060c0828403121561337157600080fd5b60405160c0810181811067ffffffffffffffff821117156133945761339461285a565b6040526133a08361333a565b81526133ae6020840161334e565b60208201526133bf6040840161334e565b60408201526133d06060840161333a565b60608201526133e16080840161333a565b60808201526133f260a08401612d45565b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361342f5761342f612fcd565b506001019056fea164736f6c634300080f000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "01", + "0x0000000000000000000000000000000000000000000000000000000000000001": "2700000000000000000000000000000000000000003b9aca00", + "0x0000000000000000000000000000000000000000000000000000000000000032": "dead" + }, + "key": "0x0ca8700cbcfbb19114f6c493c0f446cb5554349ae166db6cd30363717639c13b" + }, "0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6": { "balance": "0", "nonce": 1, - "root": "0x77d034fab45e9312bf2332676696f240d77bd1b455341d6edaaa041a40043c91", + "root": "0x36558f71e4a01100b3d09604ba6e4e1053d7f74e84a958890ccc41c31cdfe411", "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", "code": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", "storage": { - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "a85233c63b9ee964add6f2cffe00fd84eb32338f", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "4a679253410272dd5232b3ff7cf5dbb88f295319", "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "5fbdb2315678afecb367f032d93f642f64180aa3" }, "key": "0x228e1b4e1a077e8fe2073d2aea60505de76d541f0ccda8c233c439c27b0c341e" }, + "0x310ca0030eba3c67f7b3dedf6ad577cc59070573": { + "balance": "115792089237316195423570985008687907853269984665640564039455583849457825464927", + "nonce": 2, + "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "key": "0xcf14cc2c583a89667a82cc1fbe9a6931396a5627c9431c7fd5d89f47c12c38ce" + }, + "0x322813fd9a801c5507c9de605d63cea4f2ce6c44": { + "balance": "0", + "nonce": 1, + "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "codeHash": "0x35557ad22a54e2d0ee2fcd5267d8726f9e014d93448c30d3d0ea003f20103f13", + "code": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c8063761f44931161005b578063761f44931461012d5780637f46ddb214610140578063927ede2d1461018c578063aa557452146101b357600080fd5b80633687011a1461008257806354fd4d50146100975780635d93a3fc146100e9575b600080fd5b610095610090366004610bad565b6101c6565b005b6100d36040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100e09190610c9b565b60405180910390f35b61011d6100f7366004610cb5565b603160209081526000938452604080852082529284528284209052825290205460ff1681565b60405190151581526020016100e0565b61009561013b366004610cf6565b610272565b6101677f000000000000000000000000420000000000000000000000000000000000000a81565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e0565b6101677f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570781565b6100956101c1366004610d8e565b6106f3565b333b1561025a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4552433732314272696467653a206163636f756e74206973206e6f742065787460448201527f65726e616c6c79206f776e65640000000000000000000000000000000000000060648201526084015b60405180910390fd5b61026a86863333888888886107af565b505050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f8757071614801561039057507f000000000000000000000000420000000000000000000000000000000000000a73ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570773ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015610354573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103789190610e05565b73ffffffffffffffffffffffffffffffffffffffff16145b61041c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4552433732314272696467653a2066756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c65642066726f6d20746865206f7468657220627269646765006064820152608401610251565b3073ffffffffffffffffffffffffffffffffffffffff8816036104c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4c314552433732314272696467653a206c6f63616c20746f6b656e2063616e6e60448201527f6f742062652073656c66000000000000000000000000000000000000000000006064820152608401610251565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152603160209081526040808320938a1683529281528282208683529052205460ff161515600114610590576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4c314552433732314272696467653a20546f6b656e204944206973206e6f742060448201527f657363726f77656420696e20746865204c3120427269646765000000000000006064820152608401610251565b73ffffffffffffffffffffffffffffffffffffffff87811660008181526031602090815260408083208b8616845282528083208884529091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f42842e0e000000000000000000000000000000000000000000000000000000008152306004820152918616602483015260448201859052906342842e0e90606401600060405180830381600087803b15801561065057600080fd5b505af1158015610664573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f1f39bf6707b5d608453e0ae4c067b562bcc4c85c0f562ef5d2c774d2e7f131ac878787876040516106e29493929190610e6b565b60405180910390a450505050505050565b73ffffffffffffffffffffffffffffffffffffffff8516610796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4552433732314272696467653a206e667420726563697069656e742063616e6e60448201527f6f742062652061646472657373283029000000000000000000000000000000006064820152608401610251565b6107a687873388888888886107af565b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff8716610852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4c314552433732314272696467653a2072656d6f746520746f6b656e2063616e60448201527f6e6f7420626520616464726573732830290000000000000000000000000000006064820152608401610251565b600063761f449360e01b888a89898988886040516024016108799796959493929190610eab565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000959095169490941790935273ffffffffffffffffffffffffffffffffffffffff8c81166000818152603186528381208e8416825286528381208b82529095529382902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590517f23b872dd000000000000000000000000000000000000000000000000000000008152908a166004820152306024820152604481018890529092506323b872dd90606401600060405180830381600087803b1580156109b957600080fd5b505af11580156109cd573d6000803e3d6000fd5b50506040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f875707169250633dbb202b9150610a67907f000000000000000000000000420000000000000000000000000000000000000a9085908990600401610f08565b600060405180830381600087803b158015610a8157600080fd5b505af1158015610a95573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fb7460e2a880f256ebef3406116ff3eee0cee51ebccdc2a40698f87ebb2e9c1a589898888604051610b139493929190610e6b565b60405180910390a4505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610b4857600080fd5b50565b803563ffffffff81168114610b5f57600080fd5b919050565b60008083601f840112610b7657600080fd5b50813567ffffffffffffffff811115610b8e57600080fd5b602083019150836020828501011115610ba657600080fd5b9250929050565b60008060008060008060a08789031215610bc657600080fd5b8635610bd181610b26565b95506020870135610be181610b26565b945060408701359350610bf660608801610b4b565b9250608087013567ffffffffffffffff811115610c1257600080fd5b610c1e89828a01610b64565b979a9699509497509295939492505050565b6000815180845260005b81811015610c5657602081850181015186830182015201610c3a565b81811115610c68576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610cae6020830184610c30565b9392505050565b600080600060608486031215610cca57600080fd5b8335610cd581610b26565b92506020840135610ce581610b26565b929592945050506040919091013590565b600080600080600080600060c0888a031215610d1157600080fd5b8735610d1c81610b26565b96506020880135610d2c81610b26565b95506040880135610d3c81610b26565b94506060880135610d4c81610b26565b93506080880135925060a088013567ffffffffffffffff811115610d6f57600080fd5b610d7b8a828b01610b64565b989b979a50959850939692959293505050565b600080600080600080600060c0888a031215610da957600080fd5b8735610db481610b26565b96506020880135610dc481610b26565b95506040880135610dd481610b26565b945060608801359350610de960808901610b4b565b925060a088013567ffffffffffffffff811115610d6f57600080fd5b600060208284031215610e1757600080fd5b8151610cae81610b26565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201526000610ea1606083018486610e22565b9695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a0830152610efb60c083018486610e22565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000610f376060830185610c30565b905063ffffffff8316604083015294935050505056fea164736f6c634300080f000a", + "key": "0x2534d5cf18dc003706807fe440cab5aca30a915a6b5ccee4fb97946dc7ecd7cd" + }, "0x36c02da8a0983159322a80ffe9f24b1acff8b570": { "balance": "0", "nonce": 1, @@ -146,6 +203,18 @@ "code": "0x608060405234801561001057600080fd5b506004361061016c5760003560e01c80638b51d13f116100cd578063b77bf60011610081578063c01a8c8411610066578063c01a8c84146103c4578063c6427474146103d7578063ee22610b146103ea57600080fd5b8063b77bf6001461039b578063b9774f7b146103a457600080fd5b80639ab24eb0116100b25780639ab24eb01461033e5780639ace38c2146103515780639e45e8f41461037457600080fd5b80638b51d13f146102ff57806391ddadf41461031f57600080fd5b806349ae963d116101245780636dc0ae22116101095780636dc0ae2214610256578063784547a7146102a25780638a8e784c146102b557600080fd5b806349ae963d146101fa57806354fd4d501461020d57600080fd5b80631703a018116101555780631703a0181461019957806320ea8d86146101b45780632a758595146101c757600080fd5b80630192337114610171578063080b91ee14610186575b600080fd5b61018461017f366004611a5d565b6103fd565b005b610184610194366004611b6c565b61063b565b6101a1610737565b6040519081526020015b60405180910390f35b6101846101c2366004611bbc565b6109ba565b6101ea6101d5366004611bbc565b60396020526000908152604090205460ff1681565b60405190151581526020016101ab565b6101a1610208366004611bf7565b610c9c565b6102496040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516101ab9190611ca5565b61027d7f0000000000000000000000009a676e781a523b5d0c0e43731313a708cb60750881565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101ab565b6101ea6102b0366004611bbc565b610d85565b6101ea6102c3366004611cbf565b600082815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845260010190915290205460ff1692915050565b6101a161030d366004611bbc565b60009081526034602052604090205490565b610327610da9565b60405165ffffffffffff90911681526020016101ab565b6101a161034c366004611ce4565b610ed5565b61036461035f366004611bbc565b610ffe565b6040516101ab9493929190611d01565b61027d7f000000000000000000000000610178da211fef7d417bc0e6fed39f05609ad78881565b6101a160385481565b6101a16103b2366004611bbc565b60346020526000908152604090205481565b6101846103d2366004611bbc565b6110dc565b6101a16103e5366004611bf7565b61133e565b6101846103f8366004611bbc565b6113d3565b33600061040982610ed5565b116104815760405162461bcd60e51b815260206004820152603b60248201527f546f6b656e4d756c746953696757616c6c65743a206f6e6c7920616c6c6f776560448201527f6420746f20676f7665726e616e636520746f6b656e206f776e6572000000000060648201526084015b60405180910390fd5b60008381526039602052604090205460ff16158061049c5750815b6105355760405162461bcd60e51b8152602060048201526044602482018190527f5365637572697479436f756e63696c3a20746865206f75747075742068617320908201527f616c7265616479206265656e2072657175657374656420746f2062652064656c60648201527f6574656400000000000000000000000000000000000000000000000000000000608482015260a401610478565b6040805160248082018690528251808303909101815260449091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fe39a219c0000000000000000000000000000000000000000000000000000000017905260006105c87f000000000000000000000000610178da211fef7d417bc0e6fed39f05609ad788828461133e565b90506105d3816110dc565b60008581526039602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905551869183917fc63c84660a471a970585c7cab9d0601af8e717ff0822a2ea049a3542fc5aa55a9190a35050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000610178da211fef7d417bc0e6fed39f05609ad78816146106e65760405162461bcd60e51b815260206004820152603c60248201527f5365637572697479436f756e63696c3a206f6e6c792074686520636f6c6f737360448201527f65756d20636f6e74726163742063616e20626520612073656e646572000000006064820152608401610478565b60006106f433600084611741565b604080518681526020810186905291925082917eef5106e82a682c776fd7748be042f406a9ee0feaaea86ae9029477c2b91f2a910160405180910390a250505050565b6000806001610744610da9565b61074e9190611d77565b65ffffffffffff1690507f0000000000000000000000009a676e781a523b5d0c0e43731313a708cb60750873ffffffffffffffffffffffffffffffffffffffff166397c3d3346040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e79190611d9e565b6040517f60c4247f000000000000000000000000000000000000000000000000000000008152600481018390527f0000000000000000000000009a676e781a523b5d0c0e43731313a708cb60750873ffffffffffffffffffffffffffffffffffffffff16906360c4247f90602401602060405180830381865afa158015610872573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108969190611d9e565b7f0000000000000000000000009a676e781a523b5d0c0e43731313a708cb60750873ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610901573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109259190611db7565b73ffffffffffffffffffffffffffffffffffffffff16638e539e8c846040518263ffffffff1660e01b815260040161095f91815260200190565b602060405180830381865afa15801561097c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a09190611d9e565b6109aa9190611dd4565b6109b49190611e11565b91505090565b3360006109c682610ed5565b11610a395760405162461bcd60e51b815260206004820152603b60248201527f546f6b656e4d756c746953696757616c6c65743a206f6e6c7920616c6c6f776560448201527f6420746f20676f7665726e616e636520746f6b656e206f776e657200000000006064820152608401610478565b600082815260336020526040902054829073ffffffffffffffffffffffffffffffffffffffff16610ad25760405162461bcd60e51b815260206004820152602f60248201527f546f6b656e4d756c746953696757616c6c65743a207472616e73616374696f6e60448201527f20646f6573206e6f7420657869737400000000000000000000000000000000006064820152608401610478565b600083815260336020526040902054839074010000000000000000000000000000000000000000900460ff1615610b715760405162461bcd60e51b815260206004820152602560248201527f546f6b656e4d756c746953696757616c6c65743a20616c72656164792065786560448201527f63757465640000000000000000000000000000000000000000000000000000006064820152608401610478565b600084815260346020908152604080832033845260010190915290205460ff16610c035760405162461bcd60e51b815260206004820152602660248201527f546f6b656e4d756c746953696757616c6c65743a206e6f7420636f6e6669726d60448201527f65642079657400000000000000000000000000000000000000000000000000006064820152608401610478565b60008481526034602090815260408083203380855260018201909352922080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055610c5090610ed5565b816000016000828254610c639190611e4c565b9091555050604051859033907f795394da21278ca39d59bb3ca00efeebdc0679acc420916c7385c2c5d942656f90600090a35050505050565b60008373ffffffffffffffffffffffffffffffffffffffff8116610d285760405162461bcd60e51b815260206004820152602960248201527f546f6b656e4d756c746953696757616c6c65743a20616464726573732069732060448201527f6e6f742076616c696400000000000000000000000000000000000000000000006064820152608401610478565b848484610d33610da9565b604051602001610d469493929190611e63565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012095945050505050565b6000610d8f610737565b600092835260346020526040909220549190911015919050565b60007f0000000000000000000000009a676e781a523b5d0c0e43731313a708cb60750873ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3a9190611db7565b73ffffffffffffffffffffffffffffffffffffffff166391ddadf46040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610ebe575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610ebb91810190611eb1565b60015b610ed057610ecb43611968565b905090565b919050565b60007f0000000000000000000000009a676e781a523b5d0c0e43731313a708cb60750873ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f669190611db7565b6040517f9ab24eb000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529190911690639ab24eb090602401602060405180830381865afa158015610fd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff89190611d9e565b92915050565b60336020526000908152604090208054600182015460028301805473ffffffffffffffffffffffffffffffffffffffff8416947401000000000000000000000000000000000000000090940460ff1693919061105990611ed9565b80601f016020809104026020016040519081016040528092919081815260200182805461108590611ed9565b80156110d25780601f106110a7576101008083540402835291602001916110d2565b820191906000526020600020905b8154815290600101906020018083116110b557829003601f168201915b5050505050905084565b3360006110e882610ed5565b1161115b5760405162461bcd60e51b815260206004820152603b60248201527f546f6b656e4d756c746953696757616c6c65743a206f6e6c7920616c6c6f776560448201527f6420746f20676f7665726e616e636520746f6b656e206f776e657200000000006064820152608401610478565b600082815260336020526040902054829073ffffffffffffffffffffffffffffffffffffffff166111f45760405162461bcd60e51b815260206004820152602f60248201527f546f6b656e4d756c746953696757616c6c65743a207472616e73616374696f6e60448201527f20646f6573206e6f7420657869737400000000000000000000000000000000006064820152608401610478565b6000838152603460209081526040808320338452600181019092529091205460ff16156112895760405162461bcd60e51b815260206004820152602660248201527f546f6b656e4d756c746953696757616c6c65743a20616c726561647920636f6e60448201527f6669726d656400000000000000000000000000000000000000000000000000006064820152608401610478565b3360008181526001838101602052604090912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690911790556112ce90610ed5565b8160000160008282546112e19190611f2c565b9091555050604051849033907ff8a17c9136a3ae33364fac05eb088a3cbafee10c1889c88593e20ee2d8e4eb8890600090a361131b610737565b6000858152603460205260409020541061133857611338846113d3565b50505050565b600033600061134c82610ed5565b116113bf5760405162461bcd60e51b815260206004820152603b60248201527f546f6b656e4d756c746953696757616c6c65743a206f6e6c7920616c6c6f776560448201527f6420746f20676f7665726e616e636520746f6b656e206f776e657200000000006064820152608401610478565b6113ca858585611741565b95945050505050565b6113db6119ea565b600081815260336020526040902054819073ffffffffffffffffffffffffffffffffffffffff166114745760405162461bcd60e51b815260206004820152602f60248201527f546f6b656e4d756c746953696757616c6c65743a207472616e73616374696f6e60448201527f20646f6573206e6f7420657869737400000000000000000000000000000000006064820152608401610478565b600082815260336020526040902054829074010000000000000000000000000000000000000000900460ff16156115135760405162461bcd60e51b815260206004820152602560248201527f546f6b656e4d756c746953696757616c6c65743a20616c72656164792065786560448201527f63757465640000000000000000000000000000000000000000000000000000006064820152608401610478565b61151c83610d85565b61158e5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e4d756c746953696757616c6c65743a2071756f72756d206e6f742060448201527f72656163686564000000000000000000000000000000000000000000000000006064820152608401610478565b600083815260336020526040812080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff81167401000000000000000000000000000000000000000017825590919061168f9073ffffffffffffffffffffffffffffffffffffffff165a846001015485600201805461160c90611ed9565b80601f016020809104026020016040519081016040528092919081815260200182805461163890611ed9565b80156116855780601f1061165a57610100808354040283529160200191611685565b820191906000526020600020905b81548152906001019060200180831161166857829003601f168201915b5050505050611a43565b9050806117045760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e4d756c746953696757616c6c65743a2063616c6c207472616e736160448201527f6374696f6e206661696c656400000000000000000000000000000000000000006064820152608401610478565b604051859033907f4e86ad0da28cbaaaa7e93e36c43b32696e970535225b316f1b84fbf30bdc04e890600090a35050505061173e60018055565b50565b60008373ffffffffffffffffffffffffffffffffffffffff81166117cd5760405162461bcd60e51b815260206004820152602960248201527f546f6b656e4d756c746953696757616c6c65743a20616464726573732069732060448201527f6e6f742076616c696400000000000000000000000000000000000000000000006064820152608401610478565b60006117da868686610c9c565b60008181526033602052604090205490915073ffffffffffffffffffffffffffffffffffffffff16156118755760405162461bcd60e51b815260206004820152602f60248201527f546f6b656e4d756c746953696757616c6c65743a207472616e73616374696f6e60448201527f20616c72656164792065786973747300000000000000000000000000000000006064820152608401610478565b6040805160808101825273ffffffffffffffffffffffffffffffffffffffff8089168252600060208084018281528486018b8152606086018b8152888552603390935295909220845181549351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00000000000000000000000000000000000000000090941694169390931791909117825592516001820155915190919060028201906119269082611f93565b505060388054600101905550604051819033907f1f50cd00b6a6fe3928bf4a5f2f23829e9a1c9396573b828b5fa14d95aae7e77590600090a395945050505050565b600065ffffffffffff8211156119e65760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201527f38206269747300000000000000000000000000000000000000000000000000006064820152608401610478565b5090565b600260015403611a3c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610478565b6002600155565b600080600080845160208601878a8af19695505050505050565b60008060408385031215611a7057600080fd5b8235915060208301358015158114611a8757600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112611ad257600080fd5b813567ffffffffffffffff80821115611aed57611aed611a92565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611b3357611b33611a92565b81604052838152866020858801011115611b4c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600060608486031215611b8157600080fd5b8335925060208401359150604084013567ffffffffffffffff811115611ba657600080fd5b611bb286828701611ac1565b9150509250925092565b600060208284031215611bce57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461173e57600080fd5b600080600060608486031215611c0c57600080fd5b8335611c1781611bd5565b925060208401359150604084013567ffffffffffffffff811115611ba657600080fd5b6000815180845260005b81811015611c6057602081850181015186830182015201611c44565b81811115611c72576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611cb86020830184611c3a565b9392505050565b60008060408385031215611cd257600080fd5b823591506020830135611a8781611bd5565b600060208284031215611cf657600080fd5b8135611cb881611bd5565b73ffffffffffffffffffffffffffffffffffffffff851681528315156020820152826040820152608060608201526000611d3e6080830184611c3a565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600065ffffffffffff83811690831681811015611d9657611d96611d48565b039392505050565b600060208284031215611db057600080fd5b5051919050565b600060208284031215611dc957600080fd5b8151611cb881611bd5565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611e0c57611e0c611d48565b500290565b600082611e47577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600082821015611e5e57611e5e611d48565b500390565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152608060408201526000611e986080830185611c3a565b905065ffffffffffff8316606083015295945050505050565b600060208284031215611ec357600080fd5b815165ffffffffffff81168114611cb857600080fd5b600181811c90821680611eed57607f821691505b602082108103611f26577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008219821115611f3f57611f3f611d48565b500190565b601f821115611f8e57600081815260208120601f850160051c81016020861015611f6b5750805b601f850160051c820191505b81811015611f8a57828155600101611f77565b5050505b505050565b815167ffffffffffffffff811115611fad57611fad611a92565b611fc181611fbb8454611ed9565b84611f44565b602080601f8311600181146120145760008415611fde5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611f8a565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561206157888601518255948401946001909101908401612042565b508582101561209d57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b0190555056fea164736f6c634300080f000a", "key": "0x485bdae81e6998854e4621c39469c7a360ddb5f9a5703fd7bcdfea372f9213e6" }, + "0x3aa5ebb10dc797cac828524e59a333d0a371443c": { + "balance": "0", + "nonce": 1, + "root": "0xb45fafbc41242521fb222c114d80647c0858e2a27d7574ef837788f7a78cdaaa", + "codeHash": "0x02898aaa7c1add99de89629303000fbd799dcaaec7d7380cb042e86d96a9fd75", + "code": "0x60806040526004361061015f5760003560e01c80636e296e45116100c0578063a4e7f8bd11610074578063b28ade2511610059578063b28ade25146103d2578063d764ad0b146103f2578063ecc704281461040557600080fd5b8063a4e7f8bd14610372578063b1b1b209146103a257600080fd5b806383a74074116100a557806383a74074146103275780638cbeeef2146102575780639fce812c1461033e57600080fd5b80636e296e45146102fd5780638129fc1c1461031257600080fd5b80633f827a5a1161011757806354fd4d50116100fc57806354fd4d501461026d5780635644cfdf146102c35780635c975abb146102d957600080fd5b80633f827a5a1461022f5780634c1d6a691461025757600080fd5b80630ff754ea116101485780630ff754ea146101ac5780632828d7e8146102055780633dbb202b1461021a57600080fd5b8063028f85f7146101645780630c56849814610197575b600080fd5b34801561017057600080fd5b50610179601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156101a357600080fd5b50610179603f81565b3480156101b857600080fd5b506101e07f0000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018e565b34801561021157600080fd5b50610179604081565b61022d610228366004611563565b610443565b005b34801561023b57600080fd5b50610244600081565b60405161ffff909116815260200161018e565b34801561026357600080fd5b50610179619c4081565b34801561027957600080fd5b506102b66040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161018e9190611635565b3480156102cf57600080fd5b5061017961138881565b3480156102e557600080fd5b5060335460ff165b604051901515815260200161018e565b34801561030957600080fd5b506101e0610631565b34801561031e57600080fd5b5061022d61071d565b34801561033357600080fd5b5061017962030d4081565b34801561034a57600080fd5b506101e07f000000000000000000000000420000000000000000000000000000000000000481565b34801561037e57600080fd5b506102ed61038d36600461164f565b60686020526000908152604090205460ff1681565b3480156103ae57600080fd5b506102ed6103bd36600461164f565b60656020526000908152604090205460ff1681565b3480156103de57600080fd5b506101796103ed366004611668565b6108af565b61022d6104003660046116bc565b61091d565b34801561041157600080fd5b506067547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660405190815260200161018e565b61055b7f00000000000000000000000042000000000000000000000000000000000000046104728585856108af565b347fd764ad0b000000000000000000000000000000000000000000000000000000006104bd6067547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b338a34898c8c6040516024016104d9979695949392919061178b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526110d0565b3373ffffffffffffffffffffffffffffffffffffffff85167fdd28cef75ff18fb538e43317144469f339702f973eace2bc808f2acc37db310e3486866105c06067547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b876040516105d29594939291906117ea565b60405180910390a35050606780547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b60665460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff215301610700576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f7420736574000000000000000000000060648201526084015b60405180910390fd5b5060665473ffffffffffffffffffffffffffffffffffffffff1690565b600054610100900460ff161580801561073d5750600054600160ff909116105b806107575750303b158015610757575060005460ff166001145b6107e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016106f7565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561084157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610849611185565b80156108ac57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6000611388619c4080603f6108cb604063ffffffff8816611851565b6108d59190611881565b6108e0601088611851565b6108ed9062030d406118cf565b6108f791906118cf565b61090191906118cf565b61090b91906118cf565b61091591906118cf565b949350505050565b60f087901c600181106109d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206d6573736167657320697320737570706f7274656420617420746860648201527f69732074696d6500000000000000000000000000000000000000000000000000608482015260a4016106f7565b6000610a1e898989898989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061124a92505050565b9050610a2861126d565b15610a6057853414610a3c57610a3c6118fb565b60008181526068602052604090205460ff1615610a5b57610a5b6118fb565b610bb2565b3415610b14576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a4016106f7565b60008181526068602052604090205460ff16610bb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c617965640000000000000000000000000000000060648201526084016106f7565b610bbb87611391565b15610c6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a4016106f7565b60008181526065602052604090205460ff1615610d0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c617965640000000000000000000060648201526084016106f7565b610d2e85610d1f611388619c406118cf565b67ffffffffffffffff16611408565b1580610d54575060665473ffffffffffffffffffffffffffffffffffffffff1661dead14155b15610e6d5760008181526068602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3201610e66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016106f7565b50506110a6565b606680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a161790556000610efe88619c405a610ec1919061192a565b8988888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061142692505050565b606680547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905590508015610f955760008281526065602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26110a2565b60008281526068602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016110a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016106f7565b5050505b50505050505050565b905090565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e0169063e9e05c4290849061114d908890839089906000908990600401611941565b6000604051808303818588803b15801561116657600080fd5b505af115801561117a573d6000803e3d6000fd5b505050505050505050565b600054610100900460ff1661121c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106f7565b606680547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055565b600061125a878787878787611440565b8051906020012090509695505050505050565b60003373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e0161480156110af57507f000000000000000000000000420000000000000000000000000000000000000473ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e073ffffffffffffffffffffffffffffffffffffffff16639bf62d826040518163ffffffff1660e01b8152600401602060405180830381865afa158015611351573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113759190611999565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600073ffffffffffffffffffffffffffffffffffffffff821630148061140257507f0000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b606086868686868660405160240161145d969594939291906119b6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146108ac57600080fd5b60008083601f84011261151357600080fd5b50813567ffffffffffffffff81111561152b57600080fd5b60208301915083602082850101111561154357600080fd5b9250929050565b803563ffffffff8116811461155e57600080fd5b919050565b6000806000806060858703121561157957600080fd5b8435611584816114df565b9350602085013567ffffffffffffffff8111156115a057600080fd5b6115ac87828801611501565b90945092506115bf90506040860161154a565b905092959194509250565b6000815180845260005b818110156115f0576020818501810151868301820152016115d4565b81811115611602576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061164860208301846115ca565b9392505050565b60006020828403121561166157600080fd5b5035919050565b60008060006040848603121561167d57600080fd5b833567ffffffffffffffff81111561169457600080fd5b6116a086828701611501565b90945092506116b390506020850161154a565b90509250925092565b600080600080600080600060c0888a0312156116d757600080fd5b8735965060208801356116e9816114df565b955060408801356116f9816114df565b9450606088013593506080880135925060a088013567ffffffffffffffff81111561172357600080fd5b61172f8a828b01611501565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a08301526117dd60c083018486611742565b9998505050505050505050565b858152608060208201526000611804608083018688611742565b905083604083015263ffffffff831660608301529695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff8083168185168183048111821515161561187857611878611822565b02949350505050565b600067ffffffffffffffff808416806118c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff8083168185168083038211156118f2576118f2611822565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b60008282101561193c5761193c611822565b500390565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015267ffffffffffffffff84166040820152821515606082015260a06080820152600061198e60a08301846115ca565b979650505050505050565b6000602082840312156119ab57600080fd5b8151611648816114df565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152611a0160c08301846115ca565b9897505050505050505056fea164736f6c634300080f000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "01", + "0x0000000000000000000000000000000000000000000000000000000000000066": "dead" + }, + "key": "0x7694289e56b3885be351656b2b6cd001557c52e00baa368c33676c4a1431e6dc" + }, "0x3fab184622dc19b6109349b94811493bf2a45362": { "balance": "993186300000000000", "nonce": 1, @@ -153,12 +222,27 @@ "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", "key": "0xde33f5554ba92b642b2295d39f4de663601655a65aa90577cfd665fdbe35db04" }, - "0x4c5859f0f772848b2d91f1d83e2fe57935348029": { + "0x4a679253410272dd5232b3ff7cf5dbb88f295319": { "balance": "0", "nonce": 1, "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "0xbcaa8c774c291da5b9922c8f081256b7b03cd1a7daf2f3643d591581c2c7049d", - "code": "0x608060405234801561001057600080fd5b506004361061020b5760003560e01c80636fcfff451161012a5780639ab24eb0116100bd578063c3cda5201161008c578063dd62ed3e11610071578063dd62ed3e1461056f578063ee9a31a2146105b5578063f1127ed8146105dc57600080fd5b8063c3cda52014610549578063d505accf1461055c57600080fd5b80639ab24eb0146104fd5780639dc29fac14610510578063a457c2d714610523578063a9059cbb1461053657600080fd5b806384b0196e116100f957806384b0196e146104775780638e539e8c1461049257806391ddadf4146104a557806395d89b41146104c457600080fd5b80636fcfff45146103f357806370a082311461041b57806379cc6790146104515780637ecebe001461046457600080fd5b806339509351116101a25780634bf5d7e9116101715780634bf5d7e91461036357806354fd4d501461036b578063587cde1e146103a75780635c19a95c146103e057600080fd5b806339509351146103155780633a46b1a81461032857806340c10f191461033b57806342966c681461035057600080fd5b806318160ddd116101de57806318160ddd146102d957806323b872dd146102eb578063313ce567146102fe5780633644e5151461030d57600080fd5b806301ffc9a714610210578063033964be1461023857806306fdde0314610284578063095ea7b3146102c6575b600080fd5b61022361021e3660046126d8565b61062e565b60405190151581526020015b60405180910390f35b61025f7f00000000000000000000000042000000000000000000000000000000000000ff81565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161022f565b60408051808201909152600581527f4b726f6d6100000000000000000000000000000000000000000000000000000060208201525b60405161022f9190612785565b6102236102d43660046127c1565b6106ce565b6002545b60405190815260200161022f565b6102236102f93660046127eb565b6106e8565b6040516012815260200161022f565b6102dd61070c565b6102236103233660046127c1565b61071b565b6102dd6103363660046127c1565b610767565b61034e6103493660046127c1565b610802565b005b61034e61035e366004612827565b6108bb565b6102b96108c8565b6102b96040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b61025f6103b5366004612840565b73ffffffffffffffffffffffffffffffffffffffff9081166000908152600960205260409020541690565b61034e6103ee366004612840565b610960565b610406610401366004612840565b61096a565b60405163ffffffff909116815260200161022f565b6102dd610429366004612840565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61034e61045f3660046127c1565b610999565b6102dd610472366004612840565b6109ae565b61047f6109d9565b60405161022f979695949392919061285b565b6102dd6104a0366004612827565b610a7e565b6104ad610ae9565b60405165ffffffffffff909116815260200161022f565b60408051808201909152600381527f4b524f000000000000000000000000000000000000000000000000000000000060208201526102b9565b6102dd61050b366004612840565b610af4565b61034e61051e3660046127c1565b610bba565b6102236105313660046127c1565b610c65565b6102236105443660046127c1565b610d1c565b61034e61055736600461292b565b610d2a565b61034e61056a366004612983565b610e6d565b6102dd61057d3660046129ed565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b61025f7f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b6105ef6105ea366004612a20565b610ff8565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16928101929092520161022f565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f30a0c5a9000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084168214806106c657507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b6000336106dc8185856110d2565b60019150505b92915050565b6000336106f6858285611251565b6107018585856112f0565b506001949350505050565b6000610716611517565b905090565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906106dc9082908690610762908790612a8f565b6110d2565b6000610771610ae9565b65ffffffffffff1682106107cc5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20667574757265206c6f6f6b75700000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600a602052604090206107fb908361164f565b9392505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f16146108ad5760405162461bcd60e51b815260206004820152602560248201527f476f7665726e616e6365546f6b656e3a206f6e6c79206d696e7465722063616e60448201527f206d696e7400000000000000000000000000000000000000000000000000000060648201526084016107c3565b6108b78282611762565b5050565b6108c5338261176c565b50565b6060436108d3610ae9565b65ffffffffffff16146109285760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a2062726f6b656e20636c6f636b206d6f646500000060448201526064016107c3565b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b6108c53382611776565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a60205260408120546106e290611814565b6109a4823383611251565b6108b7828261176c565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600760205260408120546106e2565b600060608082808083610a0d7f4b726f6d610000000000000000000000000000000000000000000000000000056005611894565b610a387f31000000000000000000000000000000000000000000000000000000000000016006611894565b604080516000808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6000610a88610ae9565b65ffffffffffff168210610ade5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20667574757265206c6f6f6b75700000000000000060448201526064016107c3565b6106e2600b8361164f565b600061071643611938565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600a60205260408120548015610b925773ffffffffffffffffffffffffffffffffffffffff83166000908152600a6020526040902080546000198301908110610b5b57610b5b612ad6565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610b95565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f16146109a45760405162461bcd60e51b815260206004820152603160248201527f4b726f6d614d696e7461626c6545524332303a206f6e6c79206272696467652060448201527f63616e206d696e7420616e64206275726e00000000000000000000000000000060648201526084016107c3565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610d0f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016107c3565b61070182868684036110d2565b6000336106dc8185856112f0565b83421115610d7a5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e6174757265206578706972656400000060448201526064016107c3565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf602082015273ffffffffffffffffffffffffffffffffffffffff8816918101919091526060810186905260808101859052600090610e0190610df99060a001604051602081830303815290604052805190602001206119b6565b8585856119fe565b9050610e0c81611a26565b8614610e5a5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e63650000000000000060448201526064016107c3565b610e648188611776565b50505050505050565b83421115610ebd5760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e6500000060448201526064016107c3565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610eec8c611a26565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610f54826119b6565b90506000610f64828787876119fe565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fe15760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e6174757265000060448201526064016107c3565b610fec8a8a8a6110d2565b50505050505050505050565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff83166000908152600a60205260409020805463ffffffff841690811061104957611049612ad6565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b60006020835110156110ba576110b383611a5b565b90506106e2565b816110c58482612ba0565b5060ff90506106e2565b90565b73ffffffffffffffffffffffffffffffffffffffff831661115a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016107c3565b73ffffffffffffffffffffffffffffffffffffffff82166111e35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016107c3565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff83811660009081526001602090815260408083209386168352929052205460001981146112ea57818110156112dd5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016107c3565b6112ea84848484036110d2565b50505050565b73ffffffffffffffffffffffffffffffffffffffff83166113795760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016107c3565b73ffffffffffffffffffffffffffffffffffffffff82166114025760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016107c3565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260409020548181101561149e5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016107c3565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36112ea848484611ab7565b60003073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe579353480291614801561157d57507f000000000000000000000000000000000000000000000000000000000000053946145b156115a757507ffc41f94b02e5cb33dbd64c46adc99a9743175acc35f9001acf812bd0cacb2b4f90565b610716604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f7d1780c7a694e1f75550e8e5f55a6c40ba84748efbfbd38087dbf009f30899ba918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b8154600090818160058111156116a957600061166a84611ac2565b6116749085612c7e565b600088815260209020909150869082015463ffffffff161115611699578091506116a7565b6116a4816001612a8f565b92505b505b808210156116f65760006116bd8383611baa565b600088815260209020909150869082015463ffffffff1611156116e2578091506116f0565b6116ed816001612a8f565b92505b506116a9565b8015611737576000868152602090208101600019015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661173a565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169695505050505050565b6108b78282611bc5565b6108b78282611c71565b73ffffffffffffffffffffffffffffffffffffffff8281166000818152600960208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46112ea828483611c89565b600063ffffffff8211156118905760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f322062697473000000000000000000000000000000000000000000000000000060648201526084016107c3565b5090565b606060ff83146118a7576110b383611e2e565b8180546118b390612b05565b80601f01602080910402602001604051908101604052809291908181526020018280546118df90612b05565b801561192c5780601f106119015761010080835404028352916020019161192c565b820191906000526020600020905b81548152906001019060200180831161190f57829003601f168201915b505050505090506106e2565b600065ffffffffffff8211156118905760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201527f382062697473000000000000000000000000000000000000000000000000000060648201526084016107c3565b60006106e26119c3611517565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6000806000611a0f87878787611e6d565b91509150611a1c81611f5c565b5095945050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526007602052604090208054600181018255905b50919050565b600080829050601f81511115611a9f57826040517f305a27a90000000000000000000000000000000000000000000000000000000081526004016107c39190612785565b8051611aaa82612c95565b179392505050565b505050565b611ab28383836120c1565b600081600003611ad457506000919050565b60006001611ae184612100565b901c6001901b90506001818481611afa57611afa612cb9565b048201901c90506001818481611b1257611b12612cb9565b048201901c90506001818481611b2a57611b2a612cb9565b048201901c90506001818481611b4257611b42612cb9565b048201901c90506001818481611b5a57611b5a612cb9565b048201901c90506001818481611b7257611b72612cb9565b048201901c90506001818481611b8a57611b8a612cb9565b048201901c90506107fb81828581611ba457611ba4612cb9565b04612194565b6000611bb96002848418612ce8565b6107fb90848416612a8f565b611bcf82826121aa565b6002547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1015611c635760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f7465730000000000000000000000000000000060648201526084016107c3565b6112ea600b61228b83612297565b611c7b8282612460565b6112ea600b6125f783612297565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611cc55750600081115b15611ab25773ffffffffffffffffffffffffffffffffffffffff831615611d7a5773ffffffffffffffffffffffffffffffffffffffff83166000908152600a602052604081208190611d1a906125f785612297565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611d6f929190918252602082015260400190565b60405180910390a250505b73ffffffffffffffffffffffffffffffffffffffff821615611ab25773ffffffffffffffffffffffffffffffffffffffff82166000908152600a602052604081208190611dca9061228b85612297565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611e1f929190918252602082015260400190565b60405180910390a25050505050565b60606000611e3b83612603565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611ea45750600090506003611f53565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611ef8573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611f4c57600060019250925050611f53565b9150600090505b94509492505050565b6000816004811115611f7057611f70612d23565b03611f785750565b6001816004811115611f8c57611f8c612d23565b03611fd95760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016107c3565b6002816004811115611fed57611fed612d23565b0361203a5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016107c3565b600381600481111561204e5761204e612d23565b036108c55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f756500000000000000000000000000000000000000000000000000000000000060648201526084016107c3565b73ffffffffffffffffffffffffffffffffffffffff838116600090815260096020526040808220548584168352912054611ab292918216911683611c89565b600080608083901c1561211557608092831c92015b604083901c1561212757604092831c92015b602083901c1561213957602092831c92015b601083901c1561214b57601092831c92015b600883901c1561215d57600892831c92015b600483901c1561216f57600492831c92015b600283901c1561218157600292831c92015b600183901c156106e25760010192915050565b60008183106121a357816107fb565b5090919050565b73ffffffffffffffffffffffffffffffffffffffff821661220d5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016107c3565b806002600082825461221f9190612a8f565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36108b760008383611ab7565b60006107fb8284612a8f565b825460009081908181156122f95760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16602082015261230e565b60408051808201909152600080825260208201525b905080602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16935061234384868863ffffffff16565b925060008211801561236d5750612358610ae9565b65ffffffffffff16816000015163ffffffff16145b156123c75761237b83612644565b60008881526020902083016000190180547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092166401000000000263ffffffff909216919091179055612456565b8660405180604001604052806123eb6123de610ae9565b65ffffffffffff16611814565b63ffffffff1681526020016123ff86612644565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b73ffffffffffffffffffffffffffffffffffffffff82166124e95760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016107c3565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156125855760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016107c3565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611ab283600084611ab7565b60006107fb8284612c7e565b600060ff8216601f8111156106e2576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8211156118905760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f323420626974730000000000000000000000000000000000000000000000000060648201526084016107c3565b6000602082840312156126ea57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146107fb57600080fd5b6000815180845260005b8181101561274057602081850181015186830182015201612724565b81811115612752576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006107fb602083018461271a565b803573ffffffffffffffffffffffffffffffffffffffff811681146127bc57600080fd5b919050565b600080604083850312156127d457600080fd5b6127dd83612798565b946020939093013593505050565b60008060006060848603121561280057600080fd5b61280984612798565b925061281760208501612798565b9150604084013590509250925092565b60006020828403121561283957600080fd5b5035919050565b60006020828403121561285257600080fd5b6107fb82612798565b7fff00000000000000000000000000000000000000000000000000000000000000881681526000602060e08184015261289760e084018a61271a565b83810360408501526128a9818a61271a565b6060850189905273ffffffffffffffffffffffffffffffffffffffff8816608086015260a0850187905284810360c0860152855180825283870192509083019060005b81811015612908578351835292840192918401916001016128ec565b50909c9b505050505050505050505050565b803560ff811681146127bc57600080fd5b60008060008060008060c0878903121561294457600080fd5b61294d87612798565b955060208701359450604087013593506129696060880161291a565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a03121561299e57600080fd5b6129a788612798565b96506129b560208901612798565b955060408801359450606088013593506129d16080890161291a565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612a0057600080fd5b612a0983612798565b9150612a1760208401612798565b90509250929050565b60008060408385031215612a3357600080fd5b612a3c83612798565b9150602083013563ffffffff81168114612a5557600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612aa257612aa2612a60565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c90821680612b1957607f821691505b602082108103611a55577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f821115611ab257600081815260208120601f850160051c81016020861015612b795750805b601f850160051c820191505b81811015612b9857828155600101612b85565b505050505050565b815167ffffffffffffffff811115612bba57612bba612aa7565b612bce81612bc88454612b05565b84612b52565b602080601f831160018114612c035760008415612beb5750858301515b600019600386901b1c1916600185901b178555612b98565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015612c5057888601518255948401946001909101908401612c31565b5085821015612c6e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600082821015612c9057612c90612a60565b500390565b80516020808301519190811015611a555760001960209190910360031b1b16919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612d1e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a", + "codeHash": "0xe7d30c7952210033e3cfd18ff7d7741d27b94e7cbaa9ddfcab4a59bbcb34746f", + "code": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c80635269aa1b1461004657806354fd4d5014610083578063ee9a31a2146100cc575b600080fd5b61005961005436600461033a565b6100f3565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100bf6040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161007a9190610434565b6100597f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b600073ffffffffffffffffffffffffffffffffffffffff841661019c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f4b726f6d614d696e7461626c654552433230466163746f72793a206d7573742060448201527f70726f766964652072656d6f746520746f6b656e206164647265737300000000606482015260840160405180910390fd5b60007f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f8585856040516101ce90610253565b6101db949392919061044e565b604051809103906000f0801580156101f7573d6000803e3d6000fd5b5060405133815290915073ffffffffffffffffffffffffffffffffffffffff80871691908316907f16f14001f89df9d8ecc68e7cbb61373ece9025038b9df30bea3635fc0e4701a99060200160405180910390a3949350505050565b611441806104a583390190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126102a057600080fd5b813567ffffffffffffffff808211156102bb576102bb610260565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561030157610301610260565b8160405283815286602085880101111561031a57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561034f57600080fd5b833573ffffffffffffffffffffffffffffffffffffffff8116811461037357600080fd5b9250602084013567ffffffffffffffff8082111561039057600080fd5b61039c8783880161028f565b935060408601359150808211156103b257600080fd5b506103bf8682870161028f565b9150509250925092565b6000815180845260005b818110156103ef576020818501810151868301820152016103d3565b81811115610401576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061044760208301846103c9565b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152506080604083015261048760808301856103c9565b828103606084015261049981856103c9565b97965050505050505056fe60c06040523480156200001157600080fd5b50604051620014413803806200144183398101604081905262000034916200015a565b8181600362000044838262000279565b50600462000053828262000279565b5050506001600160a01b0392831660805250501660a05262000345565b80516001600160a01b03811681146200008857600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620000b557600080fd5b81516001600160401b0380821115620000d257620000d26200008d565b604051601f8301601f19908116603f01168101908282118183101715620000fd57620000fd6200008d565b816040528381526020925086838588010111156200011a57600080fd5b600091505b838210156200013e57858201830151818301840152908201906200011f565b83821115620001505760008385830101525b9695505050505050565b600080600080608085870312156200017157600080fd5b6200017c8562000070565b93506200018c6020860162000070565b60408601519093506001600160401b0380821115620001aa57600080fd5b620001b888838901620000a3565b93506060870151915080821115620001cf57600080fd5b50620001de87828801620000a3565b91505092959194509250565b600181811c90821680620001ff57607f821691505b6020821081036200022057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200027457600081815260208120601f850160051c810160208610156200024f5750805b601f850160051c820191505b8181101562000270578281556001016200025b565b5050505b505050565b81516001600160401b038111156200029557620002956200008d565b620002ad81620002a68454620001ea565b8462000226565b602080601f831160018114620002e55760008415620002cc5750858301515b600019600386901b1c1916600185901b17855562000270565b600085815260208120601f198616915b828110156200031657888601518255948401946001909101908401620002f5565b5085821015620003355787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a0516110c862000379600039600081816103160152818161050a01526106270152600061014d01526110c86000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c806340c10f19116100b25780639dc29fac11610081578063a9059cbb11610066578063a9059cbb146102b8578063dd62ed3e146102cb578063ee9a31a21461031157600080fd5b80639dc29fac14610292578063a457c2d7146102a557600080fd5b806340c10f191461020357806354fd4d501461021857806370a082311461025457806395d89b411461028a57600080fd5b806318160ddd116100ee57806318160ddd146101bc57806323b872dd146101ce578063313ce567146101e157806339509351146101f057600080fd5b806301ffc9a714610120578063033964be1461014857806306fdde0314610194578063095ea7b3146101a9575b600080fd5b61013361012e366004610e90565b610338565b60405190151581526020015b60405180910390f35b61016f7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161013f565b61019c6103d8565b60405161013f9190610ed9565b6101336101b7366004610f75565b61046a565b6002545b60405190815260200161013f565b6101336101dc366004610f9f565b610482565b6040516012815260200161013f565b6101336101fe366004610f75565b6104a6565b610216610211366004610f75565b6104f2565b005b61019c6040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6101c0610262366004610fdb565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61019c610600565b6102166102a0366004610f75565b61060f565b6101336102b3366004610f75565b61070c565b6101336102c6366004610f75565b6107c3565b6101c06102d9366004610ff6565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b61016f7f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f30a0c5a9000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084168214806103d057507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b6060600380546103e790611029565b80601f016020809104026020016040519081016040528092919081815260200182805461041390611029565b80156104605780601f1061043557610100808354040283529160200191610460565b820191906000526020600020905b81548152906001019060200180831161044357829003601f168201915b5050505050905090565b6000336104788185856107d1565b5060019392505050565b600033610490858285610951565b61049b858585610a0e565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919061047890829086906104ed90879061107c565b6107d1565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146105a25760405162461bcd60e51b815260206004820152603160248201527f4b726f6d614d696e7461626c6545524332303a206f6e6c79206272696467652060448201527f63616e206d696e7420616e64206275726e00000000000000000000000000000060648201526084015b60405180910390fd5b6105ac8282610c2f565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516105f491815260200190565b60405180910390a25050565b6060600480546103e790611029565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106ba5760405162461bcd60e51b815260206004820152603160248201527f4b726f6d614d696e7461626c6545524332303a206f6e6c79206272696467652060448201527f63616e206d696e7420616e64206275726e0000000000000000000000000000006064820152608401610599565b6106c48282610d08565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040516105f491815260200190565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107b65760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610599565b61049b82868684036107d1565b600033610478818585610a0e565b73ffffffffffffffffffffffffffffffffffffffff83166108595760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610599565b73ffffffffffffffffffffffffffffffffffffffff82166108e25760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610599565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610a0857818110156109fb5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610599565b610a0884848484036107d1565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610a975760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610599565b73ffffffffffffffffffffffffffffffffffffffff8216610b205760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610599565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610bbc5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610599565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610a08565b73ffffffffffffffffffffffffffffffffffffffff8216610c925760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610599565b8060026000828254610ca4919061107c565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610d915760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610599565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610e2d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610599565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610944565b600060208284031215610ea257600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610ed257600080fd5b9392505050565b600060208083528351808285015260005b81811015610f0657858101830151858201604001528201610eea565b81811115610f18576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610f7057600080fd5b919050565b60008060408385031215610f8857600080fd5b610f9183610f4c565b946020939093013593505050565b600080600060608486031215610fb457600080fd5b610fbd84610f4c565b9250610fcb60208501610f4c565b9150604084013590509250925092565b600060208284031215610fed57600080fd5b610ed282610f4c565b6000806040838503121561100957600080fd5b61101283610f4c565b915061102060208401610f4c565b90509250929050565b600181811c9082168061103d57607f821691505b602082108103611076577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600082198211156110b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50019056fea164736f6c634300080f000aa164736f6c634300080f000a", + "key": "0xc158f1c4ca002e59c1aa0ce71d03e1a6fcb8722608e7b0e397a3c94dcb96c4cd" + }, + "0x4c5859f0f772848b2d91f1d83e2fe57935348029": { + "balance": "0", + "nonce": 1, + "root": "0x7764c6088e9cfa756b2d7eeaed6b90ec301988efc899e3b6f514bf00b5fa984b", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "code": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", + "storage": { + "0x000000000000000000000000000000000000000000000000000000000000000c": "01", + "0x000000000000000000000000000000000000000000000000000000000000003f": "f39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "0x0000000000000000000000000000000000000000000000000000000000000071": "1291be112d480055dafd8a610b7d1e203891c274", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "5f3f1dbd7b74c6b46e8c44f98792a1daf8d69154", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "f39fd6e51aad88f6f4ce6ab8827279cfffb92266" + }, "key": "0x7392cffa2105097e2c40fb48f59b2e37173affe4b8047e54483cc5eb85b2db13" }, "0x4e59b44847b379578588920ca78fbf26c0b4956c": { @@ -169,13 +253,24 @@ "code": "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3", "key": "0x491ded984cd17b1afee6ccb6ef366c53dd79f50b592816adc12e9302a9f2b36c" }, - "0x4ed7c70f96b99c776995fb64377f0d4ab3b0e1c1": { + "0x59b670e9fa9d0a427751af201d676719a970857b": { "balance": "0", "nonce": 1, "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "0x35557ad22a54e2d0ee2fcd5267d8726f9e014d93448c30d3d0ea003f20103f13", - "code": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c8063761f44931161005b578063761f44931461012d5780637f46ddb214610140578063927ede2d1461018c578063aa557452146101b357600080fd5b80633687011a1461008257806354fd4d50146100975780635d93a3fc146100e9575b600080fd5b610095610090366004610bad565b6101c6565b005b6100d36040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516100e09190610c9b565b60405180910390f35b61011d6100f7366004610cb5565b603160209081526000938452604080852082529284528284209052825290205460ff1681565b60405190151581526020016100e0565b61009561013b366004610cf6565b610272565b6101677f000000000000000000000000420000000000000000000000000000000000000a81565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e0565b6101677f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570781565b6100956101c1366004610d8e565b6106f3565b333b1561025a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4552433732314272696467653a206163636f756e74206973206e6f742065787460448201527f65726e616c6c79206f776e65640000000000000000000000000000000000000060648201526084015b60405180910390fd5b61026a86863333888888886107af565b505050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f8757071614801561039057507f000000000000000000000000420000000000000000000000000000000000000a73ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570773ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015610354573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103789190610e05565b73ffffffffffffffffffffffffffffffffffffffff16145b61041c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f4552433732314272696467653a2066756e6374696f6e2063616e206f6e6c792060448201527f62652063616c6c65642066726f6d20746865206f7468657220627269646765006064820152608401610251565b3073ffffffffffffffffffffffffffffffffffffffff8816036104c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4c314552433732314272696467653a206c6f63616c20746f6b656e2063616e6e60448201527f6f742062652073656c66000000000000000000000000000000000000000000006064820152608401610251565b73ffffffffffffffffffffffffffffffffffffffff8088166000908152603160209081526040808320938a1683529281528282208683529052205460ff161515600114610590576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f4c314552433732314272696467653a20546f6b656e204944206973206e6f742060448201527f657363726f77656420696e20746865204c3120427269646765000000000000006064820152608401610251565b73ffffffffffffffffffffffffffffffffffffffff87811660008181526031602090815260408083208b8616845282528083208884529091529081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517f42842e0e000000000000000000000000000000000000000000000000000000008152306004820152918616602483015260448201859052906342842e0e90606401600060405180830381600087803b15801561065057600080fd5b505af1158015610664573d6000803e3d6000fd5b505050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f1f39bf6707b5d608453e0ae4c067b562bcc4c85c0f562ef5d2c774d2e7f131ac878787876040516106e29493929190610e6b565b60405180910390a450505050505050565b73ffffffffffffffffffffffffffffffffffffffff8516610796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4552433732314272696467653a206e667420726563697069656e742063616e6e60448201527f6f742062652061646472657373283029000000000000000000000000000000006064820152608401610251565b6107a687873388888888886107af565b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff8716610852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4c314552433732314272696467653a2072656d6f746520746f6b656e2063616e60448201527f6e6f7420626520616464726573732830290000000000000000000000000000006064820152608401610251565b600063761f449360e01b888a89898988886040516024016108799796959493929190610eab565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000959095169490941790935273ffffffffffffffffffffffffffffffffffffffff8c81166000818152603186528381208e8416825286528381208b82529095529382902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590517f23b872dd000000000000000000000000000000000000000000000000000000008152908a166004820152306024820152604481018890529092506323b872dd90606401600060405180830381600087803b1580156109b957600080fd5b505af11580156109cd573d6000803e3d6000fd5b50506040517f3dbb202b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f875707169250633dbb202b9150610a67907f000000000000000000000000420000000000000000000000000000000000000a9085908990600401610f08565b600060405180830381600087803b158015610a8157600080fd5b505af1158015610a95573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fb7460e2a880f256ebef3406116ff3eee0cee51ebccdc2a40698f87ebb2e9c1a589898888604051610b139493929190610e6b565b60405180910390a4505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610b4857600080fd5b50565b803563ffffffff81168114610b5f57600080fd5b919050565b60008083601f840112610b7657600080fd5b50813567ffffffffffffffff811115610b8e57600080fd5b602083019150836020828501011115610ba657600080fd5b9250929050565b60008060008060008060a08789031215610bc657600080fd5b8635610bd181610b26565b95506020870135610be181610b26565b945060408701359350610bf660608801610b4b565b9250608087013567ffffffffffffffff811115610c1257600080fd5b610c1e89828a01610b64565b979a9699509497509295939492505050565b6000815180845260005b81811015610c5657602081850181015186830182015201610c3a565b81811115610c68576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610cae6020830184610c30565b9392505050565b600080600060608486031215610cca57600080fd5b8335610cd581610b26565b92506020840135610ce581610b26565b929592945050506040919091013590565b600080600080600080600060c0888a031215610d1157600080fd5b8735610d1c81610b26565b96506020880135610d2c81610b26565b95506040880135610d3c81610b26565b94506060880135610d4c81610b26565b93506080880135925060a088013567ffffffffffffffff811115610d6f57600080fd5b610d7b8a828b01610b64565b989b979a50959850939692959293505050565b600080600080600080600060c0888a031215610da957600080fd5b8735610db481610b26565b96506020880135610dc481610b26565b95506040880135610dd481610b26565b945060608801359350610de960808901610b4b565b925060a088013567ffffffffffffffff811115610d6f57600080fd5b600060208284031215610e1757600080fd5b8151610cae81610b26565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201526000610ea1606083018486610e22565b9695505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808a1683528089166020840152808816604084015280871660608401525084608083015260c060a0830152610efb60c083018486610e22565b9998505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000610f376060830185610c30565b905063ffffffff8316604083015294935050505056fea164736f6c634300080f000a", - "key": "0x5de0e21cdf25878b7a77849412f455c97a2362c7162876bf459d8d8e84c55255" + "codeHash": "0xdcc518c7fadf757cf1e4e6a15d0ac839b78d9dbaa999e18b0ae05ede6535b58c", + "code": "0x6080604052600436106100b55760003560e01c80637f46ddb2116100695780638f601f661161004e5780638f601f6614610298578063927ede2d146102db578063e11013dd1461030f57600080fd5b80637f46ddb21461021f578063870876231461027857600080fd5b80631635f5fd1161009a5780631635f5fd1461018d578063540abf73146101a057806354fd4d50146101c057600080fd5b80630166a07a1461015a57806309fc88431461017a57600080fd5b3661015557333b156101345760405162461bcd60e51b815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b61015333333462030d4060405180602001604052806000815250610322565b005b600080fd5b34801561016657600080fd5b50610153610175366004611973565b610547565b610153610188366004611a24565b610943565b61015361019b366004611a77565b610a00565b3480156101ac57600080fd5b506101536101bb366004611aea565b610e7a565b3480156101cc57600080fd5b506102096040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516102169190611bd7565b60405180910390f35b34801561022b57600080fd5b506102537f000000000000000000000000420000000000000000000000000000000000000981565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610216565b34801561028457600080fd5b50610153610293366004611bea565b610ec8565b3480156102a457600080fd5b506102cd6102b3366004611c6d565b600060208181529281526040808220909352908152205481565b604051908152602001610216565b3480156102e757600080fd5b506102537f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570781565b61015361031d366004611ca6565b610f82565b8234146103975760405162461bcd60e51b815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c75650000606482015260840161012b565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af585846040516103f6929190611d09565b60405180910390a37f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570773ffffffffffffffffffffffffffffffffffffffff16633dbb202b847f0000000000000000000000004200000000000000000000000000000000000009631635f5fd60e01b8989898860405160240161047b9493929190611d22565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b909216825261050e92918890600401611d6b565b6000604051808303818588803b15801561052757600080fd5b505af115801561053b573d6000803e3d6000fd5b50505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f8757071614801561066557507f000000000000000000000000420000000000000000000000000000000000000973ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570773ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015610629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064d9190611db0565b73ffffffffffffffffffffffffffffffffffffffff16145b6106fd5760405162461bcd60e51b815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a40161012b565b61070687610fcb565b1561083a576107158787610ffd565b6107ad5760405162461bcd60e51b815260206004820152604760248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204b726f6d61204d696e7461626c65204552433230206c6f636160648201527f6c20746f6b656e00000000000000000000000000000000000000000000000000608482015260a40161012b565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b15801561081d57600080fd5b505af1158015610831573d6000803e3d6000fd5b505050506108b8565b73ffffffffffffffffffffffffffffffffffffffff808816600090815260208181526040808320938a1683529290522054610876908490611dfc565b73ffffffffffffffffffffffffffffffffffffffff808916600081815260208181526040808320948c16835293905291909120919091556108b89085856110a4565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd878787876040516109329493929190611e5c565b60405180910390a450505050505050565b333b156109b85760405162461bcd60e51b815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f41000000000000000000606482015260840161012b565b6109fb3333348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061032292505050565b505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570716148015610b1e57507f000000000000000000000000420000000000000000000000000000000000000973ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570773ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ae2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b069190611db0565b73ffffffffffffffffffffffffffffffffffffffff16145b610bb65760405162461bcd60e51b815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a40161012b565b823414610c2b5760405162461bcd60e51b815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e74207265717569726564000000000000606482015260840161012b565b3073ffffffffffffffffffffffffffffffffffffffff851603610cb65760405162461bcd60e51b815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c660000000000000000000000000000000000000000000000000000000000606482015260840161012b565b7f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570773ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610d775760405162461bcd60e51b815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e676572000000000000000000000000000000000000000000000000606482015260840161012b565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d858585604051610dd893929190611e92565b60405180910390a36000610dfd855a8660405180602001604052806000815250611178565b905080610e725760405162461bcd60e51b815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c65640000000000000000000000000000000000000000000000000000000000606482015260840161012b565b505050505050565b610ebf87873388888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061119492505050565b50505050505050565b333b15610f3d5760405162461bcd60e51b815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f41000000000000000000606482015260840161012b565b610e7286863333888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061119492505050565b610fc53385348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061032292505050565b50505050565b6000610ff7827f30a0c5a90000000000000000000000000000000000000000000000000000000061152f565b92915050565b60008273ffffffffffffffffffffffffffffffffffffffff1663033964be6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561104a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106e9190611db0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614905092915050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109fb9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611552565b600080600080845160208601878a8af19150505b949350505050565b61119d87610fcb565b156112d1576111ac8787610ffd565b6112445760405162461bcd60e51b815260206004820152604760248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204b726f6d61204d696e7461626c65204552433230206c6f636160648201527f6c20746f6b656e00000000000000000000000000000000000000000000000000608482015260a40161012b565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b1580156112b457600080fd5b505af11580156112c8573d6000803e3d6000fd5b50505050611361565b6112f373ffffffffffffffffffffffffffffffffffffffff8816863086611647565b73ffffffffffffffffffffffffffffffffffffffff808816600090815260208181526040808320938a168352929052205461132f908490611eb5565b73ffffffffffffffffffffffffffffffffffffffff808916600090815260208181526040808320938b16835292905220555b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf8787866040516113d993929190611ecd565b60405180910390a47f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570773ffffffffffffffffffffffffffffffffffffffff16633dbb202b7f0000000000000000000000004200000000000000000000000000000000000009630166a07a60e01b898b8a8a8a8960405160240161146196959493929190611f02565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b90921682526114f492918790600401611d6b565b600060405180830381600087803b15801561150e57600080fd5b505af1158015611522573d6000803e3d6000fd5b5050505050505050505050565b600061153a836116a5565b801561154b575061154b8383611709565b9392505050565b60006115b4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166117d89092919063ffffffff16565b90508051600014806115d55750808060200190518101906115d59190611f5d565b6109fb5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161012b565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052610fc59085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016110f6565b60006116d1827f01ffc9a700000000000000000000000000000000000000000000000000000000611709565b8015610ff75750611702827fffffffff00000000000000000000000000000000000000000000000000000000611709565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156117c1575060208210155b80156117cd5750600081115b979650505050505050565b606061118c8484600085856000808673ffffffffffffffffffffffffffffffffffffffff16858760405161180c9190611f7f565b60006040518083038185875af1925050503d8060008114611849576040519150601f19603f3d011682016040523d82523d6000602084013e61184e565b606091505b50915091506117cd87838387606083156118d65782516000036118cf5773ffffffffffffffffffffffffffffffffffffffff85163b6118cf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161012b565b508161118c565b61118c83838151156118eb5781518083602001fd5b8060405162461bcd60e51b815260040161012b9190611bd7565b73ffffffffffffffffffffffffffffffffffffffff8116811461192757600080fd5b50565b60008083601f84011261193c57600080fd5b50813567ffffffffffffffff81111561195457600080fd5b60208301915083602082850101111561196c57600080fd5b9250929050565b600080600080600080600060c0888a03121561198e57600080fd5b873561199981611905565b965060208801356119a981611905565b955060408801356119b981611905565b945060608801356119c981611905565b93506080880135925060a088013567ffffffffffffffff8111156119ec57600080fd5b6119f88a828b0161192a565b989b979a50959850939692959293505050565b803563ffffffff81168114611a1f57600080fd5b919050565b600080600060408486031215611a3957600080fd5b611a4284611a0b565b9250602084013567ffffffffffffffff811115611a5e57600080fd5b611a6a8682870161192a565b9497909650939450505050565b600080600080600060808688031215611a8f57600080fd5b8535611a9a81611905565b94506020860135611aaa81611905565b935060408601359250606086013567ffffffffffffffff811115611acd57600080fd5b611ad98882890161192a565b969995985093965092949392505050565b600080600080600080600060c0888a031215611b0557600080fd5b8735611b1081611905565b96506020880135611b2081611905565b95506040880135611b3081611905565b945060608801359350611b4560808901611a0b565b925060a088013567ffffffffffffffff8111156119ec57600080fd5b60005b83811015611b7c578181015183820152602001611b64565b83811115610fc55750506000910152565b60008151808452611ba5816020860160208601611b61565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061154b6020830184611b8d565b60008060008060008060a08789031215611c0357600080fd5b8635611c0e81611905565b95506020870135611c1e81611905565b945060408701359350611c3360608801611a0b565b9250608087013567ffffffffffffffff811115611c4f57600080fd5b611c5b89828a0161192a565b979a9699509497509295939492505050565b60008060408385031215611c8057600080fd5b8235611c8b81611905565b91506020830135611c9b81611905565b809150509250929050565b60008060008060608587031215611cbc57600080fd5b8435611cc781611905565b9350611cd560208601611a0b565b9250604085013567ffffffffffffffff811115611cf157600080fd5b611cfd8782880161192a565b95989497509550505050565b82815260406020820152600061118c6040830184611b8d565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152611d616080830184611b8d565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000611d9a6060830185611b8d565b905063ffffffff83166040830152949350505050565b600060208284031215611dc257600080fd5b815161154b81611905565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611e0e57611e0e611dcd565b500390565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201526000611d61606083018486611e13565b838152604060208201526000611eac604083018486611e13565b95945050505050565b60008219821115611ec857611ec8611dcd565b500190565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000611eac6060830184611b8d565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a0830152611f5160c0830184611b8d565b98975050505050505050565b600060208284031215611f6f57600080fd5b8151801515811461154b57600080fd5b60008251611f91818460208701611b61565b919091019291505056fea164736f6c634300080f000a", + "key": "0x955b9191e283f55b64f3d7bbeacf7afa8b939366f402751f848ad0791681c7df" + }, + "0x5f3f1dbd7b74c6b46e8c44f98792a1daf8d69154": { + "balance": "0", + "nonce": 1, + "root": "0x3fe1d369b347a5a5c3ef2ffc7443ecb417736b02d5d3d46543e0dddbe76c8540", + "codeHash": "0x2d6cede68f07a8510838b46bb318ea6a139a5572ba3b127284651116581a2411", + "code": "0x608060405234801561001057600080fd5b50600436106102775760003560e01c806379ba509711610160578063a457c2d7116100d8578063dd62ed3e1161008c578063ee9a31a211610071578063ee9a31a21461060c578063f1127ed814610633578063f2fde38b1461068557600080fd5b8063dd62ed3e146105c2578063e30c3978146105fb57600080fd5b8063c3cda520116100bd578063c3cda52014610589578063c4d66de81461059c578063d505accf146105af57600080fd5b8063a457c2d714610563578063a9059cbb1461057657600080fd5b80638e539e8c1161012f57806395d89b411161011457806395d89b41146105045780639ab24eb01461053d5780639dc29fac1461055057600080fd5b80638e539e8c146104d257806391ddadf4146104e557600080fd5b806379ba50971461048b5780637ecebe001461049357806384b0196e146104a65780638da5cb5b146104c157600080fd5b80633a46b1a8116101f3578063587cde1e116101c25780636fcfff45116101a75780636fcfff451461043257806370a082311461045a578063715018a61461048357600080fd5b8063587cde1e146103f35780635c19a95c1461041f57600080fd5b80633a46b1a81461038757806340c10f191461039a5780634bf5d7e9146103af57806354fd4d50146103b757600080fd5b806318160ddd1161024a578063313ce5671161022f578063313ce5671461035d5780633644e5151461036c578063395093511461037457600080fd5b806318160ddd1461033857806323b872dd1461034a57600080fd5b806301ffc9a71461027c578063033964be146102a457806306fdde03146102e3578063095ea7b314610325575b600080fd5b61028f61028a366004612a65565b610698565b60405190151581526020015b60405180910390f35b6102cb7f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe5793534802981565b6040516001600160a01b03909116815260200161029b565b60408051808201909152600581527f4b726f6d6100000000000000000000000000000000000000000000000000000060208201525b60405161029b9190612b12565b61028f610333366004612b41565b610738565b6002545b60405190815260200161029b565b61028f610358366004612b6b565b610752565b6040516012815260200161029b565b61033c610776565b61028f610382366004612b41565b610785565b61033c610395366004612b41565b6107c4565b6103ad6103a8366004612b41565b610852565b005b610318610913565b6103186040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6102cb610401366004612ba7565b6001600160a01b039081166000908152600960205260409020541690565b6103ad61042d366004612ba7565b6109ab565b610445610440366004612ba7565b6109b8565b60405163ffffffff909116815260200161029b565b61033c610468366004612ba7565b6001600160a01b031660009081526020819052604090205490565b6103ad6109da565b6103ad6109ee565b61033c6104a1366004612ba7565b610a79565b6104ae610a97565b60405161029b9796959493929190612bc2565b603f546001600160a01b03166102cb565b61033c6104e0366004612c74565b610b3c565b6104ed610ba7565b60405165ffffffffffff909116815260200161029b565b60408051808201909152600381527f4b524f00000000000000000000000000000000000000000000000000000000006020820152610318565b61033c61054b366004612ba7565b610bb2565b6103ad61055e366004612b41565b610c5e565b61028f610571366004612b41565b610d06565b61028f610584366004612b41565b610db0565b6103ad610597366004612c9e565b610dbe565b6103ad6105aa366004612ba7565b610ef4565b6103ad6105bd366004612cf6565b611075565b61033c6105d0366004612d60565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6071546001600160a01b03166102cb565b6102cb7f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b610646610641366004612d93565b6111d9565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16928101929092520161029b565b6103ad610693366004612ba7565b611272565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f30a0c5a9000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000841682148061073057507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b60003361074681858561132f565b60019150505b92915050565b600033610760858285611487565b61076b858585611519565b506001949350505050565b600061078061170c565b905090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919061074690829086906107bf908790612e02565b61132f565b60006107ce610ba7565b65ffffffffffff1682106108295760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20667574757265206c6f6f6b75700000000000000060448201526064015b60405180910390fd5b6001600160a01b0383166000908152600a6020526040902061084b9083611837565b9392505050565b336001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f1614806108935750603f546001600160a01b031633145b6109055760405162461bcd60e51b815260206004820152602e60248201527f476f7665726e616e6365546f6b656e3a206f6e6c7920627269646765206f722060448201527f6f776e65722063616e206d696e740000000000000000000000000000000000006064820152608401610820565b61090f828261194a565b5050565b60604361091e610ba7565b65ffffffffffff16146109735760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a2062726f6b656e20636c6f636b206d6f64650000006044820152606401610820565b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b6109b5338261199b565b50565b6001600160a01b0381166000908152600a602052604081205461074c90611a2c565b6109e2611aac565b6109ec6000611b06565b565b60715433906001600160a01b03168114610a705760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610820565b6109b581611b06565b6001600160a01b03811660009081526007602052604081205461074c565b600060608082808083610acb7f4b726f6d610000000000000000000000000000000000000000000000000000056005611b37565b610af67f31000000000000000000000000000000000000000000000000000000000000016006611b37565b604080516000808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6000610b46610ba7565b65ffffffffffff168210610b9c5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20667574757265206c6f6f6b7570000000000000006044820152606401610820565b61074c600b83611837565b600061078043611bdb565b6001600160a01b0381166000908152600a60205260408120548015610c36576001600160a01b0383166000908152600a6020526040902080546000198301908110610bff57610bff612e49565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610c39565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b336001600160a01b037f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f1614610cfc5760405162461bcd60e51b815260206004820152603160248201527f4b726f6d614d696e7461626c6545524332303a206f6e6c79206272696467652060448201527f63616e206d696e7420616e64206275726e0000000000000000000000000000006064820152608401610820565b61090f8282611c59565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919083811015610da35760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610820565b61076b828686840361132f565b600033610746818585611519565b83421115610e0e5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610820565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610e8890610e809060a00160405160208183030381529060405280519060200120611c9e565b858585611ce6565b9050610e9381611d0e565b8614610ee15760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610820565b610eeb818861199b565b50505050505050565b600c54610100900460ff1615808015610f145750600c54600160ff909116105b80610f2e5750303b158015610f2e5750600c5460ff166001145b610fa05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610820565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610ffe57600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b611006611d36565b61100f82611272565b801561090f57600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b834211156110c55760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610820565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886110f48c611d0e565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061114f82611c9e565b9050600061115f82878787611ce6565b9050896001600160a01b0316816001600160a01b0316146111c25760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610820565b6111cd8a8a8a61132f565b50505050505050505050565b60408051808201909152600080825260208201526001600160a01b0383166000908152600a60205260409020805463ffffffff841690811061121d5761121d612e49565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b61127a611aac565b607180546001600160a01b0383167fffffffffffffffffffffffff000000000000000000000000000000000000000090911681179091556112c3603f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60006020835110156113175761131083611dbb565b905061074c565b816113228482612f13565b5060ff905061074c565b90565b6001600160a01b0383166113aa5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166114265760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461151357818110156115065760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610820565b611513848484840361132f565b50505050565b6001600160a01b0383166115955760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166116115760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b038316600090815260208190526040902054818110156116a05760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611513848484611e17565b6000306001600160a01b037f0000000000000000000000005f3f1dbd7b74c6b46e8c44f98792a1daf8d691541614801561176557507f000000000000000000000000000000000000000000000000000000000000053946145b1561178f57507f442af78ca6ccf64fbca073e4289e47cad3d1257beda674aaa14b53d2afd8589e90565b610780604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f7d1780c7a694e1f75550e8e5f55a6c40ba84748efbfbd38087dbf009f30899ba918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b81546000908181600581111561189157600061185284611e22565b61185c9085612ff1565b600088815260209020909150869082015463ffffffff1611156118815780915061188f565b61188c816001612e02565b92505b505b808210156118de5760006118a58383611f0a565b600088815260209020909150869082015463ffffffff1611156118ca578091506118d8565b6118d5816001612e02565b92505b50611891565b801561191f576000868152602090208101600019015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611922565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169695505050505050565b6119548282611f25565b816001600160a01b03167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161198f91815260200190565b60405180910390a25050565b6001600160a01b038281166000818152600960208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611513828483611fd1565b600063ffffffff821115611aa85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610820565b5090565b603f546001600160a01b031633146109ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610820565b607180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556109b58161210e565b606060ff8314611b4a5761131083612178565b818054611b5690612e78565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8290612e78565b8015611bcf5780601f10611ba457610100808354040283529160200191611bcf565b820191906000526020600020905b815481529060010190602001808311611bb257829003601f168201915b5050505050905061074c565b600065ffffffffffff821115611aa85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201527f38206269747300000000000000000000000000000000000000000000000000006064820152608401610820565b611c6382826121b7565b816001600160a01b03167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161198f91815260200190565b600061074c611cab61170c565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6000806000611cf7878787876121cf565b91509150611d04816122b1565b5095945050505050565b6001600160a01b03811660009081526007602052604090208054600181018255905b50919050565b600c54610100900460ff16611db35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610820565b6109ec612416565b600080829050601f81511115611dff57826040517f305a27a90000000000000000000000000000000000000000000000000000000081526004016108209190612b12565b8051611e0a82613008565b179392505050565b505050565b611e1283838361249c565b600081600003611e3457506000919050565b60006001611e41846124ce565b901c6001901b90506001818481611e5a57611e5a61302c565b048201901c90506001818481611e7257611e7261302c565b048201901c90506001818481611e8a57611e8a61302c565b048201901c90506001818481611ea257611ea261302c565b048201901c90506001818481611eba57611eba61302c565b048201901c90506001818481611ed257611ed261302c565b048201901c90506001818481611eea57611eea61302c565b048201901c905061084b81828581611f0457611f0461302c565b04612562565b6000611f19600284841861305b565b61084b90848416612e02565b611f2f8282612578565b6002547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1015611fc35760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610820565b611513600b61263f8361264b565b816001600160a01b0316836001600160a01b031614158015611ff35750600081115b15611e12576001600160a01b03831615612081576001600160a01b0383166000908152600a60205260408120819061202e906128148561264b565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612076929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611e12576001600160a01b0382166000908152600a6020526040812081906120b79061263f8561264b565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516120ff929190918252602082015260400190565b60405180910390a25050505050565b603f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060600061218583612820565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b6121c18282612861565b611513600b6128148361264b565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561220657506000905060036122a8565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561225a573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b0381166122a1576000600192509250506122a8565b9150600090505b94509492505050565b60008160048111156122c5576122c5613096565b036122cd5750565b60018160048111156122e1576122e1613096565b0361232e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610820565b600281600481111561234257612342613096565b0361238f5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610820565b60038160048111156123a3576123a3613096565b036109b55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610820565b600c54610100900460ff166124935760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610820565b6109ec33611b06565b6001600160a01b03838116600090815260096020526040808220548584168352912054611e1292918216911683611fd1565b600080608083901c156124e357608092831c92015b604083901c156124f557604092831c92015b602083901c1561250757602092831c92015b601083901c1561251957601092831c92015b600883901c1561252b57600892831c92015b600483901c1561253d57600492831c92015b600283901c1561254f57600292831c92015b600183901c1561074c5760010192915050565b6000818310612571578161084b565b5090919050565b6001600160a01b0382166125ce5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610820565b80600260008282546125e09190612e02565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361090f60008383611e17565b600061084b8284612e02565b825460009081908181156126ad5760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660208201526126c2565b60408051808201909152600080825260208201525b905080602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1693506126f784868863ffffffff16565b9250600082118015612721575061270c610ba7565b65ffffffffffff16816000015163ffffffff16145b1561277b5761272f836129d1565b60008881526020902083016000190180547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092166401000000000263ffffffff90921691909117905561280a565b86604051806040016040528061279f612792610ba7565b65ffffffffffff16611a2c565b63ffffffff1681526020016127b3866129d1565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b600061084b8284612ff1565b600060ff8216601f81111561074c576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166128dd5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166000908152602081905260409020548181101561296c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611e1283600084611e17565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821115611aa85760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610820565b600060208284031215612a7757600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461084b57600080fd5b6000815180845260005b81811015612acd57602081850181015186830182015201612ab1565b81811115612adf576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061084b6020830184612aa7565b80356001600160a01b0381168114612b3c57600080fd5b919050565b60008060408385031215612b5457600080fd5b612b5d83612b25565b946020939093013593505050565b600080600060608486031215612b8057600080fd5b612b8984612b25565b9250612b9760208501612b25565b9150604084013590509250925092565b600060208284031215612bb957600080fd5b61084b82612b25565b7fff00000000000000000000000000000000000000000000000000000000000000881681526000602060e081840152612bfe60e084018a612aa7565b8381036040850152612c10818a612aa7565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b81811015612c6257835183529284019291840191600101612c46565b50909c9b505050505050505050505050565b600060208284031215612c8657600080fd5b5035919050565b803560ff81168114612b3c57600080fd5b60008060008060008060c08789031215612cb757600080fd5b612cc087612b25565b95506020870135945060408701359350612cdc60608801612c8d565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a031215612d1157600080fd5b612d1a88612b25565b9650612d2860208901612b25565b95506040880135945060608801359350612d4460808901612c8d565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612d7357600080fd5b612d7c83612b25565b9150612d8a60208401612b25565b90509250929050565b60008060408385031215612da657600080fd5b612daf83612b25565b9150602083013563ffffffff81168114612dc857600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612e1557612e15612dd3565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c90821680612e8c57607f821691505b602082108103611d30577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f821115611e1257600081815260208120601f850160051c81016020861015612eec5750805b601f850160051c820191505b81811015612f0b57828155600101612ef8565b505050505050565b815167ffffffffffffffff811115612f2d57612f2d612e1a565b612f4181612f3b8454612e78565b84612ec5565b602080601f831160018114612f765760008415612f5e5750858301515b600019600386901b1c1916600185901b178555612f0b565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015612fc357888601518255948401946001909101908401612fa4565b5085821015612fe15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008282101561300357613003612dd3565b500390565b80516020808301519190811015611d305760001960209190910360031b1b16919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613091577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a", + "storage": { + "0x000000000000000000000000000000000000000000000000000000000000000c": "ff" + }, + "key": "0x2f2e559016e1fc00ff23d4dd67946860f76979563e8f80a6faef78622494aa39" }, "0x5fbdb2315678afecb367f032d93f642f64180aa3": { "balance": "0", @@ -191,13 +286,13 @@ "0x5fc8d32690cc91d4c39d9d3abcbd16989f875707": { "balance": "0", "nonce": 1, - "root": "0x95d2119022b82ad0453ac48c21ab9be04087c5d933f4ed65929885216a0e1bbe", + "root": "0xd1a8132ce5b8d0cc8e477431fb98f5586d2a7cb47d70fe585976de8271e86ef3", "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", "code": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", "storage": { "0x0000000000000000000000000000000000000000000000000000000000000000": "01", "0x0000000000000000000000000000000000000000000000000000000000000066": "dead", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "68b1d87f95878fe05b998f19b66f4baba5de1aed", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "3aa5ebb10dc797cac828524e59a333d0a371443c", "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "5fbdb2315678afecb367f032d93f642f64180aa3" }, "key": "0x0d61055ea920808012c78dfc3fd2714d5ce59f19b79b6147d59d69a3888a84f5" @@ -205,12 +300,12 @@ "0x610178da211fef7d417bc0e6fed39f05609ad788": { "balance": "0", "nonce": 1, - "root": "0xad971c74e88ef391bdd900b02535c4a73b79393b7f03c7c0cc9d53a55e1f1224", + "root": "0x67afb40e27834cbd9ca326de47b395dc98d789f1d5368ab48151dd5167071991", "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", "code": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", "storage": { "0x0000000000000000000000000000000000000000000000000000000000000000": "01", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "84ea74d481ee0a5332c457a4d796187f6ba67feb", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "9e545e3c0baab3e08cdfd552c960a1050f373042", "0x7dfe757ecd65cbd7922a9c0161e935dd7fdbcc0e999689c7d31633896b1fc60b": "03", "0xa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49": "02", "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "5fbdb2315678afecb367f032d93f642f64180aa3", @@ -219,77 +314,66 @@ }, "key": "0xc6ca7521443eb53bb835320d8045532cc699c3564097dc83c2afa5aa02120e72" }, - "0x68b1d87f95878fe05b998f19b66f4baba5de1aed": { + "0x67d269191c92caf3cd7723f116c85e6e9bf55933": { "balance": "0", "nonce": 1, - "root": "0xb45fafbc41242521fb222c114d80647c0858e2a27d7574ef837788f7a78cdaaa", - "codeHash": "0x02898aaa7c1add99de89629303000fbd799dcaaec7d7380cb042e86d96a9fd75", - "code": "0x60806040526004361061015f5760003560e01c80636e296e45116100c0578063a4e7f8bd11610074578063b28ade2511610059578063b28ade25146103d2578063d764ad0b146103f2578063ecc704281461040557600080fd5b8063a4e7f8bd14610372578063b1b1b209146103a257600080fd5b806383a74074116100a557806383a74074146103275780638cbeeef2146102575780639fce812c1461033e57600080fd5b80636e296e45146102fd5780638129fc1c1461031257600080fd5b80633f827a5a1161011757806354fd4d50116100fc57806354fd4d501461026d5780635644cfdf146102c35780635c975abb146102d957600080fd5b80633f827a5a1461022f5780634c1d6a691461025757600080fd5b80630ff754ea116101485780630ff754ea146101ac5780632828d7e8146102055780633dbb202b1461021a57600080fd5b8063028f85f7146101645780630c56849814610197575b600080fd5b34801561017057600080fd5b50610179601081565b60405167ffffffffffffffff90911681526020015b60405180910390f35b3480156101a357600080fd5b50610179603f81565b3480156101b857600080fd5b506101e07f0000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018e565b34801561021157600080fd5b50610179604081565b61022d610228366004611563565b610443565b005b34801561023b57600080fd5b50610244600081565b60405161ffff909116815260200161018e565b34801561026357600080fd5b50610179619c4081565b34801561027957600080fd5b506102b66040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161018e9190611635565b3480156102cf57600080fd5b5061017961138881565b3480156102e557600080fd5b5060335460ff165b604051901515815260200161018e565b34801561030957600080fd5b506101e0610631565b34801561031e57600080fd5b5061022d61071d565b34801561033357600080fd5b5061017962030d4081565b34801561034a57600080fd5b506101e07f000000000000000000000000420000000000000000000000000000000000000481565b34801561037e57600080fd5b506102ed61038d36600461164f565b60686020526000908152604090205460ff1681565b3480156103ae57600080fd5b506102ed6103bd36600461164f565b60656020526000908152604090205460ff1681565b3480156103de57600080fd5b506101796103ed366004611668565b6108af565b61022d6104003660046116bc565b61091d565b34801561041157600080fd5b506067547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660405190815260200161018e565b61055b7f00000000000000000000000042000000000000000000000000000000000000046104728585856108af565b347fd764ad0b000000000000000000000000000000000000000000000000000000006104bd6067547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b338a34898c8c6040516024016104d9979695949392919061178b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526110d0565b3373ffffffffffffffffffffffffffffffffffffffff85167fdd28cef75ff18fb538e43317144469f339702f973eace2bc808f2acc37db310e3486866105c06067547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690565b876040516105d29594939291906117ea565b60405180910390a35050606780547dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808216600101167fffff0000000000000000000000000000000000000000000000000000000000009091161790555050565b60665460009073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff215301610700576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f43726f7373446f6d61696e4d657373656e6765723a2078446f6d61696e4d657360448201527f7361676553656e646572206973206e6f7420736574000000000000000000000060648201526084015b60405180910390fd5b5060665473ffffffffffffffffffffffffffffffffffffffff1690565b600054610100900460ff161580801561073d5750600054600160ff909116105b806107575750303b158015610757575060005460ff166001145b6107e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016106f7565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561084157600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610849611185565b80156108ac57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50565b6000611388619c4080603f6108cb604063ffffffff8816611851565b6108d59190611881565b6108e0601088611851565b6108ed9062030d406118cf565b6108f791906118cf565b61090191906118cf565b61090b91906118cf565b61091591906118cf565b949350505050565b60f087901c600181106109d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f43726f7373446f6d61696e4d657373656e6765723a206f6e6c7920766572736960448201527f6f6e2030206d6573736167657320697320737570706f7274656420617420746860648201527f69732074696d6500000000000000000000000000000000000000000000000000608482015260a4016106f7565b6000610a1e898989898989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061124a92505050565b9050610a2861126d565b15610a6057853414610a3c57610a3c6118fb565b60008181526068602052604090205460ff1615610a5b57610a5b6118fb565b610bb2565b3415610b14576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605060248201527f43726f7373446f6d61696e4d657373656e6765723a2076616c7565206d75737460448201527f206265207a65726f20756e6c657373206d6573736167652069732066726f6d2060648201527f612073797374656d206164647265737300000000000000000000000000000000608482015260a4016106f7565b60008181526068602052604090205460ff16610bb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520636160448201527f6e6e6f74206265207265706c617965640000000000000000000000000000000060648201526084016106f7565b610bbb87611391565b15610c6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604360248201527f43726f7373446f6d61696e4d657373656e6765723a2063616e6e6f742073656e60448201527f64206d65737361676520746f20626c6f636b65642073797374656d206164647260648201527f6573730000000000000000000000000000000000000000000000000000000000608482015260a4016106f7565b60008181526065602052604090205460ff1615610d0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f43726f7373446f6d61696e4d657373656e6765723a206d65737361676520686160448201527f7320616c7265616479206265656e2072656c617965640000000000000000000060648201526084016106f7565b610d2e85610d1f611388619c406118cf565b67ffffffffffffffff16611408565b1580610d54575060665473ffffffffffffffffffffffffffffffffffffffff1661dead14155b15610e6d5760008181526068602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3201610e66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016106f7565b50506110a6565b606680547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a161790556000610efe88619c405a610ec1919061192a565b8988888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061142692505050565b606680547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905590508015610f955760008281526065602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a26110a2565b60008281526068602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555183917f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f91a27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff32016110a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f43726f7373446f6d61696e4d657373656e6765723a206661696c656420746f2060448201527f72656c6179206d6573736167650000000000000000000000000000000000000060648201526084016106f7565b5050505b50505050505050565b905090565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b6040517fe9e05c4200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e0169063e9e05c4290849061114d908890839089906000908990600401611941565b6000604051808303818588803b15801561116657600080fd5b505af115801561117a573d6000803e3d6000fd5b505050505050505050565b600054610100900460ff1661121c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106f7565b606680547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055565b600061125a878787878787611440565b8051906020012090509695505050505050565b60003373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e0161480156110af57507f000000000000000000000000420000000000000000000000000000000000000473ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e073ffffffffffffffffffffffffffffffffffffffff16639bf62d826040518163ffffffff1660e01b8152600401602060405180830381865afa158015611351573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113759190611999565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600073ffffffffffffffffffffffffffffffffffffffff821630148061140257507f0000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b92915050565b600080603f83619c4001026040850201603f5a021015949350505050565b600080600080845160208601878a8af19695505050505050565b606086868686868660405160240161145d969594939291906119b6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fd764ad0b0000000000000000000000000000000000000000000000000000000017905290509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146108ac57600080fd5b60008083601f84011261151357600080fd5b50813567ffffffffffffffff81111561152b57600080fd5b60208301915083602082850101111561154357600080fd5b9250929050565b803563ffffffff8116811461155e57600080fd5b919050565b6000806000806060858703121561157957600080fd5b8435611584816114df565b9350602085013567ffffffffffffffff8111156115a057600080fd5b6115ac87828801611501565b90945092506115bf90506040860161154a565b905092959194509250565b6000815180845260005b818110156115f0576020818501810151868301820152016115d4565b81811115611602576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061164860208301846115ca565b9392505050565b60006020828403121561166157600080fd5b5035919050565b60008060006040848603121561167d57600080fd5b833567ffffffffffffffff81111561169457600080fd5b6116a086828701611501565b90945092506116b390506020850161154a565b90509250925092565b600080600080600080600060c0888a0312156116d757600080fd5b8735965060208801356116e9816114df565b955060408801356116f9816114df565b9450606088013593506080880135925060a088013567ffffffffffffffff81111561172357600080fd5b61172f8a828b01611501565b989b979a50959850939692959293505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b878152600073ffffffffffffffffffffffffffffffffffffffff808916602084015280881660408401525085606083015263ffffffff8516608083015260c060a08301526117dd60c083018486611742565b9998505050505050505050565b858152608060208201526000611804608083018688611742565b905083604083015263ffffffff831660608301529695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff8083168185168183048111821515161561187857611878611822565b02949350505050565b600067ffffffffffffffff808416806118c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600067ffffffffffffffff8083168185168083038211156118f2576118f2611822565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b60008282101561193c5761193c611822565b500390565b73ffffffffffffffffffffffffffffffffffffffff8616815284602082015267ffffffffffffffff84166040820152821515606082015260a06080820152600061198e60a08301846115ca565b979650505050505050565b6000602082840312156119ab57600080fd5b8151611648816114df565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a0830152611a0160c08301846115ca565b9897505050505050505056fea164736f6c634300080f000a", + "root": "0x821e2556a290c86405f8160a2d662042a431ba456b9db265c79bb837c04be5f0", + "codeHash": "0x87c2f1a51ca632e37dfdc53f34133f88d3c0463694fced6136cf4d5bf22ac087", + "code": "0x6080604052600436106101a05760003560e01c80639e45e8f4116100e1578063cf8e5cf01161008a578063e4a3011611610064578063e4a3011614610550578063e664672314610570578063f403838d14610590578063f4daa291146105a657600080fd5b8063cf8e5cf0146104fb578063d1de856c1461051b578063dcec33481461053b57600080fd5b8063ae9483e0116100bb578063ae9483e014610473578063b0ea09a8146104a7578063b98debbf146104c757600080fd5b80639e45e8f41461037b578063a25ae557146103d4578063a48ea6de1461045357600080fd5b806369f16eec1161014e5780637f006420116101285780637f0064201461031057806380446bd21461033057806388786272146103455780639902cdc01461035b57600080fd5b806369f16eec146102d05780636abcf563146102e557806370872aa5146102fa57600080fd5b8063529933df1161017f578063529933df1461023157806354fd4d50146102655780635a045f78146102bb57600080fd5b80622134cc146101a557806333727c4d146101ec5780634599c7881461021c575b600080fd5b3480156101b157600080fd5b506101d97f000000000000000000000000000000000000000000000000000000000000000281565b6040519081526020015b60405180910390f35b3480156101f857600080fd5b5061020c610207366004611ac3565b6105da565b60405190151581526020016101e3565b34801561022857600080fd5b506101d96105ee565b34801561023d57600080fd5b506101d97f000000000000000000000000000000000000000000000000000000000000000481565b34801561027157600080fd5b506102ae6040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516101e39190611adc565b6102ce6102c9366004611b4f565b610661565b005b3480156102dc57600080fd5b506101d9610e7d565b3480156102f157600080fd5b506003546101d9565b34801561030657600080fd5b506101d960015481565b34801561031c57600080fd5b506101d961032b366004611ac3565b610e8f565b34801561033c57600080fd5b506101d961106f565b34801561035157600080fd5b506101d960025481565b34801561036757600080fd5b506102ce610376366004611ac3565b611087565b34801561038757600080fd5b506103af7f000000000000000000000000610178da211fef7d417bc0e6fed39f05609ad78881565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101e3565b3480156103e057600080fd5b506103f46103ef366004611ac3565b6112d9565b60408051825173ffffffffffffffffffffffffffffffffffffffff16815260208084015190820152828201516fffffffffffffffffffffffffffffffff90811692820192909252606092830151909116918101919091526080016101e3565b34801561045f57600080fd5b506101d961046e366004611ac3565b611396565b34801561047f57600080fd5b506103af7f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b181565b3480156104b357600080fd5b506103af6104c2366004611ac3565b611402565b3480156104d357600080fd5b506103af7f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b34801561050757600080fd5b506103f4610516366004611ac3565b611444565b34801561052757600080fd5b506101d9610536366004611ac3565b611483565b34801561054757600080fd5b506101d96114cb565b34801561055c57600080fd5b506102ce61056b366004611b81565b611511565b34801561057c57600080fd5b506102ce61058b366004611bc8565b61172a565b34801561059c57600080fd5b506101d960045481565b3480156105b257600080fd5b506101d97f000000000000000000000000000000000000000000000000000000000000007881565b6000426105e683611396565b111592915050565b60035460009015610658576003805461060990600190611c30565b8154811061061957610619611c47565b600091825260209091206003909102016002015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16919050565b6001545b905090565b600061066c60035490565b6040517fad36d6cc0000000000000000000000000000000000000000000000000000000081526004810182905290915060009073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc9169063ad36d6cc90602401602060405180830381865afa1580156106fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107219190611c76565b9050600081156107cd576040517f891aab740000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b173ffffffffffffffffffffffffffffffffffffffff169063891aab749060240160006040518083038186803b1580156107b057600080fd5b505afa1580156107c4573d6000803e3d6000fd5b5050505061085f565b7f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc973ffffffffffffffffffffffffffffffffffffffff16633a5490466040518163ffffffff1660e01b8152600401602060405180830381865afa158015610838573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061085c9190611c9f565b90505b81158015610883575073ffffffffffffffffffffffffffffffffffffffff81811614155b1561093e573373ffffffffffffffffffffffffffffffffffffffff82161461093e5760405162461bcd60e51b815260206004820152604260248201527f4c324f75747075744f7261636c653a206f6e6c7920746865206e65787420736560448201527f6c65637465642076616c696461746f722063616e207375626d6974206f75747060648201527f7574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b6109466114cb565b86146109e05760405162461bcd60e51b815260206004820152604860248201527f4c324f75747075744f7261636c653a20626c6f636b206e756d626572206d757360448201527f7420626520657175616c20746f206e65787420657870656374656420626c6f6360648201527f6b206e756d626572000000000000000000000000000000000000000000000000608482015260a401610935565b426109e961106f565b1115610a5d5760405162461bcd60e51b815260206004820152603560248201527f4c324f75747075744f7261636c653a2063616e6e6f74207375626d6974204c3260448201527f206f757470757420696e207468652066757475726500000000000000000000006064820152608401610935565b86610ad05760405162461bcd60e51b815260206004820152603c60248201527f4c324f75747075744f7261636c653a204c3220636865636b706f696e74206f7560448201527f747075742063616e6e6f7420626520746865207a65726f2068617368000000006064820152608401610935565b8415801590610adf5750834015155b15610b805784844014610b805760405162461bcd60e51b815260206004820152604960248201527f4c324f75747075744f7261636c653a20626c6f636b206861736820646f65732060448201527f6e6f74206d61746368207468652068617368206174207468652065787065637460648201527f6564206865696768740000000000000000000000000000000000000000000000608482015260a401610935565b60408051608081018252338152602081018981526fffffffffffffffffffffffffffffffff428181168486019081528b831660608601908152600380546001810182556000829052965196027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b8101805473ffffffffffffffffffffffffffffffffffffffff989098167fffffffffffffffffffffffff00000000000000000000000000000000000000009098169790971790965593517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c86015551925182167001000000000000000000000000000000000292909116919091177fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d909201919091559051879185918a917f457b4388026260019ae0b0b4f16c98235d74fe7359be469bdcba16e6d0d4968991610cd991815260200190565b60405180910390a48115610d8c576040517fbe119347000000000000000000000000000000000000000000000000000000008152600481018490527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b173ffffffffffffffffffffffffffffffffffffffff169063be11934790602401600060405180830381600087803b158015610d6f57600080fd5b505af1158015610d83573d6000803e3d6000fd5b50505050610e74565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91663d38dc7ee84610df37f000000000000000000000000000000000000000000000000000000000000007842611cbc565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526fffffffffffffffffffffffffffffffff166024820152604401600060405180830381600087803b158015610e5b57600080fd5b505af1158015610e6f573d6000803e3d6000fd5b505050505b50505050505050565b60035460009061065c90600190611c30565b6000610e996105ee565b821115610f345760405162461bcd60e51b815260206004820152604960248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f7420666f72206120626c6f636b207468617420686173206e6f74206265656e2060648201527f7375626d69747465640000000000000000000000000000000000000000000000608482015260a401610935565b600354610fcf5760405162461bcd60e51b815260206004820152604760248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f74206173206e6f206f7574707574732068617665206265656e207375626d697460648201527f7465642079657400000000000000000000000000000000000000000000000000608482015260a401610935565b6003546000905b808210156110685760006002610fec8385611cbc565b610ff69190611cd4565b9050846003828154811061100c5761100c611c47565b600091825260209091206003909102016002015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16101561105e57611057816001611cbc565b9250611062565b8091505b50610fd6565b5092915050565b600061065c61107c6114cb565b610536906001611cbc565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91663ad36d6cc6110ce600184611c30565b6040518263ffffffff1660e01b81526004016110ec91815260200190565b602060405180830381865afa158015611109573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112d9190611c76565b15611208573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b116146112035760405162461bcd60e51b815260206004820152605660248201527f4c324f75747075744f7261636c653a206f6e6c79207468652076616c6964617460448201527f6f72206d616e6167657220636f6e74726163742063616e20736574206e65787460648201527f2066696e616c697a65206f757470757420696e64657800000000000000000000608482015260a401610935565b600455565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916146112035760405162461bcd60e51b815260206004820152605360248201527f4c324f75747075744f7261636c653a206f6e6c79207468652076616c6964617460448201527f6f7220706f6f6c20636f6e74726163742063616e20736574206e65787420666960648201527f6e616c697a65206f757470757420696e64657800000000000000000000000000608482015260a401610935565b6040805160808101825260008082526020820181905291810182905260608101919091526003828154811061131057611310611c47565b6000918252602091829020604080516080810182526003909302909101805473ffffffffffffffffffffffffffffffffffffffff1683526001810154938301939093526002909201546fffffffffffffffffffffffffffffffff808216938301939093527001000000000000000000000000000000009004909116606082015292915050565b60007f0000000000000000000000000000000000000000000000000000000000000078600383815481106113cc576113cc611c47565b60009182526020909120600260039092020101546113fc91906fffffffffffffffffffffffffffffffff16611cbc565b92915050565b60006003828154811061141757611417611c47565b600091825260209091206003909102015473ffffffffffffffffffffffffffffffffffffffff1692915050565b604080516080810182526000808252602082018190529181018290526060810191909152600361147383610e8f565b8154811061131057611310611c47565b60007f0000000000000000000000000000000000000000000000000000000000000002600154836114b49190611c30565b6114be9190611d0f565b6002546113fc9190611cbc565b60035460009015611509577f00000000000000000000000000000000000000000000000000000000000000046114ff6105ee565b61065c9190611cbc565b61065c6105ee565b600054610100900460ff16158080156115315750600054600160ff909116105b8061154b5750303b15801561154b575060005460ff166001145b6115bd5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610935565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561161b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b428211156116b85760405162461bcd60e51b8152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201527f74696d6500000000000000000000000000000000000000000000000000000000608482015260a401610935565b60028290556001839055801561172557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000610178da211fef7d417bc0e6fed39f05609ad78816146117fb5760405162461bcd60e51b815260206004820152604160248201527f4c324f75747075744f7261636c653a206f6e6c792074686520636f6c6f73736560448201527f756d20636f6e74726163742063616e207265706c61636520616e206f7574707560648201527f7400000000000000000000000000000000000000000000000000000000000000608482015260a401610935565b73ffffffffffffffffffffffffffffffffffffffff81166118845760405162461bcd60e51b815260206004820152603060248201527f4c324f75747075744f7261636c653a207375626d69747465722061646472657360448201527f732063616e6e6f74206265207a65726f000000000000000000000000000000006064820152608401610935565b60035483106119215760405162461bcd60e51b815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f74207265706c616365206160448201527f6e206f757470757420616674657220746865206c6174657374206f757470757460648201527f20696e6465780000000000000000000000000000000000000000000000000000608482015260a401610935565b60006003848154811061193657611936611c47565b6000918252602090912060039091020160028101549091507f00000000000000000000000000000000000000000000000000000000000000789061198c906fffffffffffffffffffffffffffffffff1642611c30565b10611a255760405162461bcd60e51b815260206004820152604860248201527f4c324f75747075744f7261636c653a2063616e6e6f74207265706c616365206160448201527f6e206f757470757420746861742068617320616c7265616479206265656e206660648201527f696e616c697a6564000000000000000000000000000000000000000000000000608482015260a401610935565b6001810183905580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316908117825560405184815285907f1ec0d63ba3dd4b277ece3e578c4c9587edfa0d855192704c88f9a1d74316624f9060200160405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600060208284031215611ad557600080fd5b5035919050565b600060208083528351808285015260005b81811015611b0957858101830151858201604001528201611aed565b81811115611b1b576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b60008060008060808587031215611b6557600080fd5b5050823594602084013594506040840135936060013592509050565b60008060408385031215611b9457600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff81168114611bc557600080fd5b50565b600080600060608486031215611bdd57600080fd5b83359250602084013591506040840135611bf681611ba3565b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611c4257611c42611c01565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215611c8857600080fd5b81518015158114611c9857600080fd5b9392505050565b600060208284031215611cb157600080fd5b8151611c9881611ba3565b60008219821115611ccf57611ccf611c01565b500190565b600082611d0a577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611d4757611d47611c01565b50029056fea164736f6c634300080f000a", "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000000": "01", - "0x0000000000000000000000000000000000000000000000000000000000000066": "dead" + "0x0000000000000000000000000000000000000000000000000000000000000000": "01" }, + "key": "0x783e0404bdc19206cfb81beed0844473471141076bd03986d5bc87bc38ba4739" + }, + "0x68b1d87f95878fe05b998f19b66f4baba5de1aed": { + "balance": "0", + "nonce": 1, + "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "codeHash": "0xee7ac418c26e0e9579ccddfe3991a3028745aa036b4c337329b708ea847e77c2", + "code": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806312e64a7214610046578063c423b1e81461006e578063dc8b50381461008f575b600080fd5b6100596100543660046117b2565b6100db565b60405190151581526020015b60405180910390f35b61008161007c366004611827565b6101a6565b6040516100659291906118f1565b6100b67f0000000000000000000000009a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae81565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b6040517fc423b1e800000000000000000000000000000000000000000000000000000000815260009081908190309063c423b1e890610122908a908990899060040161190c565b600060405180830381865afa15801561013f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610185919081019061199c565b9150915081801561019b575061019b868261074b565b979650505050505050565b600060606002845110156102275760405162461bcd60e51b815260206004820152602960248201527f5a4b4d65726b6c65547269653a2070726f76696465642070726f6f662069732060448201527f746f6f2073686f7274000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61027e84600186516102399190611a5d565b8151811061024957610249611a74565b602002602001015180516020909101207f950654da67865a81bc70e45f3230f5179f08e29c66184bf746f71050f117b3b81490565b6102f05760405162461bcd60e51b815260206004820152602d60248201527f5a4b4d65726b6c65547269653a20746865206c617374206974656d206973206e60448201527f6f74206d61676963206861736800000000000000000000000000000000000000606482015260840161021e565b60006102fb86610767565b9050600061030886610846565b90506103526040805161010081019091528060008152600060208201819052604082018190526060808301829052608083015260a0820181905260c0820181905260e09091015290565b60408051602081019091526000808252835190918291829190829061037990600290611a5d565b90505b86818151811061038e5761038e611a74565b6020026020010151602001519550600060038111156103af576103af611aa3565b865160038111156103c2576103c2611aa3565b036104a05760006103d38983610939565b90508015610433578660200151861461042e5760405162461bcd60e51b815260206004820152601b60248201527f5a4b4d65726b6c65547269653a20696e76616c6964206b6579204c0000000000604482015260640161021e565b610486565b866040015186146104865760405162461bcd60e51b815260206004820152601b60248201527f5a4b4d65726b6c65547269653a20696e76616c6964206b657920520000000000604482015260640161021e565b61049887602001518860400151610996565b9550506106b5565b6001865160038111156104b5576104b5611aa3565b0361061857831580156104c6575082155b6105385760405162461bcd60e51b815260206004820152602660248201527f5a4b4d65726b6c65547269653a206475706c696361746564207465726d696e6160448201527f6c206e6f64650000000000000000000000000000000000000000000000000000606482015260840161021e565b87866060015114935083156107385761056b600160001b87606001516105668960a001518a60800151610a63565b610bff565b6080870151805160208102825260e0890151929750909350839115610611578e8860e00151148061059f5750898860e00151145b6106115760405162461bcd60e51b815260206004820152602260248201527f5a4b4d65726b6c65547269653a20696e76616c6964206b657920707265696d6160448201527f6765000000000000000000000000000000000000000000000000000000000000606482015260840161021e565b50506106b5565b60028651600381111561062d5761062d611aa3565b036106b5578315801561063e575082155b6106b05760405162461bcd60e51b815260206004820152602660248201527f5a4b4d65726b6c65547269653a206475706c696361746564207465726d696e6160448201527f6c206e6f64650000000000000000000000000000000000000000000000000000606482015260840161021e565b600192505b80600003610711578a851461070c5760405162461bcd60e51b815260206004820152601960248201527f5a4b4d65726b65547269653a20696e76616c696420726f6f7400000000000000604482015260640161021e565b610738565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161037c565b50919b919a509098505050505050505050565b6000818051906020012083805190602001201490505b92915050565b600080600061077584610d77565b6040805180820182528381526020810183905290517f299e566000000000000000000000000000000000000000000000000000000000815292945090925073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000009a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae169163299e5660916107fd91600401611ad2565b602060405180830381865afa15801561081a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083e9190611b03565b949350505050565b805160609060008167ffffffffffffffff811115610866576108666115f9565b60405190808252806020026020018201604052801561089f57816020015b61088c61159a565b8152602001906001900390816108845790505b50905060005b6108b0600184611a5d565b8110156109315760006108db8683815181106108ce576108ce611a74565b6020026020010151610d9f565b905060405180604001604052808784815181106108fa576108fa611a74565b602002602001015181526020018281525083838151811061091d5761091d611a74565b6020908102919091010152506001016108a5565b509392505050565b6000610100821061098c5760405162461bcd60e51b815260206004820152601c60248201527f5a4b4d65726b6c65547269653a20746f6f206c6f6e6720646570746800000000604482015260640161021e565b506001901b161590565b6040805180820182528381526020810183905290517f299e566000000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000009a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae169163299e566091610a1b91600401611ad2565b602060405180830381865afa158015610a38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5c9190611b03565b9392505050565b6000600182511015610add5760405162461bcd60e51b815260206004820152602b60248201527f5a4b547269654861736865723a20746f6f206665772076616c75657320666f7260448201527f205f76616c756548617368000000000000000000000000000000000000000000606482015260840161021e565b6000825167ffffffffffffffff811115610af957610af96115f9565b604051908082528060200260200182016040528015610b22578160200160208202803683370190505b50905060005b8351811015610bc8576001811b851663ffffffff1615610b8757610b64848281518110610b5757610b57611a74565b6020026020010151610767565b828281518110610b7657610b76611a74565b602002602001018181525050610bc0565b838181518110610b9957610b99611a74565b6020026020010151828281518110610bb357610bb3611a74565b6020026020010181815250505b600101610b28565b50600283511015610bf65780600081518110610be657610be6611a74565b6020026020010151915050610761565b61083e81611122565b6040805180820182528481526020810184905290517f299e56600000000000000000000000000000000000000000000000000000000081526000917f0000000000000000000000009a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae9173ffffffffffffffffffffffffffffffffffffffff83169163299e566091610c879190600401611ad2565b602060405180830381865afa158015610ca4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc89190611b03565b6040805180820182528281526020810186905290517f299e566000000000000000000000000000000000000000000000000000000000815291965073ffffffffffffffffffffffffffffffffffffffff83169163299e566091610d2d91600401611ad2565b602060405180830381865afa158015610d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6e9190611b03565b95945050505050565b60008082608081901b610d8a8260801c90565b610d948260801c90565b935093505050915091565b60408051610100810182526000808252602082018190529181018290526060808201839052608082015260a0810182905260c0810182905260e081019190915260408051610100810182526000808252602082018190529181018290526060808201839052608082015260a0810182905260c0810182905260e08101919091526000610e53846040805180820182526060815260006020918201528151808301909252828101825291519181019190915290565b90506000610e608261130c565b60ff16905080610e8b57610e7382611393565b6020840152610e8182611393565b60408401526110de565b6001810361101857610e9c82611393565b6060840152600080610ead84611431565b60ff16915091508163ffffffff166001148015610eca5750806001145b80610ee657508163ffffffff166004148015610ee65750806004145b610f585760405162461bcd60e51b815260206004820152602360248201527f4e6f64655265616465723a20696e76616c696420636f6d70726573736564466c60448201527f6167730000000000000000000000000000000000000000000000000000000000606482015260840161021e565b63ffffffff821660a08601528067ffffffffffffffff811115610f7d57610f7d6115f9565b604051908082528060200260200182016040528015610fa6578160200160208202803683370190505b50608086015260005b81811015610fe957610fc085611393565b86608001518281518110610fd657610fd6611a74565b6020908102919091010152600101610faf565b506000610ff58561130c565b60ff16905080156110105761100a85826114cb565b60e08701525b5050506110de565b600281146110de57600381036110965760405162461bcd60e51b815260206004820152602560248201527f4e6f64655265616465723a20756e657870656374656420726f6f74206e6f646560448201527f2074797065000000000000000000000000000000000000000000000000000000606482015260840161021e565b60405162461bcd60e51b815260206004820152601d60248201527f4e6f64655265616465723a20696e76616c6964206e6f64652074797065000000604482015260640161021e565b8060038111156110f0576110f0611aa3565b8390600381111561110357611103611aa3565b9081600381111561111657611116611aa3565b90525091949350505050565b600060048251101561119c5760405162461bcd60e51b815260206004820152602b60248201527f5a4b547269654861736865723a20746f6f206665772076616c75657320666f7260448201527f205f68617368456c656d73000000000000000000000000000000000000000000606482015260840161021e565b81517f0000000000000000000000009a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae9060009081906001906002905b808310156112e457600094505b808510156112d6578285019350808410156112cd578573ffffffffffffffffffffffffffffffffffffffff1663299e566060405180604001604052808b898151811061122757611227611a74565b602002602001015181526020018b888151811061124657611246611a74565b60200260200101518152506040518263ffffffff1660e01b815260040161126d9190611ad2565b602060405180830381865afa15801561128a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ae9190611b03565b8886815181106112c0576112c0611a74565b6020026020010181815250505b938101936111d9565b909150600182901b906111cc565b876000815181106112f7576112f7611a74565b60200260200101519650505050505050919050565b60006001826020015110156113635760405162461bcd60e51b815260206004820152601f60248201527f4e6f64655265616465723a20746f6f2073686f727420666f722075696e743800604482015260640161021e565b81518051600180830180865260208601805191949360f81c9291611388908390611a5d565b905250949350505050565b60006020826020015110156114105760405162461bcd60e51b815260206004820152602160248201527f4e6f64655265616465723a20746f6f2073686f727420666f722062797465733360448201527f3200000000000000000000000000000000000000000000000000000000000000606482015260840161021e565b81518051602080830180865281860180519194939291611388908390611a5d565b6000806004836020015110156114895760405162461bcd60e51b815260206004820181905260248201527f4e6f64655265616465723a20746f6f2073686f727420666f722075696e743332604482015260640161021e565b8251805160048083018087526020870180519194939260f084901c9260f885901c92906114b7908390611a5d565b90525060ff90911697909650945050505050565b600081836020015110156115475760405162461bcd60e51b815260206004820152602160248201527f4e6f64655265616465723a20746f6f2073686f727420666f72206e206279746560448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161021e565b825160609060008061155a866008611b1c565b61156690610100611a5d565b8351848801808a5260208a01805191975091831c9450919250879161158c908390611a5d565b905250909695505050505050565b6040518060400160405280606081526020016115f46040805161010081019091528060008152600060208201819052604082018190526060808301829052608083015260a0820181905260c0820181905260e09091015290565b905290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561166f5761166f6115f9565b604052919050565b600067ffffffffffffffff821115611691576116916115f9565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126116ce57600080fd5b81356116e16116dc82611677565b611628565b8181528460208386010111156116f657600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f83011261172457600080fd5b8135602067ffffffffffffffff80831115611741576117416115f9565b8260051b611750838201611628565b938452858101830193838101908886111561176a57600080fd5b84880192505b858310156117a6578235848111156117885760008081fd5b6117968a87838c01016116bd565b8352509184019190840190611770565b98975050505050505050565b600080600080608085870312156117c857600080fd5b84359350602085013567ffffffffffffffff808211156117e757600080fd5b6117f3888389016116bd565b9450604087013591508082111561180957600080fd5b5061181687828801611713565b949793965093946060013593505050565b60008060006060848603121561183c57600080fd5b83359250602084013567ffffffffffffffff81111561185a57600080fd5b61186686828701611713565b925050604084013590509250925092565b60005b8381101561189257818101518382015260200161187a565b838111156118a1576000848401525b50505050565b600081518084526118bf816020860160208601611877565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b821515815260406020820152600061083e60408301846118a7565b600060608201858352602060608185015281865180845260808601915060808160051b870101935082880160005b82811015611986577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808887030184526119748683516118a7565b9550928401929084019060010161193a565b5050505050604092909201929092529392505050565b600080604083850312156119af57600080fd5b825180151581146119bf57600080fd5b602084015190925067ffffffffffffffff8111156119dc57600080fd5b8301601f810185136119ed57600080fd5b80516119fb6116dc82611677565b818152866020838501011115611a1057600080fd5b611a21826020830160208601611877565b8093505050509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611a6f57611a6f611a2e565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60408101818360005b6002811015611afa578151835260209283019290910190600101611adb565b50505092915050565b600060208284031215611b1557600080fd5b5051919050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611b5457611b54611a2e565b50029056fea164736f6c634300080f000a", "key": "0x82bbeea1b838affd4d92ca0d2b311b02fb5ed4b7666c5e3b7f08aaa3053c9809" }, - "0x7a2088a1bfc9d81c55368ae168c2c02570cb814f": { + "0x7969c5ed335650692bc04293b07f5bf2e7a673c0": { "balance": "0", "nonce": 1, - "root": "0xa7abcc6e1e344abdd761f5e3b08dfacd08b68a6533969baeeaf61e80fde624e4", - "codeHash": "0x3d388f39ad810b96662b6c3930aef3f0bddb6652fbdb8d2bfcbdee814a791f59", - "code": "0x6080604052600436106101a05760003560e01c806370a08231116100e1578063ab91f1901161008a578063d38dc7ee11610064578063d38dc7ee1461053d578063d8fe76421461055d578063dd215c5d146105ad578063facd743b146105cd57600080fd5b8063ab91f190146104d1578063b7d636a514610501578063d0e30db01461053557600080fd5b80638f09ade4116100bb5780638f09ade414610468578063946765fd14610488578063a51c9ace146104bc57600080fd5b806370a08231146103e75780638129fc1c1461041d57806382dae3aa1461043257600080fd5b806336b834691161014e57806354fd4d501161012857806354fd4d50146103285780635a5447421461037e5780635df6a6bc1461039e5780636641ea08146103b357600080fd5b806336b83469146102bf5780633a549046146102df5780633ee4d4a3146102f457600080fd5b8063205c28781161017f578063205c2878146102495780632e1a7d4d1461026b578063360864171461028b57600080fd5b80621c2ff6146101a55780630f43a677146101f65780630ff754ea14610215575b600080fd5b3480156101b157600080fd5b506101d97f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561020257600080fd5b506036545b6040519081526020016101ed565b34801561022157600080fd5b506101d97f0000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e081565b34801561025557600080fd5b5061026961026436600461233c565b6105fd565b005b34801561027757600080fd5b50610269610286366004612368565b610730565b34801561029757600080fd5b506101d97f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e81565b3480156102cb57600080fd5b506102696102da366004612381565b6107e1565b3480156102eb57600080fd5b506101d9610a52565b34801561030057600080fd5b506101d97f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c881565b34801561033457600080fd5b506103716040518060400160405280600581526020017f312e302e3100000000000000000000000000000000000000000000000000000081525081565b6040516101ed919061242e565b34801561038a57600080fd5b50610269610399366004612441565b610c10565b3480156103aa57600080fd5b50610269610eb9565b3480156103bf57600080fd5b506102077f000000000000000000000000000000000000000000000000000000000000000481565b3480156103f357600080fd5b50610207610402366004612471565b6001600160a01b031660009081526033602052604090205490565b34801561042957600080fd5b50610269610f38565b34801561043e57600080fd5b50610447601481565b6040516fffffffffffffffffffffffffffffffff90911681526020016101ed565b34801561047457600080fd5b50610447610483366004612441565b6110af565b34801561049457600080fd5b506102077f000000000000000000000000000000000000000000000000000000000000000a81565b3480156104c857600080fd5b50610447606481565b3480156104dd57600080fd5b506104e8620186a081565b60405167ffffffffffffffff90911681526020016101ed565b34801561050d57600080fd5b506104477f000000000000000000000000000000000000000000000000000000000000000181565b61026961115e565b34801561054957600080fd5b506102696105583660046124ac565b61116a565b34801561056957600080fd5b5061057d610578366004612368565b611443565b6040805182516fffffffffffffffffffffffffffffffff90811682526020938401511692810192909252016101ed565b3480156105b957600080fd5b506102696105c8366004612441565b611562565b3480156105d957600080fd5b506105ed6105e8366004612471565b6118c8565b60405190151581526020016101ed565b61060561194e565b6001600160a01b0382166106865760405162461bcd60e51b815260206004820152603260248201527f56616c696461746f72506f6f6c3a2063616e6e6f74207769746864726177207460448201527f6f20746865207a65726f2061646472657373000000000000000000000000000060648201526084015b60405180910390fd5b61069033826119a7565b60006106ad835a8460405180602001604052806000815250611bf9565b9050806107225760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f72506f6f6c3a20455448207472616e73666572206661696c60448201527f6564000000000000000000000000000000000000000000000000000000000000606482015260840161067d565b5061072c60018055565b5050565b61073861194e565b61074233826119a7565b600061075f335a8460405180602001604052806000815250611bf9565b9050806107d45760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f72506f6f6c3a20455448207472616e73666572206661696c60448201527f6564000000000000000000000000000000000000000000000000000000000000606482015260840161067d565b506107de60018055565b50565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561083f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086391906124d1565b6001600160a01b0316336001600160a01b0316146108e95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f7420436f6c60448201527f6f737365756d0000000000000000000000000000000000000000000000000000606482015260840161067d565b60008381526039602090815260408083206001600160a01b03861684529091529020546fffffffffffffffffffffffffffffffff16806109915760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a207468652070656e64696e6720626f6e642060448201527f646f6573206e6f74206578697374000000000000000000000000000000000000606482015260840161067d565b60008481526039602090815260408083206001600160a01b0387168452909152902080547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690556109f5826fffffffffffffffffffffffffffffffff8316611c19565b6040516fffffffffffffffffffffffffffffffff821681526001600160a01b03808416919085169086907f8c95336a279406edcc768d685e8eb6667368a77d840a188144b8e3719423198f9060200160405180910390a450505050565b6038546000906001600160a01b031615610beb5760007f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663dcec33486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ac6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aea91906124ee565b905060006001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c91663d1de856c610b28846001612536565b6040518263ffffffff1660e01b8152600401610b4691815260200190565b602060405180830381865afa158015610b63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8791906124ee565b9050804210610bd8576000610b9c824261254e565b90507f0000000000000000000000000000000000000000000000000000000000000004811115610bd6576001600160a01b03935050505090565b505b50506038546001600160a01b0316919050565b507f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c890565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9291906124d1565b6001600160a01b0316336001600160a01b031614610d185760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f7420436f6c60448201527f6f737365756d0000000000000000000000000000000000000000000000000000606482015260840161067d565b60008281526034602052604090208054427001000000000000000000000000000000009091046fffffffffffffffffffffffffffffffff161015610dc45760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a20746865206f757470757420697320616c7260448201527f656164792066696e616c697a6564000000000000000000000000000000000000606482015260840161067d565b610e00827f00000000000000000000000000000000000000000000000000000000000000016fffffffffffffffffffffffffffffffff166119a7565b60008381526039602090815260408083206001600160a01b0386168085529083529281902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000167f00000000000000000000000000000000000000000000000000000000000000016fffffffffffffffffffffffffffffffff16908117909155905190815285917f2904258f32adf74dd8f23ad6f17ff50209896039c8ee3d4728ff55bd05c4cf2a910160405180910390a3505050565b6000610ec3611d4d565b9050806107de5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f72506f6f6c3a206e6f20626f6e6420746861742063616e2060448201527f626520756e626f6e640000000000000000000000000000000000000000000000606482015260840161067d565b600054610100900460ff1615808015610f585750600054600160ff909116105b80610f725750303b158015610f72575060005460ff166001145b610fe45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161067d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561104257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b61104a611f6b565b80156107de57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150565b60008281526039602090815260408083206001600160a01b03851684529091528120546fffffffffffffffffffffffffffffffff16806111575760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a207468652070656e64696e6720626f6e642060448201527f646f6573206e6f74206578697374000000000000000000000000000000000000606482015260840161067d565b9392505050565b6111683334611c19565b565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c916146112085760405162461bcd60e51b815260206004820152602b60248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f74204c324f60448201527f75747075744f7261636c65000000000000000000000000000000000000000000606482015260840161067d565b6000828152603460205260409020805470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16156112b15760405162461bcd60e51b815260206004820152603c60248201527f56616c696461746f72506f6f6c3a20626f6e64206f662074686520676976656e60448201527f206f757470757420696e64657820616c72656164792065786973747300000000606482015260840161067d565b6112b9611d4d565b506040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018490526000907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063b0ea09a890602401602060405180830381865afa15801561133b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135f91906124d1565b905061139d817f00000000000000000000000000000000000000000000000000000000000000016fffffffffffffffffffffffffffffffff166119a7565b7f00000000000000000000000000000000000000000000000000000000000000016fffffffffffffffffffffffffffffffff9081167001000000000000000000000000000000009185169182028117845560408051918252602082019290925285916001600160a01b038416917f5ca130257b8f76f72ad2965efcbe166f3918d820e4a49956e70081ea311f97c4910160405180910390a361143d611fe8565b50505050565b6040805180820190915260008082526020820152600082815260346020526040902080546fffffffffffffffffffffffffffffffff16158015906114ad5750805470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1615155b61151f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2074686520626f6e6420646f6573206e6f7460448201527f2065786973740000000000000000000000000000000000000000000000000000606482015260840161067d565b6040805180820190915290546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000090910416602082015292915050565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e491906124d1565b6001600160a01b0316336001600160a01b03161461166a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f72506f6f6c3a2073656e646572206973206e6f7420436f6c60448201527f6f737365756d0000000000000000000000000000000000000000000000000000606482015260840161067d565b60008281526034602052604090208054427001000000000000000000000000000000009091046fffffffffffffffffffffffffffffffff1610156117165760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a20746865206f757470757420697320616c7260448201527f656164792066696e616c697a6564000000000000000000000000000000000000606482015260840161067d565b60008381526039602090815260408083206001600160a01b03861684529091529020546fffffffffffffffffffffffffffffffff16806117be5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f72506f6f6c3a207468652070656e64696e6720626f6e642060448201527f646f6573206e6f74206578697374000000000000000000000000000000000000606482015260840161067d565b600060646117cd601484612565565b6117d791906125cc565b905060006117e582846125fb565b60008781526039602090815260408083206001600160a01b038a811680865291845282852080547fffffffffffffffffffffffffffffffff000000000000000000000000000000009081169091558a549081166fffffffffffffffffffffffffffffffff91821688018216178b557f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e9091168552603384529382902080548886160190559051928416835292935088917f383f9b8b5a1fc2ec555726eb895621a312042e18b764135fa12ef1a520ad30db910160405180910390a3505050505050565b60365460009081036118dc57506000919050565b6001600160a01b0382166118f257506000919050565b6001600160a01b03821660008181526037602052604090205460368054919291839081106119225761192261262c565b6000918252602090912001546001600160a01b0316149392505050565b6001600160a01b03163b151590565b6002600154036119a05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161067d565b6002600155565b6001600160a01b03821660009081526033602052604090205481811015611a355760405162461bcd60e51b8152602060048201526024808201527f56616c696461746f72506f6f6c3a20696e73756666696369656e742062616c6160448201527f6e63657300000000000000000000000000000000000000000000000000000000606482015260840161067d565b611a3f828261254e565b90507f00000000000000000000000000000000000000000000000000000000000000016fffffffffffffffffffffffffffffffff1681108015611a865750611a86836118c8565b15611bd957603654600090611a9d9060019061254e565b90508015611b55576001600160a01b0384166000908152603760205260408120546036805491929184908110611ad557611ad561262c565b600091825260209091200154603680546001600160a01b039092169250829184908110611b0457611b0461262c565b600091825260208083209190910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03948516179055929091168152603790915260409020555b6001600160a01b0384166000908152603760205260408120556036805480611b7f57611b7f61265b565b60008281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055505b6001600160a01b0390921660009081526033602052604090209190915550565b600080600080845160208601878a8af19695505050505050565b60018055565b6001600160a01b038216600090815260336020526040812054611c3d908390612536565b90507f00000000000000000000000000000000000000000000000000000000000000016fffffffffffffffffffffffffffffffff168110158015611c875750611c85836118c8565b155b15611bd9577f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e6001600160a01b0316836001600160a01b031614611bd957603680546001600160a01b03949094166000818152603760209081526040808320889055600188019094557f4a11f94e20a93c79f6ec743a1954ec4fc2c08429ae2122118bf234b2185c81b890960180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690921790915560339094529092209190915550565b60355460408051608081018252600080825260208201819052918101829052606081018290529091908290819060005b7f000000000000000000000000000000000000000000000000000000000000000a811015611f4857600085815260346020526040902080546fffffffffffffffffffffffffffffffff80821696509194507001000000000000000000000000000000009004164210801590611e0457506000846fffffffffffffffffffffffffffffffff16115b15611f485760008581526034602052604080822091909155517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018690527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063a25ae55790602401608060405180830381865afa158015611e98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebc919061268a565b9150611ede8260000151856fffffffffffffffffffffffffffffffff16611c19565b81516040516fffffffffffffffffffffffffffffffff861681526001600160a01b039091169086907f7047a0fb8bfae78c0ebbd4117437945bb85240453235ac4fd2e55712eb5bf0c39060200160405180910390a3611f3c826121b6565b60019485019401611d7d565b8015611f5f57505050603591909155506001919050565b60009550505050505090565b600054610100900460ff16611c135760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161067d565b6036548015801590611ffc57506000603554115b1561218b5760007f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663a25ae5576001603554612041919061254e565b6040518263ffffffff1660e01b815260040161205f91815260200190565b608060405180830381865afa15801561207c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120a0919061268a565b905060008282602001514341446001436120ba919061254e565b6040805160208101969096528501939093527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606092831b1691840191909152607483015240609482015260b4016040516020818303038152906040528051906020012060001c61212b919061272d565b9050603681815481106121405761214061262c565b600091825260209091200154603880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216919091179055506107de9050565b603880547fffffffffffffffffffffffff000000000000000000000000000000000000000016905550565b805160608201516040516001600160a01b037f0000000000000000000000009fe46736679d2d9a65f0992f2272de9f3c7fa6e0169263c30af3889273420000000000000000000000000000000000000892620186a0927f21670f220000000000000000000000000000000000000000000000000000000092612260926024016001600160a01b039290921682526fffffffffffffffffffffffffffffffff16602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b90921682526122f2939291600401612741565b600060405180830381600087803b15801561230c57600080fd5b505af1158015612320573d6000803e3d6000fd5b5050505050565b6001600160a01b03811681146107de57600080fd5b6000806040838503121561234f57600080fd5b823561235a81612327565b946020939093013593505050565b60006020828403121561237a57600080fd5b5035919050565b60008060006060848603121561239657600080fd5b8335925060208401356123a881612327565b915060408401356123b881612327565b809150509250925092565b6000815180845260005b818110156123e9576020818501810151868301820152016123cd565b818111156123fb576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061115760208301846123c3565b6000806040838503121561245457600080fd5b82359150602083013561246681612327565b809150509250929050565b60006020828403121561248357600080fd5b813561115781612327565b6fffffffffffffffffffffffffffffffff811681146107de57600080fd5b600080604083850312156124bf57600080fd5b8235915060208301356124668161248e565b6000602082840312156124e357600080fd5b815161115781612327565b60006020828403121561250057600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000821982111561254957612549612507565b500190565b60008282101561256057612560612507565b500390565b60006fffffffffffffffffffffffffffffffff8083168185168183048111821515161561259457612594612507565b02949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006fffffffffffffffffffffffffffffffff808416806125ef576125ef61259d565b92169190910492915050565b60006fffffffffffffffffffffffffffffffff8381169083168181101561262457612624612507565b039392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006080828403121561269c57600080fd5b6040516080810181811067ffffffffffffffff821117156126e6577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405282516126f481612327565b815260208381015190820152604083015161270e8161248e565b604082015260608301516127218161248e565b60608201529392505050565b60008261273c5761273c61259d565b500690565b6001600160a01b038416815267ffffffffffffffff8316602082015260606040820152600061277360608301846123c3565b9594505050505056fea164736f6c634300080f000a", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000000": "01", - "0x0000000000000000000000000000000000000000000000000000000000000001": "01" - }, - "key": "0xcb3987d4474164ab910fb5dff94430b3d4189fdec573b11daa18756dea0b81e9" + "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "codeHash": "0xdd2e3ed8a89ebac3d8450987be6e6d99a48bb965d73a7fec73d29f23a865656d", + "code": "0x608060405234801561001057600080fd5b50600436106102d25760003560e01c8063943e400511610186578063b91b2723116100e3578063cdff5e1911610097578063e0cc26a211610071578063e0cc26a21461080e578063e428c2f414610840578063e7816b7f1461085357600080fd5b8063cdff5e1914610799578063daec6770146107b6578063dff221b5146107dd57600080fd5b8063be119347116100c8578063be1193471461072e578063be995dc214610741578063c26148fe1461075457600080fd5b8063b91b272314610359578063bde022bb1461071b57600080fd5b8063a83871721161013a578063ac6c52511161011f578063ac6c52511461062f578063af6ca762146106a4578063b2653fe3146106f457600080fd5b8063a838717214610609578063ab04b8aa1461061c57600080fd5b80639e449b021161016b5780639e449b02146105bc5780639f8a13d7146105e3578063a3433d07146105f657600080fd5b8063943e400514610579578063970531c11461058157600080fd5b80633ee4d4a3116102345780635bab847f116101e85780637d2243b4116101cd5780637d2243b41461054b578063891aab74146105535780638c1516c71461056657600080fd5b80635bab847f146105115780636874e0421461052457600080fd5b80634cca5e6c116102195780634cca5e6c1461045457806354fd4d501461047b57806356b65e97146104c457600080fd5b80633ee4d4a31461040657806342223ae91461042d57600080fd5b806322009af61161028b57806330ccebb51161027057806330ccebb5146103b75780633a549046146103d75780633ca83045146103df57600080fd5b806322009af614610388578063263a3402146103af57600080fd5b80630763fa7e116102bc5780630763fa7e14610330578063110d6069146103595780631796e52e1461036157600080fd5b80621c2ff6146102d7578063065643ea1461031b575b600080fd5b6102fe7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b6040516001600160a01b0390911681526020015b60405180910390f35b61032e61032936600461546c565b61087a565b005b610338602881565b6040516fffffffffffffffffffffffffffffffff9091168152602001610312565b610338606481565b6103387f000000000000000000000000000000000000000000000000000000000000003281565b6103387f000000000000000000000000000000000000000000000000000000000000001481565b61032e610ba0565b6103ca6103c53660046154b5565b610c2b565b6040516103129190615501565b6102fe610e87565b6103387f000000000000000000000000000000000000000000000000000000000000007881565b6102fe7f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c881565b6103387f000000000000000000000000000000000000000000000000000000000000000281565b6103387f000000000000000000000000000000000000000000000000000000000000000481565b6104b76040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516103129190615542565b6105016104d23660046154b5565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff16151590565b6040519015158152602001610312565b61032e61051f3660046155c3565b610fb5565b6102fe7f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b9701681565b61032e61112a565b61032e6105613660046154b5565b61126d565b61032e6105743660046154b5565b611380565b61032e6114e4565b61033861058f3660046154b5565b6001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff1690565b6103387f000000000000000000000000000000000000000000000000000000000000007881565b6105016105f13660046154b5565b6116f5565b61032e6106043660046155fc565b611728565b61032e6106173660046154b5565b6118f4565b61032e61062a366004615617565b611a27565b61068461063d3660046154b5565b6001600160a01b031660009081526003602090815260408083205463ffffffff168352600290915290206001015461010090046effffffffffffffffffffffffffffff1690565b6040516effffffffffffffffffffffffffffff9091168152602001610312565b6001805468010000000000000000900463ffffffff166000908152600260205260409020015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16610684565b6103387f000000000000000000000000000000000000000000000000000000000000006481565b6103386107293660046154b5565b611cc1565b61032e61073c36600461563c565b611d25565b61032e61074f366004615655565b611f04565b6107876107623660046154b5565b6001600160a01b03166000908152600460205260409020546301000000900460ff1690565b60405160ff9091168152602001610312565b6107a16122d7565b60405163ffffffff9091168152602001610312565b6103387f000000000000000000000000000000000000000000000000000000000000003c81565b6107876107eb3660046154b5565b6001600160a01b0316600090815260046020526040902054610100900460ff1690565b61078761081c3660046154b5565b6001600160a01b031660009081526004602052604090205462010000900460ff1690565b61032e61084e3660046154b5565b6122fc565b6103387f000000000000000000000000000000000000000000000000000000000000000a81565b3332146108b3576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b333b156108ec576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108f733610c2b565b6005811115610908576109086154d2565b1461093f576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000326fffffffffffffffffffffffffffffffff16836fffffffffffffffffffffffffffffffff1610156109bd576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606460ff831611156109fb576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600081815260046020819052604091829020805460ff871662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff0090911617600117815591517f19412a20000000000000000000000000000000000000000000000000000000008152908101929092526fffffffffffffffffffffffffffffffff851660248301526001600160a01b03838116604484015290917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b97016909116906319412a2090606401600060405180830381600087803b158015610ae157600080fd5b505af1158015610af5573d6000803e3d6000fd5b505050506fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000064811690851610801590610b4157610b41336123c0565b60408051821515815260ff861660208201526fffffffffffffffffffffffffffffffff871681830152905133917f36f43e5c63d19ec0a34168ec0838b5bfae77656b9f5b94b896e9d2172a41f4fe919081900360600190a25050505050565b6003610bab33610c2b565b6005811115610bbc57610bbc6154d2565b141580610be95750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b15610c20576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c29336123c0565b565b6001600160a01b03811660009081526004602052604081205460ff16610c5357506000919050565b6040517f981cee530000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f00000000000000000000000000000000000000000000000000000000000000326fffffffffffffffffffffffffffffffff16917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970169091169063981cee5390602401602060405180830381865afa158015610d08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2c919061567c565b6fffffffffffffffffffffffffffffffff161015610d4c57506001919050565b6001600160a01b03828116600081815260036020526040908190205490517f8abf0af0000000000000000000000000000000000000000000000000000000008152600481019290925263ffffffff161515917f00000000000000000000000000000000000000000000000000000000000000646fffffffffffffffffffffffffffffffff16917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b9701690911690638abf0af090602401602060405180830381865afa158015610e1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e41919061567c565b6fffffffffffffffffffffffffffffffff161015610e705780610e675750600292915050565b50600492915050565b80610e7e5750600392915050565b50600592915050565b600080546001600160a01b031615610f905760007f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03166380446bd26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1d9190615699565b9050804210610f7f576000610f3282426156e1565b90507f00000000000000000000000000000000000000000000000000000000000000046fffffffffffffffffffffffffffffffff16811115610f7d576001600160a01b039250505090565b505b50506000546001600160a01b031690565b507f00000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c890565b6000610fc083610c2b565b9050818015610ffb57506001816005811115610fde57610fde6154d2565b1480610ffb57506004816005811115610ff957610ff96154d2565b145b156110595761100b6001846124b8565b1561105457826001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d99614260405161104b91815260200190565b60405180910390a25b505050565b600481600581111561106d5761106d6154d2565b10611054576040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301526111249185917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970161690638abf0af090602401602060405180830381865afa1580156110f7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111b919061567c565b6001919061265a565b50505050565b336000908152600560205260409020546fffffffffffffffffffffffffffffffff16611182576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b33600090815260056020526040902054426fffffffffffffffffffffffffffffffff90911611156111df576040517f1dfc20f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111e83361296f565b3360008181526005602052604080822080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055517f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f199190a2600361124e33610c2b565b600581111561125f5761125f6154d2565b03610c2957610c29336123c0565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c916146112cf576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112d9610e87565b90506001600160a01b03808216148015906113065750806001600160a01b0316826001600160a01b031614155b1561133d576040517fc625317600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611346826116f5565b61137c576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140291906156f8565b6001600160a01b0316336001600160a01b03161461144c576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f8c1516c70000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970161690638c1516c7906024015b600060405180830381600087803b1580156114c957600080fd5b505af11580156114dd573d6000803e3d6000fd5b5050505050565b60026114ef33610c2b565b6005811115611500576115006154d2565b108061152c5750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b15611563576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061156e33611cc1565b90507f00000000000000000000000000000000000000000000000000000000000000786fffffffffffffffffffffffffffffffff16816fffffffffffffffffffffffffffffffff16036115ed576040517fdf80df2100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806fffffffffffffffffffffffffffffffff16421015611639576040517f82225faf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526004602090815260409182902080547fffffffffffffffffffffffff0000000000000000000000000000000000ffffff6301000000820460ff90811662010000818102939093167fffffffffffffffffffffffff000000000000000000000000000000000000ffff851617855586519290930416808252938101829052919492939092917fa40865ec905b139b9cdbd0566756b576b074c47d9dde9f62388b1d66d3e72a6491015b60405180910390a250505050565b6000600561170283610c2b565b6005811115611713576117136154d2565b0361172057506001919050565b506000919050565b600261173333610c2b565b6005811115611744576117446154d2565b10806117705750336000908152600560205260409020546fffffffffffffffffffffffffffffffff1615155b156117a7576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600460205260409020606460ff831611156117f4576040517f406b265300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805460ff62010000909104811690831681900361183d576040517f150393f200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81547fffffffffffffffffffffffff0000000000000000000000000000000000ffffff16630100000060ff8581169182027fffffffffffffffffffffffff00000000000000000000000000000000ffffffff1692909217640100000000426fffffffffffffffffffffffffffffffff1602178455604080519284168352602083019190915233917f9d9fe61047777339f4f4cb36a1f75ee90e3c6aa90c13abd3ffa07f6f86e0a307910160405180910390a2505050565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611952573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197691906156f8565b6001600160a01b0316336001600160a01b0316146119c0576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa83871720000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b97016169063a8387172906024016114af565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa991906156f8565b6001600160a01b0316336001600160a01b031614611af3576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f536afae40000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301526000917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970169091169063536afae4906024016020604051808303816000875af1158015611b79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b9d919061567c565b60008481526006602090815260409182902080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000081166fffffffffffffffffffffffffffffffff918216869003821617909155915191831682529192506001600160a01b0384169185917fe2d313b9d9b90c2930241ea64ee5d6f4ff30dfd44a15cd3f1df2c6cb8021ec07910160405180910390a36001600160a01b03821660008181526005602052604080822080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000169055517f9390b453426557da5ebdc31f19a37753ca04addf656d32f35232211bb2af3f199190a26003611ca283610c2b565b6005811115611cb357611cb36154d2565b0361105457611054826123c0565b6001600160a01b038116600090815260046020526040812054611d1f907f00000000000000000000000000000000000000000000000000000000000000789064010000000090046fffffffffffffffffffffffffffffffff16615715565b92915050565b336001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c91614611d87576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d8f6129d4565b506040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018290526000907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063b0ea09a890602401602060405180830381865afa158015611e11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3591906156f8565b6040517f8c1516c70000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192507f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b9701690911690638c1516c790602401600060405180830381600087803b158015611eb657600080fd5b505af1158015611eca573d6000803e3d6000fd5b50506000546001600160a01b03908116908416039150611ef4905057611eef8161296f565b611efc565b611efc61310a565b61137c6131e1565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316639e45e8f46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f8691906156f8565b6001600160a01b0316336001600160a01b031614611fd0576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f5636aabd0000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301526000917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b9701690911690635636aabd906024016020604051808303816000875af1158015612056573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207a919061567c565b6040516fffffffffffffffffffffffffffffffff821681529091506001600160a01b0383169085907f1237821480ce4d75f917bc39d1641eb17a5e09a2d5bf982cdd8cb2561aa28e689060200160405180910390a36120da82600061347b565b837f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612139573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061215d9190615699565b116121b557600084815260066020526040902080546fffffffffffffffffffffffffffffffff8082168401167fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116179055611124565b6040517fc42996d60000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526fffffffffffffffffffffffffffffffff831660248301527f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b97016169063c42996d6906044016020604051808303816000875af115801561224e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612272919061567c565b905061227f836000610fb5565b6040516fffffffffffffffffffffffffffffffff821681526001600160a01b0384169085907fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa149060200160405180910390a350505050565b6001546000906122f79063ffffffff640100000000820481169116615749565b905090565b336001600160a01b037f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b97016161461235e576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600361236982610c2b565b600581111561237a5761237a6154d2565b1480156123af57506001600160a01b0381166000908152600560205260409020546fffffffffffffffffffffffffffffffff16155b156123bd576123bd816123c0565b50565b6040517f8abf0af00000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301526124729183917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970161690638abf0af090602401602060405180830381865afa158015612445573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612469919061567c565b60019190613623565b806001600160a01b03167ff33a24861b76047debce215c7ae4915a9befc5d870e97efbd4152df23c72112a426040516124ad91815260200190565b60405180910390a250565b6001600160a01b038116600090815260028301602052604081205463ffffffff168082036124ea576000915050611d1f565b6001600160a01b03831660009081526002850160209081526040808320805463ffffffff1916905563ffffffff8481168452600180890190935292208054910154740100000000000000000000000000000000000000009091049091169061010090046effffffffffffffffffffffffffffff165b63ffffffff8216156126015763ffffffff91821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff909116179055547401000000000000000000000000000000000000000090049091169061255f565b61260b8684613cf1565b50508354600163ffffffff64010000000080840482168301909116027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff90921691909117855591505092915050565b6001600160a01b038216600090815260028401602052604081205463ffffffff1680820361268c576000915050612968565b63ffffffff80821660009081526001808801602052604090912090810180546effffffffffffffffffffffffffffff8781166101008181027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff851617909455935492909104169274010000000000000000000000000000000000000000909104169082101561283c5763ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116848803700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff908116820116909202179091555b63ffffffff82161561282c5763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168601909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff909116179055547401000000000000000000000000000000000000000090049091169061278b565b506128378784614516565b612960565b63ffffffff83166000908152600188810160205260409091200180547fff000000000000000000000000000000ffffffffffffffffffffffffffffffff8116878503700100000000000000000000000000000000928390046effffffffffffffffffffffffffffff90811682900316909202179091555b63ffffffff8216156129555763ffffffff91821660009081526001808a01602052604090912090810180546effffffffffffffffffffffffffffff7001000000000000000000000000000000008083048216869003909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff90911617905554740100000000000000000000000000000000000000009004909116906128b3565b506129608784614722565b600193505050505b9392505050565b6001600160a01b038116600090815260046020526040902054610100900460ff16156123bd576001600160a01b0316600090815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055565b6000807f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a599190615699565b905060007f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03166369f16eec6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612abb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612adf9190615699565b90507f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6391906156f8565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b8152600401612b9091815260200190565b602060405180830381865afa158015612bad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bd1919061576e565b612bde5760009250505090565b6000805b7f000000000000000000000000000000000000000000000000000000000000000a6fffffffffffffffffffffffffffffffff16826fffffffffffffffffffffffffffffffff16108015612c355750828411155b15613049576040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018590527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316906333727c4d90602401602060405180830381865afa158015612cb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cdc919061576e565b15613049576040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018590527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063b0ea09a890602401602060405180830381865afa158015612d5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d8391906156f8565b90506000806000612d9384614b4d565b6040517fad4294510000000000000000000000000000000000000000000000000000000081526001600160a01b0388811660048301526fffffffffffffffffffffffffffffffff858116602484015284811660448401528316606483015293965091945092507f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970169091169063ad42945190608401600060405180830381600087803b158015612e4157600080fd5b505af1158015612e55573d6000803e3d6000fd5b5050604080516fffffffffffffffffffffffffffffffff8581168252878116602083015286168183015290516001600160a01b03881693508a92507fd74a44a8cd6c73740a70271e07ee96d8a495ff30037ae6381cbcdb8fe7f2a1ea9181900360600190a36000878152600660205260409020546fffffffffffffffffffffffffffffffff168015613029576040517fc42996d60000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301526fffffffffffffffffffffffffffffffff831660248301527f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b97016169063c42996d6906044016020604051808303816000875af1158015612f7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f9e919061567c565b60008981526006602090815260409182902080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016905590516fffffffffffffffffffffffffffffffff831681529192506001600160a01b038716918a917fd537f9e63e8da05cdb52f795e1c79d7b163e2517d5229375474dbe60b48cfa14910160405180910390a35b613034856000610fb5565b87600101975085600101955050505050612be2565b6fffffffffffffffffffffffffffffffff8216156130ff576040517f9902cdc0000000000000000000000000000000000000000000000000000000008152600481018590527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031690639902cdc090602401600060405180830381600087803b1580156130dc57600080fd5b505af11580156130f0573d6000803e3d6000fd5b50505050600194505050505090565b600094505050505090565b6000546001600160a01b031661311c57565b600080546001600160a01b03168152600460205260409020547f00000000000000000000000000000000000000000000000000000000000000026fffffffffffffffffffffffffffffffff1661010090910460ff161061318d57600054610c29906001600160a01b0316600161347b565b600080546001600160a01b03168152600460205260409020805460ff6101008083048216600101909116027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff909116179055565b6001805468010000000000000000900463ffffffff1660009081526002602052604081209091015470010000000000000000000000000000000090046effffffffffffffffffffffffffffff16905060007f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663f403838d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613290573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132b49190615699565b90506000826effffffffffffffffffffffffffffff161180156132d75750600081115b1561344f5760006001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c91663a25ae5576133186001856156e1565b6040518263ffffffff1660e01b815260040161333691815260200190565b608060405180830381865afa158015613353573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613377919061578b565b9050600083826020015143414460014361339191906156e1565b6040805160208101969096528501939093527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606092831b1691840191909152607483015240609482015260b4016040516020818303038152906040528051906020012060001c613402919061585d565b905061340f600182614e7e565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790555061137c9050565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555050565b6000816134a8577f00000000000000000000000000000000000000000000000000000000000000786134ca565b7f000000000000000000000000000000000000000000000000000000000000003c5b90506000613501846001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff16151590565b6135145761350f8242615715565b61354a565b6001600160a01b03841660009081526005602052604090205461354a9083906fffffffffffffffffffffffffffffffff16615715565b6001600160a01b03851660008181526005602090815260409182902080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff8616908117909155915191825292935090917f95a398f2b6b2ad94f281708c97fe502386fc16adca43daed577a1e992a4cc814910160405180910390a26135e36001856124b8565b1561112457836001600160a01b03167fdee7e7274fb1911def379ceda542a2723358c99d6d1f89fcbdbe9e9d638d9961426040516116e791815260200190565b6001600160a01b0382166136be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f42616c616e636564576569676874547265653a207a65726f206164647265737360448201527f206e6f7420616c6c6f776564000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6001600160a01b038216600090815260028401602052604090205463ffffffff161561376c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f42616c616e636564576569676874547265653a206e6f646520616c726561647960448201527f206578697374696e67000000000000000000000000000000000000000000000060648201526084016136b5565b60006040518060e00160405280846001600160a01b03168152602001600063ffffffff168152602001600063ffffffff168152602001600063ffffffff168152602001600115158152602001836effffffffffffffffffffffffffffff168152602001836effffffffffffffffffffffffffffff16815250905083600001600081819054906101000a900463ffffffff168092919060010191906101000a81548163ffffffff021916908363ffffffff1602179055505060008460000160009054906101000a900463ffffffff169050818560010160008363ffffffff1663ffffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160186101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160006101000a81548160ff02191690831515021790555060a08201518160010160016101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555060c08201518160010160106101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555090505080856002016000866001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548163ffffffff021916908363ffffffff1602179055508460000160089054906101000a900463ffffffff1663ffffffff16600003613a4757845463ffffffff90911668010000000000000000027fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff90911617909355505050565b845468010000000000000000900463ffffffff165b63ffffffff808216600090815260018089016020526040822090810180546effffffffffffffffffffffffffffff70010000000000000000000000000000000080830482168b01909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff90911617905580549092600160c01b909104169003613b835763ffffffff838116600081815260018a016020526040902080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000938616939093029290921790915581547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b909102178155613b7a8784614516565b50505050505050565b8054600160e01b900463ffffffff16600003613c595763ffffffff838116600081815260018a8101602052604090912080547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000948716949094029390931783559190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905581547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16600160e01b909102178155613b7a8784614516565b805463ffffffff600160e01b8204811660009081526001808b016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff70010000000000000000000000000000000092839004811692909104161115613cd9578054600160e01b900463ffffffff169150613ceb565b8054600160c01b900463ffffffff1691505b50613a5c565b63ffffffff81166000908152600183016020526040902080546001600160a01b0316613d9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f42616c616e636564576569676874547265653a206e6f6465206e6f742065786960448201527f737473000000000000000000000000000000000000000000000000000000000060648201526084016136b5565b8054600160c01b900463ffffffff1660000361406d578054600160e01b900463ffffffff16600003613f1c57805474010000000000000000000000000000000000000000900463ffffffff16600003613e1d5782547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff168355613ed8565b600181015460ff1615613e8557805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff169055613ed8565b805474010000000000000000000000000000000000000000900463ffffffff166000908152600184016020526040902080547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690555b5063ffffffff1660009081526001918201602052604081209081550180547fff00000000000000000000000000000000000000000000000000000000000000169055565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690614510565b8054600160e01b900463ffffffff166000036141d457805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b0397881617808955859004861684528084208084018054948a0180546effffffffffffffffffffffffffffff6101009788900481169097027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559254700100000000000000000000000000000000908190049097169096027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9092167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951717909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690614510565b805463ffffffff600160e01b82048116600090815260018087016020526040808320820154600160c01b909504909316825291902001546effffffffffffffffffffffffffffff610100928390048116929091041611156143a257805463ffffffff600160c01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff821681178355600160e01b9096048c168a52868a20909801549254700100000000000000000000000000000000908190048316938190048316939093019091169091027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9093167fff000000000000000000000000000000000000000000000000000000000000ff9096169590951791909117909355915490951682526002880190945292909220805494821663ffffffff199095169490941790935581540490911690614510565b805463ffffffff600160e01b80830482166000908152600180880160209081526040808420547fffffffffffffffffffffffff00000000000000000000000000000000000000009097166001600160a01b03978816178089558581048716855281852080850180548b870180546effffffffffffffffffffffffffffff6101009384900481169093027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff8216811783559354600160c01b9096048c168a52868a2090980154700100000000000000000000000000000000908190048316958190048316959095019091169093027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091167fff000000000000000000000000000000000000000000000000000000000000ff90961695909517949094179055915490951682526002880190945292909220805494821663ffffffff1990951694909417909355815404909116905b50613cf1565b63ffffffff80821660009081526001840160205260408082208054740100000000000000000000000000000000000000009004909316825290205b815474010000000000000000000000000000000000000000900463ffffffff16158015906145a45750600180820154908301546effffffffffffffffffffffffffffff6101009283900481169290910416115b1561112457815481547fffffffffffffffffffffffff00000000000000000000000000000000000000008083166001600160a01b03928316178555835416918116919091178255600180840180548483018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117875584549584900483169384029516949094179092558354929003700100000000000000000000000000000000808404831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9091161790558354821660009081526002870160209081526040808320805463ffffffff998a1663ffffffff199182161790915587549654909516835280832080549095167401000000000000000000000000000000000000000096879004891617909455945484900486168082529187019094528184208054939093049094168352909120614551565b5b63ffffffff8082166000908152600180850160205260408083208054600160e01b810486168552828520840154600160c01b90910490951684529220015490916effffffffffffffffffffffffffffff61010091829004811691909204909116111561496b57600180820154825463ffffffff600160c01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff6101009283900481169290910416111561105457805463ffffffff600160c01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c1617905588548690048716808652928252838520549097168452959095529020805490951690921790935590540416614723565b600180820154825463ffffffff600160e01b90910416600090815285830160205260409020909101546effffffffffffffffffffffffffffff6101009283900481169290910416111561105457805463ffffffff600160e01b80830482166000908152600187810160208181526040808520547fffffffffffffffffffffffff0000000000000000000000000000000000000000808a166001600160a01b0392831617808c558890048916875282872080549091169982169990991790985583890180548a548890048916875282872086018054610100908190046effffffffffffffffffffffffffffff9081168083027fffffffffffffffffffffffffffffffff000000000000000000000000000000ff80871691909117909655835494839004821692830294909516939093179091558b548990048a168852838820909601805496909203700100000000000000000000000000000000808804831691909103909116027fff000000000000000000000000000000ffffffffffffffffffffffffffffffff9095169490941790935587548716845260028a0180825283852080549a881663ffffffff199b8c1617905588548690048716808652928252838520549097168452959095529020805490951690921790935590540416614723565b60008060007f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970166001600160a01b031663360864176040518163ffffffff1660e01b8152600401602060405180830381865afa158015614bb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614bd491906156f8565b6001600160a01b0316846001600160a01b031603614c1a5750600091508190507f0000000000000000000000000000000000000000000000000000000000000014614e77565b6001600160a01b03841660009081526004602052604081205462010000900460ff1690614c468661504d565b9050600080614c8b6fffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000014850116856064615183565b9050614cce6fffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000001416606486810390615183565b9150614cf16fffffffffffffffffffffffffffffffff8416606486810390615183565b6040517f981cee530000000000000000000000000000000000000000000000000000000081526001600160a01b038a811660048301529194506000917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b97016169063981cee5390602401602060405180830381865afa158015614d76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d9a919061567c565b6040517f6b9ffeac0000000000000000000000000000000000000000000000000000000081526001600160a01b038b811660048301529192506000917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b970161690636b9ffeac90602401602060405180830381865afa158015614e1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e43919061567c565b90506000614e666fffffffffffffffffffffffffffffffff861684808501615183565b948590039950949750505001925050505b9193909250565b815460009068010000000000000000900463ffffffff165b63ffffffff80821660009081526001808701602052604080832054600160c01b9004909316825291902001546effffffffffffffffffffffffffffff808516700100000000000000000000000000000000909204161115614f175763ffffffff9081166000908152600185016020526040902054600160c01b900416614e96565b63ffffffff8181166000818152600187810160205260408083208054600160c01b9004909516835282208101549290915291909101547001000000000000000000000000000000009091046effffffffffffffffffffffffffffff90811690940393848116610100909204161115614fb05763ffffffff1660009081526001840160205260409020546001600160a01b03169050611d1f565b63ffffffff818116600090815260018681016020526040808320808301549054600160e01b9004909416835290912001546101009091046effffffffffffffffffffffffffffff908116909403938481167001000000000000000000000000000000009092041611156150435763ffffffff9081166000908152600185016020526040902054600160e01b900416614e96565b6000915050611d1f565b6040517f913f1a9f0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015260009182917f0000000000000000000000000b306bf915c4d645ff596e518faf3f9669b97016169063913f1a9f90602401602060405180830381865afa1580156150d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906150f5919061567c565b905060006151386fffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000141660286064615183565b905061517b816fffffffffffffffffffffffffffffffff1665010000000000615174856fffffffffffffffffffffffffffffffff166064615232565b91906152f9565b949350505050565b6000838302608081901c6fffffffffffffffffffffffffffffffff841611615207576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f55696e743132384d6174683a206d756c446976206f766572666c6f770000000060448201526064016136b5565b826fffffffffffffffffffffffffffffffff1681816152285761522861582e565b0495945050505050565b600080838310801561524b576001811461525e5761526d565b650100000000008502849004915061526d565b65010000000000840285900491505b506402ef6c3406818002602890811c808402821c808202831c808302841c808402851c938402851c95909502841c641da06a6e33909502841c6455232d2bb2909202841c640d4ca0c283909302841c643177d95571909102841c64fffe4bcada90960290931c9490940191909101039190910303905081831115611d1f576501921fb544430392915050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600003615351578382816153475761534761582e565b0492505050612968565b8084116153ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d6174683a206d756c446976206f766572666c6f77000000000000000000000060448201526064016136b5565b60008486880960026001871981018816978890046003810283188082028403028082028403028082028403028082028403028082028403029081029092039091026000889003889004909101858311909403939093029303949094049190911702949350505050565b6fffffffffffffffffffffffffffffffff811681146123bd57600080fd5b803560ff8116811461545257600080fd5b919050565b6001600160a01b03811681146123bd57600080fd5b60008060006060848603121561548157600080fd5b833561548c81615423565b925061549a60208501615441565b915060408401356154aa81615457565b809150509250925092565b6000602082840312156154c757600080fd5b813561296881615457565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016006831061553c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b600060208083528351808285015260005b8181101561556f57858101830151858201604001528201615553565b81811115615581576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b80151581146123bd57600080fd5b600080604083850312156155d657600080fd5b82356155e181615457565b915060208301356155f1816155b5565b809150509250929050565b60006020828403121561560e57600080fd5b61296882615441565b6000806040838503121561562a57600080fd5b8235915060208301356155f181615457565b60006020828403121561564e57600080fd5b5035919050565b60008060006060848603121561566a57600080fd5b83359250602084013561549a81615457565b60006020828403121561568e57600080fd5b815161296881615423565b6000602082840312156156ab57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156156f3576156f36156b2565b500390565b60006020828403121561570a57600080fd5b815161296881615457565b60006fffffffffffffffffffffffffffffffff808316818516808303821115615740576157406156b2565b01949350505050565b600063ffffffff83811690831681811015615766576157666156b2565b039392505050565b60006020828403121561578057600080fd5b8151612968816155b5565b60006080828403121561579d57600080fd5b6040516080810181811067ffffffffffffffff821117156157e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405282516157f581615457565b815260208381015190820152604083015161580f81615423565b6040820152606083015161582281615423565b60608201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006effffffffffffffffffffffffffffff808416806158a6577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b9216919091069291505056fea164736f6c634300080f000a", + "key": "0x60229d8572100b3ab5a8141d15bf4603349edc37075f6b048fb50d7c27fcb6a1" }, - "0x84ea74d481ee0a5332c457a4d796187f6ba67feb": { + "0x82e01223d51eb87e16a03e24687edf0f294da6f1": { "balance": "0", "nonce": 1, - "root": "0xa5123c1d51dd7986375df921b012df36448f6a7bb8122d860ba0700556b38e16", - "codeHash": "0xf650a63548512d8be661141feb8185e56e7bedb8ba6aee75cf07a6c7685af4f7", - "code": "0x608060405234801561001057600080fd5b50600436106101ad5760003560e01c8063887c560f116100ee578063cfb4474d11610097578063e39a219c11610071578063e39a219c1461053f578063e58932b314610552578063e9371a2c14610572578063fc9d84df1461059257600080fd5b8063cfb4474d146104ca578063d2ee3075146104f1578063d5145ebc1461051857600080fd5b8063a41483e3116100c8578063a41483e314610491578063a6ade11f146104a4578063b8b1a27c146104b757600080fd5b8063887c560f146104305780638f3a6c88146104435780639ded39521461046a57600080fd5b8063461569b81161015b5780635865b607116101355780635865b607146103d057806362fc00db146103f75780636fe0e5591461040a57806380ab13131461041d57600080fd5b8063461569b81461034d5780635375b8911461036057806354fd4d501461038757600080fd5b80632df27fa51161018c5780632df27fa51461023e57806336086417146102f15780634394c5841461031857600080fd5b80621c2ff6146101b25780631be4e27e146101f65780631db1b67214610229575b600080fd5b6101d97f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b6040516001600160a01b0390911681526020015b60405180910390f35b610219610204366004614878565b60036020526000908152604090205460ff1681565b60405190151581526020016101ed565b61023c6102373660046148a6565b6105a5565b005b6102aa61024c3660046148a6565b6002602090815260009283526040808420909152908252902080546001820154600383015460049093015460ff83169367ffffffffffffffff610100850416936001600160a01b036901000000000000000000909104811693169186565b6040805160ff909716875267ffffffffffffffff90951660208701526001600160a01b039384169486019490945291166060840152608083015260a082015260c0016101ed565b6101d97f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e81565b61033f7f000000000000000000000000000000000000000000000000000000000000001e81565b6040519081526020016101ed565b61021961035b366004614878565b61066f565b61033f7f000000000000000000000000000000000000000000000000000000000000006481565b6103c36040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516101ed919061492e565b6101d97f0000000000000000000000009a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae81565b61023c610405366004614941565b610764565b61023c610418366004614a65565b610ab2565b61023c61042b366004614b47565b610c2c565b61021961043e3660046148a6565b61159b565b61033f7f000000000000000000000000000000000000000000000000000000000000003c81565b6101d97f0000000000000000000000008a791620dd6260079bf849dc5567adc3f2fdc31881565b61023c61049f366004614878565b6115d0565b61023c6104b2366004614bf8565b61170d565b61033f6104c5366004614c62565b611b31565b61033f7f000000000000000000000000000000000000000000000000000000000000000481565b61033f7f000000000000000000000000000000000000000000000000000000000000001e81565b61033f7fa1235b834d6f1f78f78bc4db856fbc49302cce2c519921347600693021e087f781565b61023c61054d366004614878565b611bae565b6105656105603660046148a6565b611f70565b6040516101ed9190614c85565b6105856105803660046148a6565b61207d565b6040516101ed9190614d64565b61023c6105a0366004614da5565b6120a8565b60008281526002602090815260408083206001600160a01b03851684529091528120906105d182612a0f565b905060038160058111156105e7576105e7614d35565b1461065f5760405162461bcd60e51b815260206004820152603c60248201527f436f6c6f737365756d3a2063616e206f6e6c792062652063616c6c656420696660448201527f20746865206368616c6c656e67657220697320696e2074696d6f75740000000060648201526084015b60405180910390fd5b6106698484612aec565b50505050565b6040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810182905260009081906001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9169063a25ae55790602401608060405180830381865afa1580156106f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107169190614e09565b9050427f000000000000000000000000000000000000000000000000000000000000003c82604001516fffffffffffffffffffffffffffffffff1661075b9190614eb0565b10159392505050565b336001600160a01b037f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e16146108025760405162461bcd60e51b815260206004820152602d60248201527f436f6c6f737365756d3a2073656e646572206973206e6f74207468652073656360448201527f757269747920636f756e63696c000000000000000000000000000000000000006064820152608401610656565b816108755760405162461bcd60e51b815260206004820152602e60248201527f436f6c6f737365756d3a2063616e6e6f7420726f6c6c6261636b206f7574707560448201527f7420746f207a65726f20686173680000000000000000000000000000000000006064820152608401610656565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018690526000907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063a25ae55790602401608060405180830381865afa1580156108f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091a9190614e09565b60200151146109915760405162461bcd60e51b815260206004820152603b60248201527f436f6c6f737365756d3a206f6e6c792063616e20726f6c6c6261636b2069662060448201527f746865206f757470757420686173206265656e2064656c6574656400000000006064820152608401610656565b6000818152600360205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517fe664672300000000000000000000000000000000000000000000000000000000815260048101869052602481018390526001600160a01b0384811660448301527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9169063e664672390606401600060405180830381600087803b158015610a4f57600080fd5b505af1158015610a63573d6000803e3d6000fd5b50505050836001600160a01b0316857fdca9fa9b51a5ba03938c6a0cd5489011630370fc481ef2b0cb771ad904a7305342604051610aa391815260200190565b60405180910390a35050505050565b600054610100900460ff1615808015610ad25750600054600160ff909116105b80610aec5750303b158015610aec575060005460ff166001145b610b5e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610656565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610bbc57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610bc582612ee5565b8015610c2857600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b6040517f33727c4d0000000000000000000000000000000000000000000000000000000081526004810188905287907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316906333727c4d90602401602060405180830381865afa158015610cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd09190614ec8565b15610d695760405162461bcd60e51b815260206004820152604b60248201527f436f6c6f737365756d3a2063616e6e6f742070726f6772657373206368616c6c60448201527f656e67652070726f636573732061626f757420616c72656164792066696e616c60648201527f697a6564206f7574707574000000000000000000000000000000000000000000608482015260a401610656565b6000888152600260209081526040808320338452909152812090610d8c82612a0f565b6001830154909150610da9908b906001600160a01b031683613075565b15610db5575050611591565b6005816005811115610dc957610dc9614d35565b1480610de657506004816005811115610de457610de4614d35565b145b610e585760405162461bcd60e51b815260206004820152603a60248201527f436f6c6f737365756d3a20696d706f737369626c6520746f2070726f7665207460448201527f6865206661756c7420696e2063757272656e74207374617475730000000000006064820152608401610656565b6000610e71610e6c368b90038b018b614eea565b613406565b90506000610e8a610e6c368c90038c0160a08d01614eea565b9050610e9d8b8584848e60a081016134db565b610ec68a60a08101610eb3610140830183614f5a565b610ec16101608f018f614f98565b613697565b610ef8610ed76101c08c018c614fcc565b8c61018001358d6101a001358e60a001604001358f60a001602001356137db565b6000610f1560208c0135610f106101408e018e614f5a565b61394b565b60008181526003602052604090205490915060ff1615610fc35760405162461bcd60e51b815260206004820152604c60248201527f436f6c6f737365756d3a207075626c696320696e70757420746861742068617360448201527f20616c7265616479206265656e2076616c6964617465642063616e6e6f74206260648201527f65207573656420616761696e0000000000000000000000000000000000000000608482015260a401610656565b6040517f4292dc3e0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000008a791620dd6260079bf849dc5567adc3f2fdc3181690634292dc3e90611030908d908d908d908d908890600401615083565b602060405180830381865afa15801561104d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110719190614ec8565b6110bd5760405162461bcd60e51b815260206004820152601860248201527f436f6c6f737365756d3a20696e76616c69642070726f6f6600000000000000006044820152606401610656565b60405142815233908e907f0431864ed2609170587bbc7c198abd8caee4c55943dfb16fd42ec6f59c91c5f79060200160405180910390a36040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018e90526000906001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9169063a25ae55790602401608060405180830381865afa158015611175573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111999190614e09565b905060006362fc00db60e01b8f338960000160099054906101000a90046001600160a01b03168560200151876040516024016112039594939291909485526001600160a01b0393841660208601529190921660408401526060830191909152608082015260a00190565b60408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009095169490941790935291840151606085015192517f080b91ee0000000000000000000000000000000000000000000000000000000081529193506001600160a01b037f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e169263080b91ee926112d592919086906004016150bd565b600060405180830381600087803b1580156112ef57600080fd5b505af1158015611303573d6000803e3d6000fd5b50505050505060016003600083815260200190815260200160002060006101000a81548160ff021916908315150217905550600260008e81526020019081526020016000206000336001600160a01b03166001600160a01b03168152602001908152602001600020600080820160006101000a81549060ff02191690556000820160016101000a81549067ffffffffffffffff02191690556000820160096101000a8154906001600160a01b0302191690556001820160006101000a8154906001600160a01b0302191690556002820160006113df91906147fa565b5060006003820181905560049182018190556040517fe66467230000000000000000000000000000000000000000000000000000000081529182018f905260248201523360448201526001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9169063e664672390606401600060405180830381600087803b15801561147657600080fd5b505af115801561148a573d6000803e3d6000fd5b505050507f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151091906150f7565b6040517fdd215c5d000000000000000000000000000000000000000000000000000000008152600481018f90523360248201526001600160a01b03919091169063dd215c5d90604401600060405180830381600087803b15801561157357600080fd5b505af1158015611587573d6000803e3d6000fd5b5050505050505050505b5050505050505050565b60008281526002602090815260408083206001600160a01b038516845290915281206115c6816139fe565b9150505b92915050565b60008181526002602090815260408083203384529091528120906115f382612a0f565b9050600081600581111561160957611609614d35565b0361167c5760405162461bcd60e51b815260206004820152602760248201527f436f6c6f737365756d3a20746865206368616c6c656e676520646f6573206e6f60448201527f74206578697374000000000000000000000000000000000000000000000000006064820152608401610656565b60018201546116969084906001600160a01b031683613075565b6117085760405162461bcd60e51b815260206004820152602860248201527f436f6c6f737365756d3a206368616c6c656e67652063616e6e6f74206265206360448201527f616e63656c6c65640000000000000000000000000000000000000000000000006064820152608401610656565b505050565b6040517f33727c4d0000000000000000000000000000000000000000000000000000000081526004810186905285907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316906333727c4d90602401602060405180830381865afa15801561178d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117b19190614ec8565b1561184a5760405162461bcd60e51b815260206004820152604b60248201527f436f6c6f737365756d3a2063616e6e6f742070726f6772657373206368616c6c60448201527f656e67652070726f636573732061626f757420616c72656164792066696e616c60648201527f697a6564206f7574707574000000000000000000000000000000000000000000608482015260a401610656565b60008681526002602090815260408083206001600160a01b038916845290915281209061187682612a0f565b60018301549091506118939089906001600160a01b031683613075565b1561189f575050611b29565b600060018260058111156118b5576118b5614d35565b036118ce575060018201546001600160a01b0316611901565b60028260058111156118e2576118e2614d35565b0361190157508154690100000000000000000090046001600160a01b03165b336001600160a01b038216146119595760405162461bcd60e51b815260206004820152601860248201527f436f6c6f737365756d3a206e6f7420796f7572207475726e00000000000000006044820152606401610656565b825460009061196c9060ff166001615114565b90506119f781856002018a8154811061198757611987615139565b9060005260206000200154866002018b60016119a39190614eb0565b815481106119b3576119b3615139565b90600052602060002001548a8a80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613a1292505050565b6000611a0285613bb8565b90506000611a10828b615168565b8660040154611a1f9190614eb0565b9050611a62868a8a80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250879150613be49050565b85547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8416178655611a9686613c0e565b6040805160ff851681524260208201526001600160a01b038d16918e917fcadef6622777415b0589e491bdbf6baf11242f676f77055fd03bf1658c17a145910160405180910390a3611ae7866139fe565b611b22576040516001600160a01b038c16908d907f5c4528cbb38a169d24837617d3fd3d5c70a47769a4e9af6f384720b359b716c890600090a35b5050505050505b505050505050565b6000600160ff83161015611b875760405162461bcd60e51b815260206004820152601760248201527f436f6c6f737365756d3a20696e76616c6964207475726e0000000000000000006044820152606401610656565b60016000611b9582856151a5565b60ff168152602001908152602001600020549050919050565b336001600160a01b037f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e1614611c4c5760405162461bcd60e51b815260206004820152602d60248201527f436f6c6f737365756d3a2073656e646572206973206e6f74207468652073656360448201527f757269747920636f756e63696c000000000000000000000000000000000000006064820152608401610656565b6040517f33727c4d0000000000000000000000000000000000000000000000000000000081526004810182905281907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316906333727c4d90602401602060405180830381865afa158015611ccc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf09190614ec8565b15611d895760405162461bcd60e51b815260206004820152604b60248201527f436f6c6f737365756d3a2063616e6e6f742070726f6772657373206368616c6c60448201527f656e67652070726f636573732061626f757420616c72656164792066696e616c60648201527f697a6564206f7574707574000000000000000000000000000000000000000000608482015260a401610656565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018390526000907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063a25ae55790602401608060405180830381865afa158015611e0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2e9190614e09565b6020810151909150611ea85760405162461bcd60e51b815260206004820152602e60248201527f436f6c6f737365756d3a20746865206f75747075742068617320616c7265616460448201527f79206265656e2064656c657465640000000000000000000000000000000000006064820152608401610656565b6040517fe664672300000000000000000000000000000000000000000000000000000000815260048101849052600060248201526001600160a01b037f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e811660448301527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9169063e6646723906064015b600060405180830381600087803b158015611f5357600080fd5b505af1158015611f67573d6000803e3d6000fd5b50505050505050565b6040805160e0810182526000808252602082018190529181018290526060808201839052608082015260a0810182905260c081019190915260008381526002602081815260408084206001600160a01b03808816865290835293819020815160e081018352815460ff8116825267ffffffffffffffff6101008204168286015269010000000000000000009004861681840152600182015490951660608601529283018054825181850281018501909352808352608086019383018282801561205857602002820191906000526020600020905b815481526020019060010190808311612044575b5050505050815260200160038201548152602001600482015481525050905092915050565b60008281526002602090815260408083206001600160a01b038516845290915281206115c681612a0f565b6040517f33727c4d0000000000000000000000000000000000000000000000000000000081526004810186905285907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316906333727c4d90602401602060405180830381865afa158015612128573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061214c9190614ec8565b156121e55760405162461bcd60e51b815260206004820152604b60248201527f436f6c6f737365756d3a2063616e6e6f742070726f6772657373206368616c6c60448201527f656e67652070726f636573732061626f757420616c72656164792066696e616c60648201527f697a6564206f7574707574000000000000000000000000000000000000000000608482015260a401610656565b6000861161225b5760405162461bcd60e51b815260206004820152603660248201527f436f6c6f737365756d3a206368616c6c656e676520666f722067656e6573697360448201527f206f7574707574206973206e6f7420616c6c6f776564000000000000000000006064820152608401610656565b600086815260026020908152604080832033845290915290208054600160ff9091161061234857600061228d82612a0f565b905060038160058111156122a3576122a3614d35565b1461233c5760405162461bcd60e51b815260206004820152604660248201527f436f6c6f737365756d3a20746865206368616c6c656e676520666f722067697660448201527f656e206f757470757420696e64657820697320616c726561647920696e20707260648201527f6f67726573730000000000000000000000000000000000000000000000000000608482015260a401610656565b6123468833612aec565b505b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018890526000907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063a25ae55790602401608060405180830381865afa1580156123c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ed9190614e09565b9050427f000000000000000000000000000000000000000000000000000000000000003c82604001516fffffffffffffffffffffffffffffffff166124329190614eb0565b10156124a65760405162461bcd60e51b815260206004820152603e60248201527f436f6c6f737365756d3a2063616e6e6f74206372656174652061206368616c6c60448201527f656e676520616674657220746865206372656174696f6e20706572696f6400006064820152608401610656565b602081015161251d5760405162461bcd60e51b815260206004820152603660248201527f436f6c6f737365756d3a206368616c6c656e676520666f722064656c6574656460448201527f206f7574707574206973206e6f7420616c6c6f776564000000000000000000006064820152608401610656565b80516001600160a01b0316330361259c5760405162461bcd60e51b815260206004820152603860248201527f436f6c6f737365756d3a2074686520617373657274657220616e64206368616c60448201527f6c656e676572206d75737420626520646966666572656e7400000000000000006064820152608401610656565b86158015906125ab5750854015155b1561264d578686401461264d5760405162461bcd60e51b8152602060048201526044602482018190527f436f6c6f737365756d3a20626c6f636b206861736820646f6573206e6f74206d908201527f617463682074686520686173682061742074686520657870656374656420686560648201527f6967687400000000000000000000000000000000000000000000000000000000608482015260a401610656565b60006001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c91663a25ae55761268960018c6151c8565b6040518263ffffffff1660e01b81526004016126a791815260200190565b608060405180830381865afa1580156126c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e89190614e09565b60208101519091506127565761275160018787600081811061270c5761270c615139565b905060200201358460200151898980806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613a1292505050565b61279e565b61279e600182602001518460200151898980806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613a1292505050565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061282091906150f7565b6040517f5a544742000000000000000000000000000000000000000000000000000000008152600481018b90523360248201526001600160a01b039190911690635a54474290604401600060405180830381600087803b15801561288357600080fd5b505af1158015612897573d6000803e3d6000fd5b5050505061293a838787808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505050606086015161291491507f0000000000000000000000000000000000000000000000000000000000000004906fffffffffffffffffffffffffffffffff166151c8565b7f0000000000000000000000000000000000000000000000000000000000000004613be4565b825482516001600160a01b03166901000000000000000000027fffffff0000000000000000000000000000000000000000ffffffffffffffff009091161760019081178455830180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790556129b283613c0e565b815160405142815233916001600160a01b0316908b907fd2f7931a802085b3d0234d4c320ce7ee0041da96678ce2bf5c93e8d3d7e65f529060200160405180910390a4505050505050505050565b6001600160a01b03163b151590565b8054600090600160ff9091161015612a2957506000919050565b8154600090612a3a9060ff16613caf565b8354909150610100900467ffffffffffffffff16421115612ac0578015612a645750600392915050565b8254612aa990612aa4907f000000000000000000000000000000000000000000000000000000000000001e90610100900467ffffffffffffffff16614eb0565b421190565b15612ab75750600392915050565b50600492915050565b612ac9836139fe565b612ad65750600592915050565b80612ae2576002612ae5565b60015b9392505050565b60008281526002602081815260408084206001600160a01b0386168552909152822080547fffffff00000000000000000000000000000000000000000000000000000000001681556001810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690559190612b6c908301826147fa565b600382016000905560048201600090555050806001600160a01b0316827fbf4506ef5d06ecb6168f37bc9e69dd473089eb9e3f2675322d01b4d466cff05142604051612bba91815260200190565b60405180910390a36040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316906333727c4d90602401602060405180830381865afa158015612c40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c649190614ec8565b15612dea576040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018390526000907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063a25ae55790602401608060405180830381865afa158015612cea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d0e9190614e09565b90507f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d9291906150f7565b81516040517f36b83469000000000000000000000000000000000000000000000000000000008152600481018690526001600160a01b03858116602483015291821660448201529116906336b8346990606401611f39565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e6c91906150f7565b6040517fdd215c5d000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b038381166024830152919091169063dd215c5d90604401600060405180830381600087803b158015612ed157600080fd5b505af1158015611b29573d6000803e3d6000fd5b60028151612ef3919061520e565b15612f665760405162461bcd60e51b815260206004820152603a60248201527f436f6c6f737365756d3a206c656e677468206f66207365676d656e7473206c6560448201527f6e677468732063616e6e6f74206265206f6464206e756d6265720000000000006064820152608401610656565b600160005b8251811015612fdf57828181518110612f8657612f86615139565b602002602001015160016000838152602001908152602001600020819055506001838281518110612fb957612fb9615139565b6020026020010151612fcb91906151c8565b612fd59083615168565b9150600101612f6b565b507f00000000000000000000000000000000000000000000000000000000000000048114610c285760405162461bcd60e51b815260206004820152602360248201527f436f6c6f737365756d3a20696e76616c6964207365676d656e7473206c656e6760448201527f74687300000000000000000000000000000000000000000000000000000000006064820152608401610656565b6040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810184905260009081906001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9169063a25ae55790602401608060405180830381865afa1580156130f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061311c9190614e09565b6020015190508015613132576000915050612ae5565b336001600160a01b038516146131b05760405162461bcd60e51b815260206004820152602560248201527f436f6c6f737365756d3a2073656e646572206973206e6f742061206368616c6c60448201527f656e6765720000000000000000000000000000000000000000000000000000006064820152608401610656565b60038360058111156131c4576131c4614d35565b03613239576040805162461bcd60e51b81526020600482015260248101919091527f436f6c6f737365756d3a206368616c6c656e67652063616e6e6f74206265206360448201527f616e63656c6c6564206966206368616c6c656e6765722074696d6564206f75746064820152608401610656565b6000858152600260208181526040808420338552909152822080547fffffff00000000000000000000000000000000000000000000000000000000001681556001810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905591906132b0908301826147fa565b50600060038201819055600490910155604051428152339086907f6f3468a095154788e69ed719ee418416c1e338ac2348ccb3531bb97a0ed6ed9d9060200160405180910390a37f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613355573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061337991906150f7565b6040517f36b8346900000000000000000000000000000000000000000000000000000000815260048101879052336024820181905260448201526001600160a01b0391909116906336b8346990606401600060405180830381600087803b1580156133e357600080fd5b505af11580156133f7573d6000803e3d6000fd5b50600198975050505050505050565b80516000906134685781516020808401516040808601516060808801516080808a0151855180890199909952888601969096529187019290925285015260a0808501929092528051808503909201825260c090930190925281519101206115ca565b60405162461bcd60e51b815260206004820152602a60248201527f48617368696e673a20756e6b6e6f776e206f757470757420726f6f742070726f60448201527f6f662076657273696f6e000000000000000000000000000000000000000000006064820152608401610656565b919050565b838560020187815481106134f1576134f1615139565b90600052602060002001541461356f5760405162461bcd60e51b815260206004820152602d60248201527f436f6c6f737365756d3a2074686520736f75726365207365676d656e74206d7560448201527f7374206265206d617463686564000000000000000000000000000000000000006064820152608401610656565b613578856139fe565b61361a57826002860161358c886001614eb0565b8154811061359c5761359c615139565b90600052602060002001540361361a5760405162461bcd60e51b815260206004820152603660248201527f436f6c6f737365756d3a207468652064657374696e6174696f6e207365676d6560448201527f6e74206d757374206e6f74206265206d617463686564000000000000000000006064820152608401610656565b8060600135826080013514611b295760405162461bcd60e51b815260206004820152602960248201527f436f6c6f737365756d3a2074686520626c6f636b2068617368206d757374206260448201527f65206d61746368656400000000000000000000000000000000000000000000006064820152608401610656565b82602001358260e00135146137145760405162461bcd60e51b815260206004820152602960248201527f436f6c6f737365756d3a2074686520737461746520726f6f74206d757374206260448201527f65206d61746368656400000000000000000000000000000000000000000000006064820152608401610656565b600061018083013561373f5761373a61372c846152a0565b613735846153fa565b613cc6565b613759565b61375961374b846152a0565b613754846153fa565b613d6a565b9050808560800135146137d45760405162461bcd60e51b815260206004820152603b60248201527f436f6c6f737365756d3a2074686520626c6f636b20686173682066726f6d207060448201527f75626c696320696e707574206d757374206265206d61746368656400000000006064820152608401610656565b5050505050565b60408051600060208201528082018690526060810185905260808082018590528251808303909101815260a08201928390527f12e64a72000000000000000000000000000000000000000000000000000000009092527f0000000000000000000000009a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae6001600160a01b0316906312e64a7290613898907f42000000000000000000000000000000000000030000000000000000000000009085908c908c90899060a40161559b565b602060405180830381865afa1580156138b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138d99190614ec8565b611f675760405162461bcd60e51b815260206004820152603660248201527f436f6c6f737365756d3a20696e76616c6964204c32546f4c314d65737361676560448201527f50617373657220696e636c7573696f6e2070726f6f66000000000000000000006064820152608401610656565b600060607f000000000000000000000000000000000000000000000000000000000000006461397e610120850185614fcc565b905010156139eb576139e87fa1235b834d6f1f78f78bc4db856fbc49302cce2c519921347600693021e087f76139b8610120860186614fcc565b6139e391507f00000000000000000000000000000000000000000000000000000000000000646151c8565b613e7b565b90505b6115c6846139f8856152a0565b83613f07565b60006001613a0b83613bb8565b1192915050565b805180613a1e86611b31565b14613a915760405162461bcd60e51b815260206004820152602260248201527f436f6c6f737365756d3a20696e76616c6964207365676d656e7473206c656e6760448201527f74680000000000000000000000000000000000000000000000000000000000006064820152608401610656565b81600081518110613aa457613aa4615139565b60200260200101518414613b205760405162461bcd60e51b815260206004820152602c60248201527f436f6c6f737365756d3a20746865206669727374207365676d656e74206d757360448201527f74206265206d61746368656400000000000000000000000000000000000000006064820152608401610656565b81613b2c6001836151c8565b81518110613b3c57613b3c615139565b602002602001015183036137d45760405162461bcd60e51b815260206004820152602f60248201527f436f6c6f737365756d3a20746865206c617374207365676d656e74206d75737460448201527f206e6f74206265206d61746368656400000000000000000000000000000000006064820152608401610656565b805460009060ff166001613bcb82611b31565b613bd591906151c8565b8360030154612ae59190615676565b8251613bf99060028601906020860190614818565b50600484019190915560039092019190915550565b613c17816139fe565b613c8257613c457f000000000000000000000000000000000000000000000000000000000000001e42614eb0565b815467ffffffffffffffff91909116610100027fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff90911617815550565b613c457f000000000000000000000000000000000000000000000000000000000000001e42614eb0565b50565b6000613cbc60028361568a565b60ff161592915050565b6040805160118082526102408201909252600091829190816020015b6060815260200190600190039081613ce2579050509050613d04848483613f79565b613d33846101000151604051602001613d1f91815260200190565b60405160208183030381529060405261422c565b81601081518110613d4657613d46615139565b6020026020010181905250613d5a8161429b565b8051906020012091505092915050565b6040805160148082526102a08201909252600091829190816020015b6060815260200190600190039081613d86579050509050613da8848483613f79565b613dc3846101000151604051602001613d1f91815260200190565b81601081518110613dd657613dd6615139565b6020026020010181905250613df984610140015167ffffffffffffffff166142df565b81601181518110613e0c57613e0c615139565b6020026020010181905250613e2f84610160015167ffffffffffffffff166142df565b81601281518110613e4257613e42615139565b6020026020010181905250613e68846101800151604051602001613d1f91815260200190565b81601381518110613d4657613d46615139565b606060008267ffffffffffffffff811115613e9857613e98614993565b604051908082528060200260200182016040528015613ec1578160200160208202803683370190505b50905060005b83811015613eff5784828281518110613ee257613ee2615139565b602090810291909101015280613ef7816156ac565b915050613ec7565b509392505050565b6000838360e001516000801b85600001518660200151876060015188604001518960a001518a608001518b6101200151518c61012001518c604051602001613f5a9c9b9a99989796959493929190615717565b6040516020818303038152906040528051906020012090509392505050565b613f938360200151604051602001613d1f91815260200190565b81600081518110613fa657613fa6615139565b6020026020010181905250816000015181600181518110613fc957613fc9615139565b6020026020010181905250816020015181600281518110613fec57613fec615139565b60200260200101819052506140118360e00151604051602001613d1f91815260200190565b8160038151811061402457614024615139565b60200260200101819052506140498360c00151604051602001613d1f91815260200190565b8160048151811061405c5761405c615139565b602002602001018190525081604001518160058151811061407f5761407f615139565b60200260200101819052508160600151816006815181106140a2576140a2615139565b60200260200101819052508160800151816007815181106140c5576140c5615139565b60200260200101819052506140e7836060015167ffffffffffffffff166142df565b816008815181106140fa576140fa615139565b602002602001018190525061411c836080015167ffffffffffffffff166142df565b8160098151811061412f5761412f615139565b60200260200101819052508160a0015181600a8151811061415257614152615139565b6020026020010181905250614174836040015167ffffffffffffffff166142df565b81600b8151811061418757614187615139565b60200260200101819052508160c0015181600c815181106141aa576141aa615139565b60200260200101819052508160e0015181600d815181106141cd576141cd615139565b602002602001018190525081610100015181600e815181106141f1576141f1615139565b60200260200101819052506142098360a001516142df565b81600f8151811061421c5761421c615139565b6020026020010181905250505050565b6060808251600114801561425a575060808360008151811061425057614250615139565b016020015160f81c105b156142665750816115ca565b614272835160806142f2565b836040516020016142849291906157d0565b604051602081830303815290604052905092915050565b606060006142a8836144e8565b90506142b6815160c06142f2565b816040516020016142c89291906157d0565b604051602081830303815290604052915050919050565b60606115ca6142ed83614620565b61422c565b606080603884101561437157604080516001808252818301909252906020820181803683370190505090506143278385615114565b60f81b8160008151811061433d5761433d615139565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612ae5565b600060015b6143808187615676565b156143a6578161438f816156ac565b925061439f905061010082615168565b9050614376565b6143b1826001614eb0565b67ffffffffffffffff8111156143c9576143c9614993565b6040519080825280601f01601f1916602001820160405280156143f3576020820181803683370190505b5092506144008583615114565b61440b906037615114565b60f81b8360008151811061442157614421615139565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190505b8181116144df5761010061446982846151c8565b6144759061010061591f565b61447f9088615676565b614489919061520e565b60f81b83828151811061449e5761449e615139565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350806144d7816156ac565b915050614455565b50509392505050565b6060815160000361450757505060408051600081526020810190915290565b6000805b835181101561454e5783818151811061452657614526615139565b6020026020010151518261453a9190614eb0565b915080614546816156ac565b91505061450b565b60008267ffffffffffffffff81111561456957614569614993565b6040519080825280601f01601f191660200182016040528015614593576020820181803683370190505b50600092509050602081015b85518310156146175760008684815181106145bc576145bc615139565b6020026020010151905060006020820190506145da8382845161477f565b8785815181106145ec576145ec615139565b602002602001015151836146009190614eb0565b92505050828061460f906156ac565b93505061459f565b50949350505050565b606060008260405160200161463791815260200190565b604051602081830303815290604052905060005b60208110156146a65781818151811061466657614666615139565b01602001517fff00000000000000000000000000000000000000000000000000000000000000166000036146a6578061469e816156ac565b91505061464b565b60006146b38260206151c8565b67ffffffffffffffff8111156146cb576146cb614993565b6040519080825280601f01601f1916602001820160405280156146f5576020820181803683370190505b50905060005b815181101561461757838361470f816156ac565b94508151811061472157614721615139565b602001015160f81c60f81b82828151811061473e5761473e615139565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080614777816156ac565b9150506146fb565b8282825b602081106147bb578151835261479a602084614eb0565b92506147a7602083614eb0565b91506147b46020826151c8565b9050614783565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052505050565b5080546000825590600052602060002090810190613cac9190614863565b828054828255906000526020600020908101928215614853579160200282015b82811115614853578251825591602001919060010190614838565b5061485f929150614863565b5090565b5b8082111561485f5760008155600101614864565b60006020828403121561488a57600080fd5b5035919050565b6001600160a01b0381168114613cac57600080fd5b600080604083850312156148b957600080fd5b8235915060208301356148cb81614891565b809150509250929050565b60005b838110156148f15781810151838201526020016148d9565b838111156106695750506000910152565b6000815180845261491a8160208601602086016148d6565b601f01601f19169290920160200192915050565b602081526000612ae56020830184614902565b600080600080600060a0868803121561495957600080fd5b85359450602086013561496b81614891565b9350604086013561497b81614891565b94979396509394606081013594506080013592915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516101a0810167ffffffffffffffff811182821017156149e6576149e6614993565b60405290565b604051610120810167ffffffffffffffff811182821017156149e6576149e6614993565b604051601f8201601f1916810167ffffffffffffffff81118282101715614a3957614a39614993565b604052919050565b600067ffffffffffffffff821115614a5b57614a5b614993565b5060051b60200190565b60006020808385031215614a7857600080fd5b823567ffffffffffffffff811115614a8f57600080fd5b8301601f81018513614aa057600080fd5b8035614ab3614aae82614a41565b614a10565b81815260059190911b82018301908381019087831115614ad257600080fd5b928401925b82841015614af057833582529284019290840190614ad7565b979650505050505050565b60008083601f840112614b0d57600080fd5b50813567ffffffffffffffff811115614b2557600080fd5b6020830191508360208260051b8501011115614b4057600080fd5b9250929050565b600080600080600080600060a0888a031215614b6257600080fd5b8735965060208801359550604088013567ffffffffffffffff80821115614b8857600080fd5b908901906101e0828c031215614b9d57600080fd5b90955060608901359080821115614bb357600080fd5b614bbf8b838c01614afb565b909650945060808a0135915080821115614bd857600080fd5b50614be58a828b01614afb565b989b979a50959850939692959293505050565b600080600080600060808688031215614c1057600080fd5b853594506020860135614c2281614891565b935060408601359250606086013567ffffffffffffffff811115614c4557600080fd5b614c5188828901614afb565b969995985093965092949392505050565b600060208284031215614c7457600080fd5b813560ff81168114612ae557600080fd5b60006020808352610100830160ff8551168285015267ffffffffffffffff8286015116604085015260408501516001600160a01b0380821660608701528060608801511660808701525050608085015160e060a0860152818151808452610120870191508483019350600092505b80831015614d135783518252928401926001929092019190840190614cf3565b5060a087015160c087015260c087015160e08701528094505050505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160068310614d9f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b600080600080600060808688031215614dbd57600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff811115614c4557600080fd5b80516fffffffffffffffffffffffffffffffff811681146134d657600080fd5b600060808284031215614e1b57600080fd5b6040516080810181811067ffffffffffffffff82111715614e3e57614e3e614993565b6040528251614e4c81614891565b815260208381015190820152614e6460408401614de9565b6040820152614e7560608401614de9565b60608201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115614ec357614ec3614e81565b500190565b600060208284031215614eda57600080fd5b81518015158114612ae557600080fd5b600060a08284031215614efc57600080fd5b60405160a0810181811067ffffffffffffffff82111715614f1f57614f1f614993565b806040525082358152602083013560208201526040830135604082015260608301356060820152608083013560808201528091505092915050565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe61833603018112614f8e57600080fd5b9190910192915050565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee1833603018112614f8e57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261500157600080fd5b83018035915067ffffffffffffffff82111561501c57600080fd5b6020019150600581901b3603821315614b4057600080fd5b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561506657600080fd5b8260051b8083602087013760009401602001938452509192915050565b606081526000615097606083018789615034565b82810360208401526150aa818688615034565b9150508260408301529695505050505050565b8381526fffffffffffffffffffffffffffffffff831660208201526060604082015260006150ee6060830184614902565b95945050505050565b60006020828403121561510957600080fd5b8151612ae581614891565b600060ff821660ff84168060ff0382111561513157615131614e81565b019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151a0576151a0614e81565b500290565b600060ff821660ff8416808210156151bf576151bf614e81565b90039392505050565b6000828210156151da576151da614e81565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261521d5761521d6151df565b500690565b803567ffffffffffffffff811681146134d657600080fd5b600082601f83011261524b57600080fd5b8135602061525b614aae83614a41565b82815260059290921b8401810191818101908684111561527a57600080fd5b8286015b84811015615295578035835291830191830161527e565b509695505050505050565b60006101a082360312156152b357600080fd5b6152bb6149c2565b82358152602083013560208201526152d560408401615222565b60408201526152e660608401615222565b60608201526152f760808401615222565b608082015260a083013560a082015260c083013560c082015260e083013560e08201526101008084013581830152506101208084013567ffffffffffffffff81111561534257600080fd5b61534e3682870161523a565b828401525050610140615362818501615222565b90820152610160615374848201615222565b9082015261018092830135928101929092525090565b600082601f83011261539b57600080fd5b813567ffffffffffffffff8111156153b5576153b5614993565b6153c86020601f19601f84011601614a10565b8181528460208386010111156153dd57600080fd5b816020850160208301376000918101602001919091529392505050565b6000610120823603121561540d57600080fd5b6154156149ec565b823567ffffffffffffffff8082111561542d57600080fd5b6154393683870161538a565b8352602085013591508082111561544f57600080fd5b61545b3683870161538a565b6020840152604085013591508082111561547457600080fd5b6154803683870161538a565b6040840152606085013591508082111561549957600080fd5b6154a53683870161538a565b606084015260808501359150808211156154be57600080fd5b6154ca3683870161538a565b608084015260a08501359150808211156154e357600080fd5b6154ef3683870161538a565b60a084015260c085013591508082111561550857600080fd5b6155143683870161538a565b60c084015260e085013591508082111561552d57600080fd5b6155393683870161538a565b60e08401526101009150818501358181111561555457600080fd5b6155603682880161538a565b8385015250505080915050919050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b858152600060206080818401526155b56080840188614902565b8381036040850152858152818101600587901b820183018860005b8981101561565d57601f1985840301845281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18c360301811261561357600080fd5b8b01868101903567ffffffffffffffff81111561562f57600080fd5b80360382131561563e57600080fd5b615649858284615570565b9588019594505050908501906001016155d0565b5050809450505050508260608301529695505050505050565b600082615685576156856151df565b500490565b600060ff83168061569d5761569d6151df565b8060ff84160691505092915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036156dd576156dd614e81565b5060010190565b60008151602080840160005b8381101561570c578151875295820195908201906001016156f0565b509495945050505050565b8c81528b60208201528a604082015289606082015288608082015260007fffffffffffffffff000000000000000000000000000000000000000000000000808a60c01b1660a0840152808960c01b1660a88401528760b0840152808760c01b1660d0840152507fffff0000000000000000000000000000000000000000000000000000000000008560f01b1660d88301526157be6157b860da8401866156e4565b846156e4565b9e9d5050505050505050505050505050565b600083516157e28184602088016148d6565b8351908301906157f68183602088016148d6565b01949350505050565b600181815b8085111561585857817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561583e5761583e614e81565b8085161561584b57918102915b93841c9390800290615804565b509250929050565b60008261586f575060016115ca565b8161587c575060006115ca565b8160018114615892576002811461589c576158b8565b60019150506115ca565b60ff8411156158ad576158ad614e81565b50506001821b6115ca565b5060208310610133831016604e8410600b84101617156158db575081810a6115ca565b6158e583836157ff565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0482111561591757615917614e81565b029392505050565b6000612ae5838361586056fea164736f6c634300080f000a", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000000": "01", - "0x7dfe757ecd65cbd7922a9c0161e935dd7fdbcc0e999689c7d31633896b1fc60b": "03", - "0xa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49": "02", - "0xcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f": "02", - "0xd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec330f": "03" - }, - "key": "0x6ed8898a487b7360c301d9bb5c9175a94d80e63aa3040e16bf5090e89d33b683" + "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "codeHash": "0xa4b37949aa817c72c9ea8f35aaa82261866ca207b23f59257fc00dfe27de1d8d", + "code": "0x608060405234801561001057600080fd5b50600436106102f45760003560e01c80638abf0af011610191578063b172597e116100e3578063c2d9b68411610097578063d706200511610071578063d706200514610826578063de7d4d6a1461084d578063fdbb3fd21461085757600080fd5b8063c2d9b684146107d4578063c42996d614610800578063c7ab2c071461081357600080fd5b8063b744d2f9116100c8578063b744d2f914610773578063bcacc70a14610786578063c0a63a79146107ad57600080fd5b8063b172597e1461074d578063b55cd78e1461076057600080fd5b8063a51c9ace11610145578063a85120e41161011f578063a85120e414610700578063ad42945114610713578063ae9483e01461072657600080fd5b8063a51c9ace146106d2578063a63b8d14146106da578063a8387172146106ed57600080fd5b8063913f1a9f11610176578063913f1a9f14610655578063960a08931461068a578063981cee531461069d57600080fd5b80638abf0af01461062f5780638c1516c71461064257600080fd5b806354469aea1161024a5780636b9ffeac116101fe578063833a333b116101d8578063833a333b146105c5578063842d0d3b146105d857806386d18a941461061c57600080fd5b80636b9ffeac1461053d5780637db41f971461057257806382dae3aa146105bd57600080fd5b80635636aabd1161022f5780635636aabd146104c757806356576b5b146104da5780635959b7651461050157600080fd5b806354469aea1461046b57806354fd4d501461047e57600080fd5b8063209a9694116102ac5780633608641711610286578063360864171461040657806340ce01f114610445578063536afae41461045857600080fd5b8063209a9694146103b5578063270a1644146103e057806331d8e007146103f357600080fd5b806319412a20116102dd57806319412a201461037c5780631e5d81781461038f5780631f86f4f1146103a257600080fd5b806308fab167146102f9578063150b7a021461030e575b600080fd5b61030c61030736600461382c565b61087e565b005b61034661031c366004613863565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b61030c61038a3660046138fe565b610b8d565b61030c61039d366004613943565b610cc7565b61030c6103b03660046139c9565b61105e565b6103c86103c336600461382c565b611407565b6040516001600160801b039091168152602001610373565b61030c6103ee3660046139f3565b61141c565b61030c610401366004613943565b6114f7565b61042d7f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e81565b6040516001600160a01b039091168152602001610373565b61030c6104533660046139c9565b611989565b6103c86104663660046139f3565b611c42565b61030c610479366004613a0e565b611d30565b6104ba6040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516103739190613a5e565b6103c86104d53660046139f3565b611f3d565b61042d7f000000000000000000000000ff000000000000000000000000000000000000ff81565b6103c861050f3660046139f3565b6001600160a01b0316600090815260208190526040902060020154600160801b90046001600160801b031690565b6103c861054b3660046139f3565b6001600160a01b03166000908152602081905260409020600301546001600160801b031690565b6103c8610580366004613aaf565b6001600160a01b0391821660009081526020818152604080832093909416825260069092019091522054600160801b90046001600160801b031690565b6103c8601481565b6103c86105d3366004613aaf565b612028565b6103c86105e6366004613aaf565b6001600160a01b03918216600090815260208181526040808320939094168252600590920190915220546001600160801b031690565b6103c861062a366004613ae2565b6120a1565b6103c861063d3660046139f3565b612112565b61030c6106503660046139f3565b61214b565b6103c86106633660046139f3565b6001600160a01b03166000908152602081905260409020600401546001600160801b031690565b6103c861069836600461382c565b6122f2565b6103c86106ab3660046139f3565b6001600160a01b03166000908152602081905260409020600201546001600160801b031690565b6103c8606481565b6103c86106e83660046139f3565b6122fe565b61030c6106fb3660046139f3565b61234e565b6103c861070e36600461382c565b61246e565b61030c610721366004613b1e565b612805565b61042d7f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b181565b6103c861075b3660046139f3565b612af2565b6103c861076e366004613aaf565b612b2a565b61030c61078136600461382c565b612b8f565b6103c87f000000000000000000000000000000000000000000000000000000000000000a81565b61042d7f00000000000000000000000023618e81e3f5cdf7f54c3d65f7fbc0abf5b21e8f81565b61042d6107e23660046139f3565b6001600160a01b039081166000908152602081905260409020541690565b6103c861080e36600461382c565b612e87565b6103c8610821366004613aaf565b613040565b61042d7f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe5793534802981565b6103c8620f424081565b6103c87f000000000000000000000000000000000000000000000000000000000000007881565b6001600160a01b0382811660009081526020819052604090205483911633146108d3576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816001600160801b0316600003610916576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42610920846122fe565b6001600160801b03161115610961576040517f285d5a9200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f970531c10000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015242917f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b19091169063970531c190602401602060405180830381865afa1580156109e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a089190613b78565b6001600160801b03161115610a49576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a53838361307e565b6040517f5bab847f0000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152600160248301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b11690635bab847f90604401600060405180830381600087803b158015610ad657600080fd5b505af1158015610aea573d6000803e3d6000fd5b5050506001600160a01b03808516600090815260208190526040902054610b4092507f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe57935348029821691166001600160801b038516613131565b6040516001600160801b03831681526001600160a01b038416907fab48b3d59a240196dc5bdd7f7a638fca310f8194c7d350c3dd7765861311ddf8906020015b60405180910390a2505050565b336001600160a01b037f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b11614610bef576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116610c2f576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03838116600090815260208190526040812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001692841692909217909155610c8390849084906131fd565b6040516001600160801b03831681526001600160a01b038416907fadb1a06aea2cd2ff20eac971640a5eb7d687df3e3a897be2f334836494958a4790602001610b80565b6000819003610d02576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383166000908152602081815260408083203384526006019091528120905b82811015610e5a57816001016000858584818110610d4857610d48613b95565b602090810292909201358352508101919091526040016000908120546001600160801b03169003610da5576040517fe77a0da400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42610dc98633878786818110610dbd57610dbd613b95565b905060200201356120a1565b6001600160801b03161115610e0a576040517f285d5a9200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816001016000858584818110610e2257610e22613b95565b6020908102929092013583525081019190915260400160002080546fffffffffffffffffffffffffffffffff19169055600101610d28565b506000610e678533613333565b6001600160a01b0386166000908152602081815260408083206004810180546fffffffffffffffffffffffffffffffff1981166001600160801b039182168b900382161790915533855260069091019092529091208054808316600160801b91829004841688900390931602919091179055905060005b83811015610fbb577f000000000000000000000000ff000000000000000000000000000000000000ff6001600160a01b03166342842e0e3033888886818110610f2957610f29613b95565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b158015610f9857600080fd5b505af1158015610fac573d6000803e3d6000fd5b50505050806001019050610ede565b506001600160801b03811615611008576110086001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe5793534802916336001600160801b038416613131565b336001600160a01b0316856001600160a01b03167f6fcfb0c3a157955b6809f57bb114c142779ab9b7dd686a1b28ec0f2c9edfb94386868560405161104f93929190613c13565b60405180910390a35050505050565b8160026040517f30ccebb50000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b116906330ccebb590602401602060405180830381865afa1580156110e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111049190613c6f565b600581111561111557611115613c40565b10806111bf57506040517f56b65e970000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b116906356b65e9790602401602060405180830381865afa15801561119b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111bf9190613c90565b156111f6576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006112028433613333565b90506001600160801b0381161561129a576112506001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe5793534802916336001600160801b038416613131565b6040516001600160801b038216815233906001600160a01b038616907ff31a7084636b55317cfeed458343e6f580e12d52ba89be9f1faae91731fcce429060200160405180910390a35b6040517f42842e0e000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018490527f000000000000000000000000ff000000000000000000000000000000000000ff6001600160a01b0316906342842e0e90606401600060405180830381600087803b15801561132157600080fd5b505af1158015611335573d6000803e3d6000fd5b505050506001600160a01b038416600090815260208181526040808320338452600681018352818420600490910180546001600160801b03808216600190810182166fffffffffffffffffffffffffffffffff19938416179093558354600160801b808204831685018316029082161784558987529190920190935292208054429092169190921617905560405183815233906001600160a01b038616907f7a9043ba5086cf56c416db64f7608d06eae96d08a7e35a101ad4f42aab23585d906020015b60405180910390a350505050565b600061141383836133d2565b90505b92915050565b60006114288233613333565b9050806001600160801b031660000361146d576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114aa6001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe5793534802916336001600160801b038416613131565b6040516001600160801b038216815233906001600160a01b038416907ff31a7084636b55317cfeed458343e6f580e12d52ba89be9f1faae91731fcce429060200160405180910390a35050565b8260026040517f30ccebb50000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b116906330ccebb590602401602060405180830381865afa158015611579573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159d9190613c6f565b60058111156115ae576115ae613c40565b108061165857506040517f56b65e970000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b116906356b65e9790602401602060405180830381865afa158015611634573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116589190613c90565b1561168f576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008290036116ca576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006116d68533613333565b90506001600160801b0381161561176e576117246001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe5793534802916336001600160801b038416613131565b6040516001600160801b038216815233906001600160a01b038716907ff31a7084636b55317cfeed458343e6f580e12d52ba89be9f1faae91731fcce429060200160405180910390a35b6001600160a01b0385166000908152602081815260408083203384526006019091528120905b848110156118c3577f000000000000000000000000ff000000000000000000000000000000000000ff6001600160a01b03166342842e0e33308989868181106117df576117df613b95565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152606401600060405180830381600087803b15801561184e57600080fd5b505af1158015611862573d6000803e3d6000fd5b505050504282600101600088888581811061187f5761187f613b95565b90506020020135815260200190815260200160002060006101000a8154816001600160801b0302191690836001600160801b03160217905550806001019050611794565b506001600160a01b0386166000908152602081815260408083206004810180546fffffffffffffffffffffffffffffffff1981166001600160801b039182168b0182161790915533855260069091019092529091208054808316600160801b918290048416880190931602919091179055336001600160a01b0316866001600160a01b03167fafdb227ea10128ee703397dbff24db1f7c90303e6fff8068a2712a1b10c935f18787604051611979929190613cb2565b60405180910390a3505050505050565b6001600160a01b03821660009081526020818152604080832033845260060182528083208484526001810190925282205490916001600160801b0390911690036119ff576040517fe77a0da400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42611a0b8433856120a1565b6001600160801b03161115611a4c576040517f285d5a9200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611a588433613333565b9050611b0c8433856001600160a01b03928316600090815260208181526040808320949095168252600684018152848220600490940180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6001600160801b03808316820181166fffffffffffffffffffffffffffffffff19938416179093558654600160801b808204851690920184169091029216919091178555928252600190930190925291902080549091169055565b6040517f42842e0e000000000000000000000000000000000000000000000000000000008152306004820152336024820152604481018490527f000000000000000000000000ff000000000000000000000000000000000000ff6001600160a01b0316906342842e0e90606401600060405180830381600087803b158015611b9357600080fd5b505af1158015611ba7573d6000803e3d6000fd5b505050506001600160801b03811615611bf757611bf76001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe5793534802916336001600160801b038416613131565b604080518481526001600160801b038316602082015233916001600160a01b038716917fd1343dccf52a899cdc8aaa99714d930d2871b21c218512c779ca3f7c7fddab4191016113f9565b6000336001600160a01b037f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b11614611ca6576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b038116600090815260208190526040902060020180546fffffffffffffffffffffffffffffffff197f000000000000000000000000000000000000000000000000000000000000000a600160801b8084046001600160801b0390811683018116909102928316938116928116929092178101909116919091179091555b919050565b806001600160801b0316600003611d73576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040517f30ccebb50000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b16001600160a01b0316906330ccebb590602401602060405180830381865afa158015611df2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e169190613c6f565b6005811115611e2757611e27613c40565b03611e5e576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e6a338260016131fd565b6040516001600160801b038216815233907fadb1a06aea2cd2ff20eac971640a5eb7d687df3e3a897be2f334836494958a479060200160405180910390a26040517fe428c2f40000000000000000000000000000000000000000000000000000000081523360048201527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b16001600160a01b03169063e428c2f490602401600060405180830381600087803b158015611f2257600080fd5b505af1158015611f36573d6000803e3d6000fd5b5050505050565b6000336001600160a01b037f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b11614611fa1576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b038116600090815260208190526040902060020180547f000000000000000000000000000000000000000000000000000000000000000a6001600160801b03600160801b808404821683900382160280821693821693909317829003166fffffffffffffffffffffffffffffffff199290921691909117909155919050565b6001600160a01b038083166000908152602081815260408083209385168352600684019091528120600483015481549293926001600160801b03600160801b909204821691859161207a911683613cf5565b83546120969190600160801b90046001600160801b0316613d1d565b979650505050505050565b6001600160a01b0380841660009081526020818152604080832093861683526006909301815282822084835260010190529081205461210a907f0000000000000000000000000000000000000000000000000000000000000078906001600160801b0316613d4c565b949350505050565b6001600160a01b03811660009081526020819052604081206002810154600390910154611416916001600160801b039081169116613d4c565b336001600160a01b037f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b116146121ad576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600090815260208190526040812060020180549091906121e9906001600160801b03600160801b820481169116613cf5565b90507f000000000000000000000000000000000000000000000000000000000000000a6001600160801b0316816001600160801b03161015612257576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81546001600160801b03600160801b80830482167f000000000000000000000000000000000000000000000000000000000000000a9081018316909102919092161783556001600160a01b038416907f7ad6f32675ff7ed77c34b45d23cd987ea6a62560f390baac683de0bc6b24fb7e906122d28185613cf5565b604080516001600160801b03938416815292909116602083015201610b80565b60006114138383613452565b6001600160a01b038116600090815260208190526040812060010154611416907f0000000000000000000000000000000000000000000000000000000000000078906001600160801b0316613d4c565b336001600160a01b037f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b116146123b0576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600081815260208190526040902060020180547f000000000000000000000000000000000000000000000000000000000000000a6001600160801b03600160801b8084048216839003821681029382168481178087559596957fc8d4f2228d78be7d0ca97344025aae4f9bc2c87ece32295d72791a4d39f2a71a9561244794939091048316921617613cf5565b604080516001600160801b0393841681529290911660208301520160405180910390a25050565b60008260026040517f30ccebb50000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b116906330ccebb590602401602060405180830381865afa1580156124f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125169190613c6f565b600581111561252757612527613c40565b10806125d157506040517f56b65e970000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b116906356b65e9790602401602060405180830381865afa1580156125ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125d19190613c90565b15612608576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826001600160801b031660000361264b576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126896001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe579353480291633306001600160801b0387166134c1565b60006126958585613452565b6001600160a01b038616600090815260208181526040808320600381018054600160801b6fffffffffffffffffffffffffffffffff1982166001600160801b039283168d0183169081178290048316890183168202179092553386526005909201909352922080548316840183164290931690910291909117905590506040517f5bab847f0000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152600060248301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b11690635bab847f90604401600060405180830381600087803b15801561279557600080fd5b505af11580156127a9573d6000803e3d6000fd5b5050604080516001600160801b038089168252851660208201523393506001600160a01b03891692507f334cabe84b7338f2bdd62070c02f24ffbcc7735e46f425fa401db349717e1328910160405180910390a3949350505050565b336001600160a01b037f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b11614612867576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128dc7f00000000000000000000000023618e81e3f5cdf7f54c3d65f7fbc0abf5b21e8f30836128978688613d4c565b6128a19190613d4c565b6001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe57935348029169291906001600160801b03166134c1565b7f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e6001600160a01b0316846001600160a01b03160361298d576129887f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e826129448587613d4c565b61294e9190613d4c565b6001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe579353480291691906001600160801b0316613131565b612aec565b6001600160a01b03841660009081526020819052604090206003810180546001600160801b03808216870181166fffffffffffffffffffffffffffffffff19928316179092556002830180548084168601841692169190911781556004909201541615612a425760028101546001600160801b0390811690841681612a1457612a14613d77565b6002830180546001600160801b0380821694909304600160801b918290048416019092169091029190911790555b80547f000000000000000000000000000000000000000000000000000000000000000a6001600160801b03600160801b8084048216839003821681029382168481178087556001600160a01b038b16957fc8d4f2228d78be7d0ca97344025aae4f9bc2c87ece32295d72791a4d39f2a71a9594612ac794909204821692911617613cf5565b604080516001600160801b0393841681529290911660208301520160405180910390a2505b50505050565b6001600160a01b038116600090815260208190526040812060020154611416906001600160801b03600160801b820481169116613cf5565b6001600160a01b0382811660009081526020818152604080832093851683526005909301905290812054611413907f000000000000000000000000000000000000000000000000000000000000007890600160801b90046001600160801b0316613d4c565b806001600160801b0316600003612bd2576040517f69646ab000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612bde8383613452565b9050806001600160801b0316600003612c23576040517fab32f25400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383166000908152602081815260408083203384526005019091529020546001600160801b039081169082161115612c8e576040517fab32f25400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42612c998433612b2a565b6001600160801b03161115612cda576040517f285d5a9200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383166000908152602081815260408083206003810180546001600160801b03600160801b80830482168990038216028082169282169290921789900381166fffffffffffffffffffffffffffffffff1992831617909255338652600590920190935292208054808316859003909216919092161790556040517f5bab847f0000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152600160248301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b11690635bab847f90604401600060405180830381600087803b158015612ddb57600080fd5b505af1158015612def573d6000803e3d6000fd5b50612e329250506001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe57935348029169050336001600160801b038516613131565b604080516001600160801b0380851682528316602082015233916001600160a01b038616917f6acf5e34cb1562e3a0785bb4565e0761928cda3dd258168c73bca09621c669e9910160405180910390a3505050565b6000336001600160a01b037f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b11614612eeb576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038084166000818152602081905260409020600201917f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e169003612f9657612f8d6001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe57935348029167f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e6001600160801b038616613131565b82915050611416565b6000612fae6001600160801b03851660146064613512565b905061300d6001600160a01b037f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe57935348029167f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e6001600160801b038416613131565b81546fffffffffffffffffffffffffffffffff198116919094036001600160801b03948516810190941617905550919050565b6001600160a01b03808316600090815260208181526040808320938516835260059093019052908120546114139084906001600160801b03166133d2565b6001600160a01b038216600090815260208190526040902060020180546130b7906001600160801b03600160801b820481169116613cf5565b6001600160801b0316826001600160801b03161115613102576040517f24f21b1500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80546fffffffffffffffffffffffffffffffff1981166001600160801b03918216939093031691909117905550565b6040516001600160a01b0383166024820152604481018290526131f89084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526135b4565b505050565b6001600160a01b0380841660009081526020819052604090209061324e907f0000000000000000000000004c5859f0f772848b2d91f1d83e2fe579353480291685306001600160801b0387166134c1565b6002810180546fffffffffffffffffffffffffffffffff198082166001600160801b039283168701831617909255600183018054909216429091161790558115612aec576040517f5bab847f0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152600060248301527f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b11690635bab847f90604401600060405180830381600087803b15801561331557600080fd5b505af1158015613329573d6000803e3d6000fd5b5050505050505050565b6001600160a01b038083166000908152602081815260408083209385168352600684019091528120600483015481549293926001600160801b03600160801b9092048216918591613385911683613cf5565b83546133a19190600160801b90046001600160801b0316613d1d565b83546fffffffffffffffffffffffffffffffff19166001600160801b03939093169290921790925595945050505050565b6001600160a01b038216600090815260208190526040812060030154611413906001600160801b0316613406906001613d4c565b6001600160a01b038516600090815260208190526040902060030154620f424090600160801b90046001600160801b03166134419190613d4c565b6001600160801b0385169190613512565b6001600160a01b03821660009081526020819052604081206003015461141390620f424090600160801b90046001600160801b03166134919190613d4c565b6001600160a01b0385166000908152602081905260409020600301546001600160801b0316613441906001613d4c565b6040516001600160a01b0380851660248301528316604482015260648101829052612aec9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401613176565b6000838302608081901c6001600160801b03841611613592576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f55696e743132384d6174683a206d756c446976206f766572666c6f770000000060448201526064015b60405180910390fd5b826001600160801b031681816135aa576135aa613d77565b0495945050505050565b6000613609826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166136b69092919063ffffffff16565b905080516000148061362a57508080602001905181019061362a9190613c90565b6131f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401613589565b606061210a848460008585600080866001600160a01b031685876040516136dd9190613da6565b60006040518083038185875af1925050503d806000811461371a576040519150601f19603f3d011682016040523d82523d6000602084013e61371f565b606091505b509150915061209687838387606083156137b45782516000036137ad576001600160a01b0385163b6137ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401613589565b508161210a565b61210a83838151156137c95781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135899190613a5e565b80356001600160a01b0381168114611d2b57600080fd5b6001600160801b038116811461382957600080fd5b50565b6000806040838503121561383f57600080fd5b613848836137fd565b9150602083013561385881613814565b809150509250929050565b60008060008060006080868803121561387b57600080fd5b613884866137fd565b9450613892602087016137fd565b935060408601359250606086013567ffffffffffffffff808211156138b657600080fd5b818801915088601f8301126138ca57600080fd5b8135818111156138d957600080fd5b8960208285010111156138eb57600080fd5b9699959850939650602001949392505050565b60008060006060848603121561391357600080fd5b61391c846137fd565b9250602084013561392c81613814565b915061393a604085016137fd565b90509250925092565b60008060006040848603121561395857600080fd5b613961846137fd565b9250602084013567ffffffffffffffff8082111561397e57600080fd5b818601915086601f83011261399257600080fd5b8135818111156139a157600080fd5b8760208260051b85010111156139b657600080fd5b6020830194508093505050509250925092565b600080604083850312156139dc57600080fd5b6139e5836137fd565b946020939093013593505050565b600060208284031215613a0557600080fd5b611413826137fd565b600060208284031215613a2057600080fd5b8135613a2b81613814565b9392505050565b60005b83811015613a4d578181015183820152602001613a35565b83811115612aec5750506000910152565b6020815260008251806020840152613a7d816040850160208701613a32565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008060408385031215613ac257600080fd5b613acb836137fd565b9150613ad9602084016137fd565b90509250929050565b600080600060608486031215613af757600080fd5b613b00846137fd565b9250613b0e602085016137fd565b9150604084013590509250925092565b60008060008060808587031215613b3457600080fd5b613b3d856137fd565b93506020850135613b4d81613814565b92506040850135613b5d81613814565b91506060850135613b6d81613814565b939692955090935050565b600060208284031215613b8a57600080fd5b8151613a2b81613814565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115613bf657600080fd5b8260051b8083602087013760009401602001938452509192915050565b604081526000613c27604083018587613bc4565b90506001600160801b0383166020830152949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600060208284031215613c8157600080fd5b815160068110613a2b57600080fd5b600060208284031215613ca257600080fd5b81518015158114613a2b57600080fd5b60208152600061210a602083018486613bc4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006001600160801b0383811690831681811015613d1557613d15613cc6565b039392505050565b60006001600160801b0380831681851681830481118215151615613d4357613d43613cc6565b02949350505050565b60006001600160801b03808316818516808303821115613d6e57613d6e613cc6565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008251613db8818460208701613a32565b919091019291505056fea164736f6c634300080f000a", + "key": "0xc130247092931d8c66bf63db8788c6b72a7a8fcc5f0c53a0424bd8390131805e" }, - "0x851356ae760d987e095750cceb3bc6014560891c": { + "0x8a791620dd6260079bf849dc5567adc3f2fdc318": { "balance": "0", "nonce": 1, - "root": "0x1f6d4a6bd29feba7ce7b0aeb56e30f5d7718d9230959d0621e846e72f6d850c9", - "codeHash": "0xf088100162a48771cf9ad3b57490a878312e56f8afcf21e4fee9675799e494f2", - "code": "0x608060405234801561001057600080fd5b50600436106101775760003560e01c8063c71973f6116100d8578063ed579ad31161008c578063f68016b711610066578063f68016b71461046d578063fc7ffea714610481578063ffa1ad741461049457600080fd5b8063ed579ad314610448578063f2fde38b14610451578063f45e65d81461046457600080fd5b8063cc731b02116100bd578063cc731b02146102f8578063e81b2c6d1461042c578063ecdd939d1461043557600080fd5b8063c71973f6146102d2578063c9b26f61146102e557600080fd5b806354fd4d501161012f5780638da5cb5b116101145780638da5cb5b1461028e578063935f029e146102ac578063b40a817c146102bf57600080fd5b806354fd4d501461023d578063715018a61461028657600080fd5b80631fd19ee1116101605780631fd19ee1146101ad5780634add321d146101f55780634f16540b1461021657600080fd5b80630c18c1621461017c57806318d1391814610198575b600080fd5b61018560655481565b6040519081526020015b60405180910390f35b6101ab6101a6366004611139565b61049c565b005b7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08545b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018f565b6101fd610560565b60405167ffffffffffffffff909116815260200161018f565b6101857f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0881565b6102796040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161018f91906111c6565b6101ab61058b565b60335473ffffffffffffffffffffffffffffffffffffffff166101d0565b6101ab6102ba3660046111d9565b61059f565b6101ab6102cd366004611213565b610638565b6101ab6102e036600461133c565b610709565b6101ab6102f3366004611358565b61071d565b6103bc6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c08101825260695463ffffffff8082168352640100000000820460ff9081166020850152650100000000008304169383019390935266010000000000008104831660608301526a0100000000000000000000810490921660808201526e0100000000000000000000000000009091046fffffffffffffffffffffffffffffffff1660a082015290565b60405161018f9190600060c08201905063ffffffff80845116835260ff602085015116602084015260ff6040850151166040840152806060850151166060840152806080850151166080840152506fffffffffffffffffffffffffffffffff60a08401511660a083015292915050565b61018560675481565b6101ab610443366004611358565b61074d565b610185606a5481565b6101ab61045f366004611139565b61081b565b61018560665481565b6068546101fd9067ffffffffffffffff1681565b6101ab61048f366004611371565b6108b5565b610185600081565b6104a4610b3a565b6104cc817f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0855565b6040805173ffffffffffffffffffffffffffffffffffffffff8316602082015260009101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060035b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be8360405161055491906111c6565b60405180910390a35050565b6069546000906105869063ffffffff6a010000000000000000000082048116911661141d565b905090565b610593610b3a565b61059d6000610ba1565b565b6105a7610b3a565b606582905560668190556040805160208101849052908101829052600090606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600160007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be8360405161062b91906111c6565b60405180910390a3505050565b610640610b3a565b610648610560565b67ffffffffffffffff168167ffffffffffffffff1610156106b05760405162461bcd60e51b815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f770060448201526064015b60405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83169081179091556040805160208082019390935281518082039093018352810190526002610523565b610711610b3a565b61071a81610c18565b50565b610725610b3a565b6067819055604080516020808201849052825180830390910181529082019091526000610523565b610755610b3a565b6127108111156107f35760405162461bcd60e51b815260206004820152604860248201527f53797374656d436f6e6669673a20746865206d61782076616c7565206f66207660448201527f616c696461746f7220726577617264207363616c617220686173206265656e2060648201527f6578636565646564000000000000000000000000000000000000000000000000608482015260a4016106a7565b606a819055604080516020808201849052825180830390910181529082019091526004610523565b610823610b3a565b73ffffffffffffffffffffffffffffffffffffffff81166108ac5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016106a7565b61071a81610ba1565b600054610100900460ff16158080156108d55750600054600160ff909116105b806108ef5750303b1580156108ef575060005460ff166001145b6109615760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016106a7565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156109bf57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6109c761100a565b6109d08961081b565b606588905560668790556067869055606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff87161790557f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08849055610a4083610c18565b610a48610560565b67ffffffffffffffff168567ffffffffffffffff161015610aab5760405162461bcd60e51b815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f770060448201526064016106a7565b606a8290558015610b1357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60335473ffffffffffffffffffffffffffffffffffffffff16331461059d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106a7565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8060a001516fffffffffffffffffffffffffffffffff16816060015163ffffffff161115610cae5760405162461bcd60e51b815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d61782062617365000000000000000000000060648201526084016106a7565b6001816040015160ff1611610d2b5760405162461bcd60e51b815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201527f65206c6172676572207468616e2031000000000000000000000000000000000060648201526084016106a7565b6068546080820151825167ffffffffffffffff90921691610d4c9190611449565b63ffffffff161115610da05760405162461bcd60e51b815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f770060448201526064016106a7565b6000816020015160ff1611610e1d5760405162461bcd60e51b815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201527f6965722063616e6e6f742062652030000000000000000000000000000000000060648201526084016106a7565b8051602082015163ffffffff82169160ff90911690610e3d908290611468565b610e4791906114b2565b63ffffffff1614610ec05760405162461bcd60e51b815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d697400000000000000000060648201526084016106a7565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff9687167fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009095169490941764010000000060ff94851602177fffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff166501000000000093909216929092027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1617660100000000000091851691909102177fffff0000000000000000000000000000000000000000ffffffffffffffffffff166a010000000000000000000093909416929092027fffff00000000000000000000000000000000ffffffffffffffffffffffffffff16929092176e0100000000000000000000000000006fffffffffffffffffffffffffffffffff90921691909102179055565b600054610100900460ff166110875760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106a7565b61059d600054610100900460ff166111075760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106a7565b61059d33610ba1565b803573ffffffffffffffffffffffffffffffffffffffff8116811461113457600080fd5b919050565b60006020828403121561114b57600080fd5b61115482611110565b9392505050565b6000815180845260005b8181101561118157602081850181015186830182015201611165565b81811115611193576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611154602083018461115b565b600080604083850312156111ec57600080fd5b50508035926020909101359150565b803567ffffffffffffffff8116811461113457600080fd5b60006020828403121561122557600080fd5b611154826111fb565b803563ffffffff8116811461113457600080fd5b803560ff8116811461113457600080fd5b80356fffffffffffffffffffffffffffffffff8116811461113457600080fd5b600060c0828403121561128557600080fd5b60405160c0810181811067ffffffffffffffff821117156112cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040529050806112de8361122e565b81526112ec60208401611242565b60208201526112fd60408401611242565b604082015261130e6060840161122e565b606082015261131f6080840161122e565b608082015261133060a08401611253565b60a08201525092915050565b600060c0828403121561134e57600080fd5b6111548383611273565b60006020828403121561136a57600080fd5b5035919050565b6000806000806000806000806101a0898b03121561138e57600080fd5b61139789611110565b97506020890135965060408901359550606089013594506113ba60808a016111fb565b93506113c860a08a01611110565b92506113d78a60c08b01611273565b915061018089013590509295985092959890939650565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff808316818516808303821115611440576114406113ee565b01949350505050565b600063ffffffff808316818516808303821115611440576114406113ee565b600063ffffffff808416806114a6577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600063ffffffff808316818516818304811182151516156114d5576114d56113ee565b0294935050505056fea164736f6c634300080f000a", + "root": "0xe0bf1f847c44e40f761c095b49d02fa5fb86f7e20eda964dd68953edaa567aaf", + "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", + "code": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000000": "01", - "0x0000000000000000000000000000000000000000000000000000000000000033": "0dcd1bf9a1b36ce34237eeafef220932846bcd82", - "0x0000000000000000000000000000000000000000000000000000000000000065": "0834", - "0x0000000000000000000000000000000000000000000000000000000000000066": "0f4240", - "0x0000000000000000000000000000000000000000000000000000000000000067": "3c44cdddb6a900fa2b585dd299e03d12fa4293bc", - "0x0000000000000000000000000000000000000000000000000000000000000068": "01c9c380", - "0x0000000000000000000000000000000000000000000000000000000000000069": "ffffffffffffffffffffffffffffffff000f42403b9aca00080a01312d00", - "0x000000000000000000000000000000000000000000000000000000000000006a": "1388", - "0x65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08": "9965507d1a55bcc2695c58ba16fb37d819b0a4dc" + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "c3e53f4d16ae77db1c982e75a937b9f60fe63690", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "5fbdb2315678afecb367f032d93f642f64180aa3" }, - "key": "0xf4856772454495d2d8bbdae250e43ed9b0d01009bbc274f43c0d55ff50885027" + "key": "0x52f57297d97a84de7bdf53a239d5f1c446e6ff8e4e0d175868a241ddff7729d8" }, - "0x8a791620dd6260079bf849dc5567adc3f2fdc318": { + "0x959922be3caee4b8cd9a407cc3ac1c251c2007b1": { "balance": "0", "nonce": 1, - "root": "0x540a283a20e27d52873e1b7b921086f6b97256594ecb34ca9a8d2f4210616f17", + "root": "0x12c6ef3010e4ab4f8563444299bbb8c7070ab2438d6dc2587410f63d7003a46d", "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", "code": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", "storage": { - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "e6e340d132b5f46d1e472debcd681b2abc16e57e", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "7969c5ed335650692bc04293b07f5bf2e7a673c0", "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "5fbdb2315678afecb367f032d93f642f64180aa3" }, - "key": "0x52f57297d97a84de7bdf53a239d5f1c446e6ff8e4e0d175868a241ddff7729d8" + "key": "0x7cb5c2b5a0b80e4fad4cf89bdd73a61db77d1c6dc957bae688b8b7bba3f76422" }, - "0x95401dc811bb5740090279ba06cfa8fcf6113778": { + "0x998abeb3e57409262ae5b751f60747921b33613e": { "balance": "0", "nonce": 1, "root": "0x01f9e62d19297f681ea2208de1fec6c67ed86a26e55dbf4b27a1b0881060507b", @@ -298,15 +382,7 @@ "storage": { "0x0000000000000000000000000000000000000000000000000000000000000000": "ff" }, - "key": "0x0f1928bb1bf8b255a1c91f2ecf2c0d3f779efe8132a79cb298c332da9d5daadf" - }, - "0x959922be3caee4b8cd9a407cc3ac1c251c2007b1": { - "balance": "0", - "nonce": 1, - "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "0x354b26999e434f8256d168395315e1f51fc15bf49bf2e6bb58fc549bd597e7da", - "code": "0x7c010000000000000000000000000000000000000000000000000000000060003504806329a5f2f6149063299e566014176200003757fe5b7f109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b6020527f16ed41e13bb9c0c66ae119424fddbcbc9314dc9fdbdeea55d6c64543dc4903e06040527f2b90bba00fca0589f617e7dcbfe82e0df706ab640ceb247b791a93b74e36736d6060527f2969f27eed31a480b9c36c764379dbca2cc8fdd1415c3dded62940bcde0bd7716080527f2e2419f9ec02ec394c9871c832963dc1b89d743c8c7b964029b2311687b1fe2360a0527f101071f0032379b697315876690f053d148d4e109f5fb065c8aacc55a0f89bfa60c0527f143021ec686a3f330d5f9e654638065ce6cd79e28c5b3753326244ee65a1b1a760e0527f176cc029695ad02582a70eff08a6fd99d057e12e58e7d7b6b16cdfabc8ee2911610100527f19a3fc0a56702bf417ba7fee3802593fa644470307043f7773279cd71d25d5e0610120527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024356004356000837f0ee9a592ba9a9518d05986d656f40c2114c4993c11bb29938d21d47304cd8e6e82089050837f00f1445235f2148c5986587169fc1bcd887b08d4d00868df5696fff40956e86483089150837f08dff3487e8ac99e1f29a058d0fa80b930c728730b7ab36ce879f3890ecf73f58408925083818180828009800909905083828180828009800909915083838180828009800909925062000249600052620025ba565b837f2f27be690fdaee46c3ce28f7532b13c856c35342c84bda6e20966310fadc01d082089050837f2b2ae1acf68b7b8d2416bebf3d4f6234b763fe04b8043ee48b8327bebca16cf283089150837f0319d062072bef7ecca5eac06f97d4d55952c175ab6b03eae64b44c7dbf11cfa84089250838181808280098009099050838281808280098009099150838381808280098009099250620002ec600052620025ba565b837f28813dcaebaeaa828a376df87af4a63bc8b7bf27ad49c6298ef7b387bf28526d82089050837f2727673b2ccbc903f181bf38e1c1d40d2033865200c352bc150928adddf9cb7883089150837f234ec45ca27727c2e74abd2b2a1494cd6efbd43e340587d6b8fb9e31e65cc632840892508381818082800980090990508382818082800980090991508383818082800980090992506200038f600052620025ba565b837f15b52534031ae18f7f862cb2cf7cf760ab10a8150a337b1ccd99ff6e8797d42882089050837f0dc8fad6d9e4b35f5ed9a3d186b79ce38e0e8a8d1b58b132d701d4eecf68d1f683089150837f1bcd95ffc211fbca600f705fad3fb567ea4eb378f62e1fec97805518a47e4d9c8408925083818180828009800909905083828180828009800909915083838180828009800909925062000432600052620025ba565b837f10520b0ab721cadfe9eff81b016fc34dc76da36c2578937817cb978d069de55982089050837f1f6d48149b8e7f7d9b257d8ed5fbbaf42932498075fed0ace88a9eb81f5627f683089150837f1d9655f652309014d29e00ef35a2089bfff8dc1c816f0dc9ca34bdb5460c870584089250838181808280098009099050620004bd600052620025ba565b837f04df5a56ff95bcafb051f7b1cd43a99ba731ff67e47032058fe3d4185697cc7d82089050837f0672d995f8fff640151b3d290cedaf148690a10a8c8424a7f6ec282b6e4be82883089150837f099952b414884454b21200d7ffafdd5f0c9a9dcc06f2708e9fc1d8209b5c75b98408925083818180828009800909905062000548600052620025ba565b837f052cba2255dfd00c7c483143ba8d469448e43586a9b4cd9183fd0e843a6b9fa682089050837f0b8badee690adb8eb0bd74712b7999af82de55707251ad7716077cb93c464ddc83089150837f119b1590f13307af5a1ee651020c07c749c15d60683a8050b963d0a8e4b2bdd184089250838181808280098009099050620005d3600052620025ba565b837f03150b7cd6d5d17b2529d36be0f67b832c4acfc884ef4ee5ce15be0bfb4a8d0982089050837f2cc6182c5e14546e3cf1951f173912355374efb83d80898abe69cb317c9ea56583089150837f005032551e6378c450cfe129a404b3764218cadedac14e2b92d2cd73111bf0f9840892508381818082800980090990506200065e600052620025ba565b837f233237e3289baa34bb147e972ebcb9516469c399fcc069fb88f9da2cc28276b582089050837f05c8f4f4ebd4a6e3c980d31674bfbe6323037f21b34ae5a4e80c2d4c24d6028083089150837f0a7b1db13042d396ba05d818a319f25252bcf35ef3aeed91ee1f09b2590fc65b84089250838181808280098009099050620006e9600052620025ba565b837f2a73b71f9b210cf5b14296572c9d32dbf156e2b086ff47dc5df542365a404ec082089050837f1ac9b0417abcc9a1935107e9ffc91dc3ec18f2c4dbe7f22976a760bb5c50c46083089150837f12c0339ae08374823fabb076707ef479269f3e4d6cb104349015ee046dc93fc08408925083818180828009800909905062000774600052620025ba565b837f0b7475b102a165ad7f5b18db4e1e704f52900aa3253baac68246682e56e9a28e82089050837f037c2849e191ca3edb1c5e49f6e8b8917c843e379366f2ea32ab3aa88d7f844883089150837f05a6811f8556f014e92674661e217e9bd5206c5c93a07dc145fdb176a716346f84089250838181808280098009099050620007ff600052620025ba565b837f29a795e7d98028946e947b75d54e9f044076e87a7b2883b47b675ef5f38bd66e82089050837f20439a0c84b322eb45a3857afc18f5826e8c7382c8a1585c507be199981fd22f83089150837f2e0ba8d94d9ecf4a94ec2050c7371ff1bb50f27799a84b6d4a2a6f2a0982c887840892508381818082800980090990506200088a600052620025ba565b837f143fd115ce08fb27ca38eb7cce822b4517822cd2109048d2e6d0ddcca17d71c882089050837f0c64cbecb1c734b857968dbbdcf813cdf8611659323dbcbfc84323623be9caf183089150837f028a305847c683f646fca925c163ff5ae74f348d62c2b670f1426cef9403da538408925083818180828009800909905062000915600052620025ba565b837f2e4ef510ff0b6fda5fa940ab4c4380f26a6bcb64d89427b824d6755b5db9e30c82089050837f0081c95bc43384e663d79270c956ce3b8925b4f6d033b078b96384f50579400e83089150837f2ed5f0c91cbd9749187e2fade687e05ee2491b349c039a0bba8a9f4023a0bb3884089250838181808280098009099050620009a0600052620025ba565b837f30509991f88da3504bbf374ed5aae2f03448a22c76234c8c990f01f33a73520682089050837f1c3f20fd55409a53221b7c4d49a356b9f0a1119fb2067b41a7529094424ec6ad83089150837f10b4e7f3ab5df003049514459b6e18eec46bb2213e8e131e170887b47ddcb96c8408925083818180828009800909905062000a2b600052620025ba565b837f2a1982979c3ff7f43ddd543d891c2abddd80f804c077d775039aa3502e43adef82089050837f1c74ee64f15e1db6feddbead56d6d55dba431ebc396c9af95cad0f1315bd5c9183089150837f07533ec850ba7f98eab9303cace01b4b9e4f2e8b82708cfa9c2fe45a0ae146a08408925083818180828009800909905062000ab6600052620025ba565b837f21576b438e500449a151e4eeaf17b154285c68f42d42c1808a11abf3764c075082089050837f2f17c0559b8fe79608ad5ca193d62f10bce8384c815f0906743d6930836d4a9e83089150837f2d477e3862d07708a79e8aae946170bc9775a4201318474ae665b0b1b7e2730e8408925083818180828009800909905062000b41600052620025ba565b837f162f5243967064c390e095577984f291afba2266c38f5abcd89be0f5b2747eab82089050837f2b4cb233ede9ba48264ecd2c8ae50d1ad7a8596a87f29f8a7777a7009239331183089150837f2c8fbcb2dd8573dc1dbaf8f4622854776db2eece6d85c4cf4254e7c35e03b07a8408925083818180828009800909905062000bcc600052620025ba565b837f1d6f347725e4816af2ff453f0cd56b199e1b61e9f601e9ade5e88db870949da982089050837f204b0c397f4ebe71ebc2d8b3df5b913df9e6ac02b68d31324cd49af5c456552983089150837f0c4cb9dc3c4fd8174f1149b3c63c3c2f9ecb827cd7dc25534ff8fb75bc79c5028408925083818180828009800909905062000c57600052620025ba565b837f174ad61a1448c899a25416474f4930301e5c49475279e0639a616ddc45bc7b5482089050837f1a96177bcf4d8d89f759df4ec2f3cde2eaaa28c177cc0fa13a9816d49a38d2ef83089150837f066d04b24331d71cd0ef8054bc60c4ff05202c126a233c1a8242ace360b8a30a8408925083818180828009800909905062000ce2600052620025ba565b837f2a4c4fc6ec0b0cf52195782871c6dd3b381cc65f72e02ad527037a62aa1bd80482089050837f13ab2d136ccf37d447e9f2e14a7cedc95e727f8446f6d9d7e55afc01219fd64983089150837f1121552fca26061619d24d843dc82769c1b04fcec26f55194c2e3e869acc6a9a8408925083818180828009800909905062000d6d600052620025ba565b837f00ef653322b13d6c889bc81715c37d77a6cd267d595c4a8909a5546c7c97cff182089050837f0e25483e45a665208b261d8ba74051e6400c776d652595d9845aca35d8a397d383089150837f29f536dcb9dd7682245264659e15d88e395ac3d4dde92d8c46448db979eeba898408925083818180828009800909905062000df8600052620025ba565b837f2a56ef9f2c53febadfda33575dbdbd885a124e2780bbea170e456baace0fa5be82089050837f1c8361c78eb5cf5decfb7a2d17b5c409f2ae2999a46762e8ee416240a8cb9af183089150837f151aff5f38b20a0fc0473089aaf0206b83e8e68a764507bfd3d0ab4be74319c58408925083818180828009800909905062000e83600052620025ba565b837f04c6187e41ed881dc1b239c88f7f9d43a9f52fc8c8b6cdd1e76e47615b51f10082089050837f13b37bd80f4d27fb10d84331f6fb6d534b81c61ed15776449e801b7ddc9c296783089150837f01a5c536273c2d9df578bfbd32c17b7a2ce3664c2a52032c9321ceb1c4e8a8e48408925083818180828009800909905062000f0e600052620025ba565b837f2ab3561834ca73835ad05f5d7acb950b4a9a2c666b9726da832239065b7c3b0282089050837f1d4d8ec291e720db200fe6d686c0d613acaf6af4e95d3bf69f7ed516a597b64683089150837f041294d2cc484d228f5784fe7919fd2bb925351240a04b711514c9c80b65af1d8408925083818180828009800909905062000f99600052620025ba565b837f154ac98e01708c611c4fa715991f004898f57939d126e392042971dd90e81fc682089050837f0b339d8acca7d4f83eedd84093aef51050b3684c88f8b0b04524563bc6ea4da483089150837f0955e49e6610c94254a4f84cfbab344598f0e71eaff4a7dd81ed95b50839c82e8408925083818180828009800909905062001024600052620025ba565b837f06746a6156eba54426b9e22206f15abca9a6f41e6f535c6f3525401ea065462682089050837f0f18f5a0ecd1423c496f3820c549c27838e5790e2bd0a196ac917c7ff32077fb83089150837f04f6eeca1751f7308ac59eff5beb261e4bb563583ede7bc92a738223d6f76e1384089250838181808280098009099050620010af600052620025ba565b837f2b56973364c4c4f5c1a3ec4da3cdce038811eb116fb3e45bc1768d26fc0b375882089050837f123769dd49d5b054dcd76b89804b1bcb8e1392b385716a5d83feb65d437f29ef83089150837f2147b424fc48c80a88ee52b91169aacea989f6446471150994257b2fb01c63e9840892508381818082800980090990506200113a600052620025ba565b837f0fdc1f58548b85701a6c5505ea332a29647e6f34ad4243c2ea54ad897cebe54d82089050837f12373a8251fea004df68abcf0f7786d4bceff28c5dbbe0c3944f685cc0a0b1f283089150837f21e4f4ea5f35f85bad7ea52ff742c9e8a642756b6af44203dd8a1f35c1a9003584089250838181808280098009099050620011c5600052620025ba565b837f16243916d69d2ca3dfb4722224d4c462b57366492f45e90d8a81934f1bc3b14782089050837f1efbe46dd7a578b4f66f9adbc88b4378abc21566e1a0453ca13a4159cac04ac283089150837f07ea5e8537cf5dd08886020e23a7f387d468d5525be66f853b672cc96a88969a8408925083818180828009800909905062001250600052620025ba565b837f05a8c4f9968b8aa3b7b478a30f9a5b63650f19a75e7ce11ca9fe16c0b76c00bc82089050837f20f057712cc21654fbfe59bd345e8dac3f7818c701b9c7882d9d57b72a32e83f83089150837f04a12ededa9dfd689672f8c67fee31636dcd8e88d01d49019bd90b33eb33db6984089250838181808280098009099050620012db600052620025ba565b837f27e88d8c15f37dcee44f1e5425a51decbd136ce5091a6767e49ec9544ccd101a82089050837f2feed17b84285ed9b8a5c8c5e95a41f66e096619a7703223176c41ee433de4d183089150837f1ed7cc76edf45c7c404241420f729cf394e5942911312a0d6972b8bd53aff2b88408925083818180828009800909905062001366600052620025ba565b837f15742e99b9bfa323157ff8c586f5660eac6783476144cdcadf2874be45466b1a82089050837f1aac285387f65e82c895fc6887ddf40577107454c6ec0317284f033f27d0c78583089150837f25851c3c845d4790f9ddadbdb6057357832e2e7a49775f71ec75a96554d67c7784089250838181808280098009099050620013f1600052620025ba565b837f15a5821565cc2ec2ce78457db197edf353b7ebba2c5523370ddccc3d9f146a6782089050837f2411d57a4813b9980efa7e31a1db5966dcf64f36044277502f15485f28c7172783089150837f002e6f8d6520cd4713e335b8c0b6d2e647e9a98e12f4cd2558828b5ef6cb4c9b840892508381818082800980090990506200147c600052620025ba565b837f2ff7bc8f4380cde997da00b616b0fcd1af8f0e91e2fe1ed7398834609e0315d282089050837f00b9831b948525595ee02724471bcd182e9521f6b7bb68f1e93be4febb0d3cbe83089150837f0a2f53768b8ebf6a86913b0e57c04e011ca408648a4743a87d77adbf0c9c35128408925083818180828009800909905062001507600052620025ba565b837f00248156142fd0373a479f91ff239e960f599ff7e94be69b7f2a290305e1198d82089050837f171d5620b87bfb1328cf8c02ab3f0c9a397196aa6a542c2350eb512a2b2bcda983089150837f170a4f55536f7dc970087c7c10d6fad760c952172dd54dd99d1045e4ec34a8088408925083818180828009800909905062001592600052620025ba565b837f29aba33f799fe66c2ef3134aea04336ecc37e38c1cd211ba482eca17e2dbfae182089050837f1e9bc179a4fdd758fdd1bb1945088d47e70d114a03f6a0e8b5ba650369e6497383089150837f1dd269799b660fad58f7f4892dfb0b5afeaad869a9c4b44f9c9e1c43bdaf8f09840892508381818082800980090990506200161d600052620025ba565b837f22cdbc8b70117ad1401181d02e15459e7ccd426fe869c7c95d1dd2cb0f24af3882089050837f0ef042e454771c533a9f57a55c503fcefd3150f52ed94a7cd5ba93b9c7dacefd83089150837f11609e06ad6c8fe2f287f3036037e8851318e8b08a0359a03b304ffca62e828484089250838181808280098009099050620016a8600052620025ba565b837f1166d9e554616dba9e753eea427c17b7fecd58c076dfe42708b08f5b783aa9af82089050837f2de52989431a859593413026354413db177fbf4cd2ac0b56f855a888357ee46683089150837f3006eb4ffc7a85819a6da492f3a8ac1df51aee5b17b8e89d74bf01cf5f71e9ad8408925083818180828009800909905062001733600052620025ba565b837f2af41fbb61ba8a80fdcf6fff9e3f6f422993fe8f0a4639f962344c822514508682089050837f119e684de476155fe5a6b41a8ebc85db8718ab27889e85e781b214bace4827c383089150837f1835b786e2e8925e188bea59ae363537b51248c23828f047cff784b97b3fd80084089250838181808280098009099050620017be600052620025ba565b837f28201a34c594dfa34d794996c6433a20d152bac2a7905c926c40e285ab32eeb682089050837f083efd7a27d1751094e80fefaf78b000864c82eb571187724a761f88c22cc4e783089150837f0b6f88a3577199526158e61ceea27be811c16df7774dd8519e079564f61fd13b8408925083818180828009800909905062001849600052620025ba565b837f0ec868e6d15e51d9644f66e1d6471a94589511ca00d29e1014390e6ee4254f5b82089050837f2af33e3f866771271ac0c9b3ed2e1142ecd3e74b939cd40d00d937ab84c9859183089150837f0b520211f904b5e7d09b5d961c6ace7734568c547dd6858b364ce5e47951f17884089250838181808280098009099050620018d4600052620025ba565b837f0b2d722d0919a1aad8db58f10062a92ea0c56ac4270e822cca228620188a1d4082089050837f1f790d4d7f8cf094d980ceb37c2453e957b54a9991ca38bbe0061d1ed6e562d483089150837f0171eb95dfbf7d1eaea97cd385f780150885c16235a2a6a8da92ceb01e504233840892508381818082800980090990506200195f600052620025ba565b837f0c2d0e3b5fd57549329bf6885da66b9b790b40defd2c8650762305381b16887382089050837f1162fb28689c27154e5a8228b4e72b377cbcafa589e283c35d3803054407a18d83089150837f2f1459b65dee441b64ad386a91e8310f282c5a92a89e19921623ef8249711bc084089250838181808280098009099050620019ea600052620025ba565b837f1e6ff3216b688c3d996d74367d5cd4c1bc489d46754eb712c243f70d1b53cfbb82089050837f01ca8be73832b8d0681487d27d157802d741a6f36cdc2a0576881f932647887583089150837f1f7735706ffe9fc586f976d5bdf223dc680286080b10cea00b9b5de315f9650e8408925083818180828009800909905062001a75600052620025ba565b837f2522b60f4ea3307640a0c2dce041fba921ac10a3d5f096ef4745ca838285f01982089050837f23f0bee001b1029d5255075ddc957f833418cad4f52b6c3f8ce16c235572575b83089150837f2bc1ae8b8ddbb81fcaac2d44555ed5685d142633e9df905f66d9401093082d598408925083818180828009800909905062001b00600052620025ba565b837f0f9406b8296564a37304507b8dba3ed162371273a07b1fc98011fcd6ad72205f82089050837f2360a8eb0cc7defa67b72998de90714e17e75b174a52ee4acb126c8cd995f0a883089150837f15871a5cddead976804c803cbaef255eb4815a5e96df8b006dcbbc2767f889488408925083818180828009800909905062001b8b600052620025ba565b837f193a56766998ee9e0a8652dd2f3b1da0362f4f54f72379544f957ccdeefb420f82089050837f2a394a43934f86982f9be56ff4fab1703b2e63c8ad334834e4309805e777ae0f83089150837f1859954cfeb8695f3e8b635dcb345192892cd11223443ba7b4166e8876c0d1428408925083818180828009800909905062001c16600052620025ba565b837f04e1181763050e58013444dbcb99f1902b11bc25d90bbdca408d3819f4fed32b82089050837f0fdb253dee83869d40c335ea64de8c5bb10eb82db08b5e8b1f5e5552bfd05f2383089150837f058cbe8a9a5027bdaa4efb623adead6275f08686f1c08984a9d7c5bae9b4f1c08408925083818180828009800909905062001ca1600052620025ba565b837f1382edce9971e186497eadb1aeb1f52b23b4b83bef023ab0d15228b4cceca59a82089050837f03464990f045c6ee0819ca51fd11b0be7f61b8eb99f14b77e1e6634601d9e8b583089150837f23f7bfc8720dc296fff33b41f98ff83c6fcab4605db2eb5aaa5bc137aeb70a588408925083818180828009800909905062001d2c600052620025ba565b837f0a59a158e3eec2117e6e94e7f0e9decf18c3ffd5e1531a9219636158bbaf62f282089050837f06ec54c80381c052b58bf23b312ffd3ce2c4eba065420af8f4c23ed0075fd07b83089150837f118872dc832e0eb5476b56648e867ec8b09340f7a7bcb1b4962f0ff9ed1f9d018408925083818180828009800909905062001db7600052620025ba565b837f13d69fa127d834165ad5c7cba7ad59ed52e0b0f0e42d7fea95e1906b520921b182089050837f169a177f63ea681270b1c6877a73d21bde143942fb71dc55fd8a49f19f10c77b83089150837f04ef51591c6ead97ef42f287adce40d93abeb032b922f66ffb7e9a5a7450544d8408925083818180828009800909905062001e42600052620025ba565b837f256e175a1dc079390ecd7ca703fb2e3b19ec61805d4f03ced5f45ee6dd0f69ec82089050837f30102d28636abd5fe5f2af412ff6004f75cc360d3205dd2da002813d3e2ceeb283089150837f10998e42dfcd3bbf1c0714bc73eb1bf40443a3fa99bef4a31fd31be182fcc7928408925083818180828009800909905062001ecd600052620025ba565b837f193edd8e9fcf3d7625fa7d24b598a1d89f3362eaf4d582efecad76f879e3686082089050837f18168afd34f2d915d0368ce80b7b3347d1c7a561ce611425f2664d7aa51f0b5d83089150837f29383c01ebd3b6ab0c017656ebe658b6a328ec77bc33626e29e2e95b33ea61118408925083818180828009800909905062001f58600052620025ba565b837f10646d2f2603de39a1f4ae5e7771a64a702db6e86fb76ab600bf573f9010c71182089050837f0beb5e07d1b27145f575f1395a55bf132f90c25b40da7b3864d0242dcb1117fb83089150837f16d685252078c133dc0d3ecad62b5c8830f95bb2e54b59abdffbf018d96fa3368408925083818180828009800909905062001fe3600052620025ba565b837f0a6abd1d833938f33c74154e0404b4b40a555bbbec21ddfafd672dd62047f01a82089050837f1a679f5d36eb7b5c8ea12a4c2dedc8feb12dffeec450317270a6f19b34cf186083089150837f0980fb233bd456c23974d50e0ebfde4726a423eada4e8f6ffbc7592e3f1b93d6840892508381818082800980090990506200206e600052620025ba565b837f161b42232e61b84cbf1810af93a38fc0cece3d5628c9282003ebacb5c312c72b82089050837f0ada10a90c7f0520950f7d47a60d5e6a493f09787f1564e5d09203db47de1a0b83089150837f1a730d372310ba82320345a29ac4238ed3f07a8a2b4e121bb50ddb9af407f45184089250838181808280098009099050620020f9600052620025ba565b837f2c8120f268ef054f817064c369dda7ea908377feaba5c4dffbda10ef58e8c55682089050837f1c7c8824f758753fa57c00789c684217b930e95313bcb73e6e7b8649a4968f7083089150837f2cd9ed31f5f8691c8e39e4077a74faa0f400ad8b491eb3f7b47b27fa3fd1cf778408925083818180828009800909905062002184600052620025ba565b837f23ff4f9d46813457cf60d92f57618399a5e022ac321ca550854ae23918a22eea82089050837f09945a5d147a4f66ceece6405dddd9d0af5a2c5103529407dff1ea58f180426d83089150837f188d9c528025d4c2b67660c6b771b90f7c7da6eaa29d3f268a6dd223ec6fc630840892508381818082800980090990506200220f600052620025ba565b837f3050e37996596b7f81f68311431d8734dba7d926d3633595e0c0d8ddf4f0f47f82089050837f15af1169396830a91600ca8102c35c426ceae5461e3f95d89d829518d30afd7883089150837f1da6d09885432ea9a06d9f37f873d985dae933e351466b2904284da3320d8acc840892508381818082800980090990506200229a600052620025ba565b837f2796ea90d269af29f5f8acf33921124e4e4fad3dbe658945e546ee411ddaa9cb82089050837f202d7dd1da0f6b4b0325c8b3307742f01e15612ec8e9304a7cb0319e01d32d6083089150837f096d6790d05bb759156a952ba263d672a2d7f9c788f4c831a29dace4c0f8be5f8408925083818180828009800909905062002325600052620025ba565b837f054efa1f65b0fce283808965275d877b438da23ce5b13e1963798cb1447d25a482089050837f1b162f83d917e93edb3308c29802deb9d8aa690113b2e14864ccf6e18e4165f183089150837f21e5241e12564dd6fd9f1cdd2a0de39eedfefc1466cc568ec5ceb745a0506edc84089250838181808280098009099050838281808280098009099150838381808280098009099250620023c8600052620025ba565b837f1cfb5662e8cf5ac9226a80ee17b36abecb73ab5f87e161927b4349e10e4bdf0882089050837f0f21177e302a771bbae6d8d1ecb373b62c99af346220ac0129c53f666eb2410083089150837f1671522374606992affb0dd7f71b12bec4236aede6290546bcef7e1f515c2320840892508381818082800980090990508382818082800980090991508383818082800980090992506200246b600052620025ba565b837f0fa3ec5b9488259c2eb4cf24501bfad9be2ec9e42c5cc8ccd419d2a692cad87082089050837f193c0e04e0bd298357cb266c1506080ed36edce85c648cc085e8c57b1ab54bba83089150837f102adf8ef74735a27e9128306dcbc3c99f6f7291cd406578ce14ea2adaba68f8840892508381818082800980090990508382818082800980090991508383818082800980090992506200250e600052620025ba565b837f0fe0af7858e49859e2a54d6f1ad945b1316aa24bfbdd23ae40a6d0cb70c3eab182089050837f216f6717bbc7dedb08536a2220843f4e2da5f1daa9ebdefde8a5ea7344798d2283089150837f1da55cc900f0d21f4a3e694391918a1b3c23b2ac773c6b3ef88e2e422832516184089250838181808280098009099050838281808280098009099150838381808280098009099250620025b1600052620025ba565b60005260206000f35b8360205182098460405184098591088460605185098591088460805183098560a05185098691088560c05186098691088560e0518409866101005186098791088661012051870987910894509250905060005156", - "key": "0x7cb5c2b5a0b80e4fad4cf89bdd73a61db77d1c6dc957bae688b8b7bba3f76422" + "key": "0xf4287fed167fec7954bb399166ce3d71ff3403537a3670b1b2d199d0048c9a44" }, "0x9a676e781a523b5d0c0e43731313a708cb607508": { "balance": "0", @@ -334,8 +410,8 @@ "balance": "0", "nonce": 1, "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "0xf54798ae0066be6ba7437ac68dadc944cb939a7015704b8c2e8f30da801209f4", - "code": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806312e64a7214610046578063c423b1e81461006e578063dc8b50381461008f575b600080fd5b6100596100543660046117b2565b6100db565b60405190151581526020015b60405180910390f35b61008161007c366004611827565b6101a6565b6040516100659291906118f1565b6100b67f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b181565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610065565b6040517fc423b1e800000000000000000000000000000000000000000000000000000000815260009081908190309063c423b1e890610122908a908990899060040161190c565b600060405180830381865afa15801561013f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610185919081019061199c565b9150915081801561019b575061019b868261074b565b979650505050505050565b600060606002845110156102275760405162461bcd60e51b815260206004820152602960248201527f5a4b4d65726b6c65547269653a2070726f76696465642070726f6f662069732060448201527f746f6f2073686f7274000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61027e84600186516102399190611a5d565b8151811061024957610249611a74565b602002602001015180516020909101207f950654da67865a81bc70e45f3230f5179f08e29c66184bf746f71050f117b3b81490565b6102f05760405162461bcd60e51b815260206004820152602d60248201527f5a4b4d65726b6c65547269653a20746865206c617374206974656d206973206e60448201527f6f74206d61676963206861736800000000000000000000000000000000000000606482015260840161021e565b60006102fb86610767565b9050600061030886610846565b90506103526040805161010081019091528060008152600060208201819052604082018190526060808301829052608083015260a0820181905260c0820181905260e09091015290565b60408051602081019091526000808252835190918291829190829061037990600290611a5d565b90505b86818151811061038e5761038e611a74565b6020026020010151602001519550600060038111156103af576103af611aa3565b865160038111156103c2576103c2611aa3565b036104a05760006103d38983610939565b90508015610433578660200151861461042e5760405162461bcd60e51b815260206004820152601b60248201527f5a4b4d65726b6c65547269653a20696e76616c6964206b6579204c0000000000604482015260640161021e565b610486565b866040015186146104865760405162461bcd60e51b815260206004820152601b60248201527f5a4b4d65726b6c65547269653a20696e76616c6964206b657920520000000000604482015260640161021e565b61049887602001518860400151610996565b9550506106b5565b6001865160038111156104b5576104b5611aa3565b0361061857831580156104c6575082155b6105385760405162461bcd60e51b815260206004820152602660248201527f5a4b4d65726b6c65547269653a206475706c696361746564207465726d696e6160448201527f6c206e6f64650000000000000000000000000000000000000000000000000000606482015260840161021e565b87866060015114935083156107385761056b600160001b87606001516105668960a001518a60800151610a63565b610bff565b6080870151805160208102825260e0890151929750909350839115610611578e8860e00151148061059f5750898860e00151145b6106115760405162461bcd60e51b815260206004820152602260248201527f5a4b4d65726b6c65547269653a20696e76616c6964206b657920707265696d6160448201527f6765000000000000000000000000000000000000000000000000000000000000606482015260840161021e565b50506106b5565b60028651600381111561062d5761062d611aa3565b036106b5578315801561063e575082155b6106b05760405162461bcd60e51b815260206004820152602660248201527f5a4b4d65726b6c65547269653a206475706c696361746564207465726d696e6160448201527f6c206e6f64650000000000000000000000000000000000000000000000000000606482015260840161021e565b600192505b80600003610711578a851461070c5760405162461bcd60e51b815260206004820152601960248201527f5a4b4d65726b65547269653a20696e76616c696420726f6f7400000000000000604482015260640161021e565b610738565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161037c565b50919b919a509098505050505050505050565b6000818051906020012083805190602001201490505b92915050565b600080600061077584610d77565b6040805180820182528381526020810183905290517f299e566000000000000000000000000000000000000000000000000000000000815292945090925073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b1169163299e5660916107fd91600401611ad2565b602060405180830381865afa15801561081a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083e9190611b03565b949350505050565b805160609060008167ffffffffffffffff811115610866576108666115f9565b60405190808252806020026020018201604052801561089f57816020015b61088c61159a565b8152602001906001900390816108845790505b50905060005b6108b0600184611a5d565b8110156109315760006108db8683815181106108ce576108ce611a74565b6020026020010151610d9f565b905060405180604001604052808784815181106108fa576108fa611a74565b602002602001015181526020018281525083838151811061091d5761091d611a74565b6020908102919091010152506001016108a5565b509392505050565b6000610100821061098c5760405162461bcd60e51b815260206004820152601c60248201527f5a4b4d65726b6c65547269653a20746f6f206c6f6e6720646570746800000000604482015260640161021e565b506001901b161590565b6040805180820182528381526020810183905290517f299e566000000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b1169163299e566091610a1b91600401611ad2565b602060405180830381865afa158015610a38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5c9190611b03565b9392505050565b6000600182511015610add5760405162461bcd60e51b815260206004820152602b60248201527f5a4b547269654861736865723a20746f6f206665772076616c75657320666f7260448201527f205f76616c756548617368000000000000000000000000000000000000000000606482015260840161021e565b6000825167ffffffffffffffff811115610af957610af96115f9565b604051908082528060200260200182016040528015610b22578160200160208202803683370190505b50905060005b8351811015610bc8576001811b851663ffffffff1615610b8757610b64848281518110610b5757610b57611a74565b6020026020010151610767565b828281518110610b7657610b76611a74565b602002602001018181525050610bc0565b838181518110610b9957610b99611a74565b6020026020010151828281518110610bb357610bb3611a74565b6020026020010181815250505b600101610b28565b50600283511015610bf65780600081518110610be657610be6611a74565b6020026020010151915050610761565b61083e81611122565b6040805180820182528481526020810184905290517f299e56600000000000000000000000000000000000000000000000000000000081526000917f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b19173ffffffffffffffffffffffffffffffffffffffff83169163299e566091610c879190600401611ad2565b602060405180830381865afa158015610ca4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc89190611b03565b6040805180820182528281526020810186905290517f299e566000000000000000000000000000000000000000000000000000000000815291965073ffffffffffffffffffffffffffffffffffffffff83169163299e566091610d2d91600401611ad2565b602060405180830381865afa158015610d4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6e9190611b03565b95945050505050565b60008082608081901b610d8a8260801c90565b610d948260801c90565b935093505050915091565b60408051610100810182526000808252602082018190529181018290526060808201839052608082015260a0810182905260c0810182905260e081019190915260408051610100810182526000808252602082018190529181018290526060808201839052608082015260a0810182905260c0810182905260e08101919091526000610e53846040805180820182526060815260006020918201528151808301909252828101825291519181019190915290565b90506000610e608261130c565b60ff16905080610e8b57610e7382611393565b6020840152610e8182611393565b60408401526110de565b6001810361101857610e9c82611393565b6060840152600080610ead84611431565b60ff16915091508163ffffffff166001148015610eca5750806001145b80610ee657508163ffffffff166004148015610ee65750806004145b610f585760405162461bcd60e51b815260206004820152602360248201527f4e6f64655265616465723a20696e76616c696420636f6d70726573736564466c60448201527f6167730000000000000000000000000000000000000000000000000000000000606482015260840161021e565b63ffffffff821660a08601528067ffffffffffffffff811115610f7d57610f7d6115f9565b604051908082528060200260200182016040528015610fa6578160200160208202803683370190505b50608086015260005b81811015610fe957610fc085611393565b86608001518281518110610fd657610fd6611a74565b6020908102919091010152600101610faf565b506000610ff58561130c565b60ff16905080156110105761100a85826114cb565b60e08701525b5050506110de565b600281146110de57600381036110965760405162461bcd60e51b815260206004820152602560248201527f4e6f64655265616465723a20756e657870656374656420726f6f74206e6f646560448201527f2074797065000000000000000000000000000000000000000000000000000000606482015260840161021e565b60405162461bcd60e51b815260206004820152601d60248201527f4e6f64655265616465723a20696e76616c6964206e6f64652074797065000000604482015260640161021e565b8060038111156110f0576110f0611aa3565b8390600381111561110357611103611aa3565b9081600381111561111657611116611aa3565b90525091949350505050565b600060048251101561119c5760405162461bcd60e51b815260206004820152602b60248201527f5a4b547269654861736865723a20746f6f206665772076616c75657320666f7260448201527f205f68617368456c656d73000000000000000000000000000000000000000000606482015260840161021e565b81517f000000000000000000000000959922be3caee4b8cd9a407cc3ac1c251c2007b19060009081906001906002905b808310156112e457600094505b808510156112d6578285019350808410156112cd578573ffffffffffffffffffffffffffffffffffffffff1663299e566060405180604001604052808b898151811061122757611227611a74565b602002602001015181526020018b888151811061124657611246611a74565b60200260200101518152506040518263ffffffff1660e01b815260040161126d9190611ad2565b602060405180830381865afa15801561128a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112ae9190611b03565b8886815181106112c0576112c0611a74565b6020026020010181815250505b938101936111d9565b909150600182901b906111cc565b876000815181106112f7576112f7611a74565b60200260200101519650505050505050919050565b60006001826020015110156113635760405162461bcd60e51b815260206004820152601f60248201527f4e6f64655265616465723a20746f6f2073686f727420666f722075696e743800604482015260640161021e565b81518051600180830180865260208601805191949360f81c9291611388908390611a5d565b905250949350505050565b60006020826020015110156114105760405162461bcd60e51b815260206004820152602160248201527f4e6f64655265616465723a20746f6f2073686f727420666f722062797465733360448201527f3200000000000000000000000000000000000000000000000000000000000000606482015260840161021e565b81518051602080830180865281860180519194939291611388908390611a5d565b6000806004836020015110156114895760405162461bcd60e51b815260206004820181905260248201527f4e6f64655265616465723a20746f6f2073686f727420666f722075696e743332604482015260640161021e565b8251805160048083018087526020870180519194939260f084901c9260f885901c92906114b7908390611a5d565b90525060ff90911697909650945050505050565b600081836020015110156115475760405162461bcd60e51b815260206004820152602160248201527f4e6f64655265616465723a20746f6f2073686f727420666f72206e206279746560448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161021e565b825160609060008061155a866008611b1c565b61156690610100611a5d565b8351848801808a5260208a01805191975091831c9450919250879161158c908390611a5d565b905250909695505050505050565b6040518060400160405280606081526020016115f46040805161010081019091528060008152600060208201819052604082018190526060808301829052608083015260a0820181905260c0820181905260e09091015290565b905290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561166f5761166f6115f9565b604052919050565b600067ffffffffffffffff821115611691576116916115f9565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f8301126116ce57600080fd5b81356116e16116dc82611677565b611628565b8181528460208386010111156116f657600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f83011261172457600080fd5b8135602067ffffffffffffffff80831115611741576117416115f9565b8260051b611750838201611628565b938452858101830193838101908886111561176a57600080fd5b84880192505b858310156117a6578235848111156117885760008081fd5b6117968a87838c01016116bd565b8352509184019190840190611770565b98975050505050505050565b600080600080608085870312156117c857600080fd5b84359350602085013567ffffffffffffffff808211156117e757600080fd5b6117f3888389016116bd565b9450604087013591508082111561180957600080fd5b5061181687828801611713565b949793965093946060013593505050565b60008060006060848603121561183c57600080fd5b83359250602084013567ffffffffffffffff81111561185a57600080fd5b61186686828701611713565b925050604084013590509250925092565b60005b8381101561189257818101518382015260200161187a565b838111156118a1576000848401525b50505050565b600081518084526118bf816020860160208601611877565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b821515815260406020820152600061083e60408301846118a7565b600060608201858352602060608185015281865180845260808601915060808160051b870101935082880160005b82811015611986577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff808887030184526119748683516118a7565b9550928401929084019060010161193a565b5050505050604092909201929092529392505050565b600080604083850312156119af57600080fd5b825180151581146119bf57600080fd5b602084015190925067ffffffffffffffff8111156119dc57600080fd5b8301601f810185136119ed57600080fd5b80516119fb6116dc82611677565b818152866020838501011115611a1057600080fd5b611a21826020830160208601611877565b8093505050509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611a6f57611a6f611a2e565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60408101818360005b6002811015611afa578151835260209283019290910190600101611adb565b50505092915050565b600060208284031215611b1557600080fd5b5051919050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611b5457611b54611a2e565b50029056fea164736f6c634300080f000a", + "codeHash": "0x354b26999e434f8256d168395315e1f51fc15bf49bf2e6bb58fc549bd597e7da", + "code": "0x7c010000000000000000000000000000000000000000000000000000000060003504806329a5f2f6149063299e566014176200003757fe5b7f109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b6020527f16ed41e13bb9c0c66ae119424fddbcbc9314dc9fdbdeea55d6c64543dc4903e06040527f2b90bba00fca0589f617e7dcbfe82e0df706ab640ceb247b791a93b74e36736d6060527f2969f27eed31a480b9c36c764379dbca2cc8fdd1415c3dded62940bcde0bd7716080527f2e2419f9ec02ec394c9871c832963dc1b89d743c8c7b964029b2311687b1fe2360a0527f101071f0032379b697315876690f053d148d4e109f5fb065c8aacc55a0f89bfa60c0527f143021ec686a3f330d5f9e654638065ce6cd79e28c5b3753326244ee65a1b1a760e0527f176cc029695ad02582a70eff08a6fd99d057e12e58e7d7b6b16cdfabc8ee2911610100527f19a3fc0a56702bf417ba7fee3802593fa644470307043f7773279cd71d25d5e0610120527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000016024356004356000837f0ee9a592ba9a9518d05986d656f40c2114c4993c11bb29938d21d47304cd8e6e82089050837f00f1445235f2148c5986587169fc1bcd887b08d4d00868df5696fff40956e86483089150837f08dff3487e8ac99e1f29a058d0fa80b930c728730b7ab36ce879f3890ecf73f58408925083818180828009800909905083828180828009800909915083838180828009800909925062000249600052620025ba565b837f2f27be690fdaee46c3ce28f7532b13c856c35342c84bda6e20966310fadc01d082089050837f2b2ae1acf68b7b8d2416bebf3d4f6234b763fe04b8043ee48b8327bebca16cf283089150837f0319d062072bef7ecca5eac06f97d4d55952c175ab6b03eae64b44c7dbf11cfa84089250838181808280098009099050838281808280098009099150838381808280098009099250620002ec600052620025ba565b837f28813dcaebaeaa828a376df87af4a63bc8b7bf27ad49c6298ef7b387bf28526d82089050837f2727673b2ccbc903f181bf38e1c1d40d2033865200c352bc150928adddf9cb7883089150837f234ec45ca27727c2e74abd2b2a1494cd6efbd43e340587d6b8fb9e31e65cc632840892508381818082800980090990508382818082800980090991508383818082800980090992506200038f600052620025ba565b837f15b52534031ae18f7f862cb2cf7cf760ab10a8150a337b1ccd99ff6e8797d42882089050837f0dc8fad6d9e4b35f5ed9a3d186b79ce38e0e8a8d1b58b132d701d4eecf68d1f683089150837f1bcd95ffc211fbca600f705fad3fb567ea4eb378f62e1fec97805518a47e4d9c8408925083818180828009800909905083828180828009800909915083838180828009800909925062000432600052620025ba565b837f10520b0ab721cadfe9eff81b016fc34dc76da36c2578937817cb978d069de55982089050837f1f6d48149b8e7f7d9b257d8ed5fbbaf42932498075fed0ace88a9eb81f5627f683089150837f1d9655f652309014d29e00ef35a2089bfff8dc1c816f0dc9ca34bdb5460c870584089250838181808280098009099050620004bd600052620025ba565b837f04df5a56ff95bcafb051f7b1cd43a99ba731ff67e47032058fe3d4185697cc7d82089050837f0672d995f8fff640151b3d290cedaf148690a10a8c8424a7f6ec282b6e4be82883089150837f099952b414884454b21200d7ffafdd5f0c9a9dcc06f2708e9fc1d8209b5c75b98408925083818180828009800909905062000548600052620025ba565b837f052cba2255dfd00c7c483143ba8d469448e43586a9b4cd9183fd0e843a6b9fa682089050837f0b8badee690adb8eb0bd74712b7999af82de55707251ad7716077cb93c464ddc83089150837f119b1590f13307af5a1ee651020c07c749c15d60683a8050b963d0a8e4b2bdd184089250838181808280098009099050620005d3600052620025ba565b837f03150b7cd6d5d17b2529d36be0f67b832c4acfc884ef4ee5ce15be0bfb4a8d0982089050837f2cc6182c5e14546e3cf1951f173912355374efb83d80898abe69cb317c9ea56583089150837f005032551e6378c450cfe129a404b3764218cadedac14e2b92d2cd73111bf0f9840892508381818082800980090990506200065e600052620025ba565b837f233237e3289baa34bb147e972ebcb9516469c399fcc069fb88f9da2cc28276b582089050837f05c8f4f4ebd4a6e3c980d31674bfbe6323037f21b34ae5a4e80c2d4c24d6028083089150837f0a7b1db13042d396ba05d818a319f25252bcf35ef3aeed91ee1f09b2590fc65b84089250838181808280098009099050620006e9600052620025ba565b837f2a73b71f9b210cf5b14296572c9d32dbf156e2b086ff47dc5df542365a404ec082089050837f1ac9b0417abcc9a1935107e9ffc91dc3ec18f2c4dbe7f22976a760bb5c50c46083089150837f12c0339ae08374823fabb076707ef479269f3e4d6cb104349015ee046dc93fc08408925083818180828009800909905062000774600052620025ba565b837f0b7475b102a165ad7f5b18db4e1e704f52900aa3253baac68246682e56e9a28e82089050837f037c2849e191ca3edb1c5e49f6e8b8917c843e379366f2ea32ab3aa88d7f844883089150837f05a6811f8556f014e92674661e217e9bd5206c5c93a07dc145fdb176a716346f84089250838181808280098009099050620007ff600052620025ba565b837f29a795e7d98028946e947b75d54e9f044076e87a7b2883b47b675ef5f38bd66e82089050837f20439a0c84b322eb45a3857afc18f5826e8c7382c8a1585c507be199981fd22f83089150837f2e0ba8d94d9ecf4a94ec2050c7371ff1bb50f27799a84b6d4a2a6f2a0982c887840892508381818082800980090990506200088a600052620025ba565b837f143fd115ce08fb27ca38eb7cce822b4517822cd2109048d2e6d0ddcca17d71c882089050837f0c64cbecb1c734b857968dbbdcf813cdf8611659323dbcbfc84323623be9caf183089150837f028a305847c683f646fca925c163ff5ae74f348d62c2b670f1426cef9403da538408925083818180828009800909905062000915600052620025ba565b837f2e4ef510ff0b6fda5fa940ab4c4380f26a6bcb64d89427b824d6755b5db9e30c82089050837f0081c95bc43384e663d79270c956ce3b8925b4f6d033b078b96384f50579400e83089150837f2ed5f0c91cbd9749187e2fade687e05ee2491b349c039a0bba8a9f4023a0bb3884089250838181808280098009099050620009a0600052620025ba565b837f30509991f88da3504bbf374ed5aae2f03448a22c76234c8c990f01f33a73520682089050837f1c3f20fd55409a53221b7c4d49a356b9f0a1119fb2067b41a7529094424ec6ad83089150837f10b4e7f3ab5df003049514459b6e18eec46bb2213e8e131e170887b47ddcb96c8408925083818180828009800909905062000a2b600052620025ba565b837f2a1982979c3ff7f43ddd543d891c2abddd80f804c077d775039aa3502e43adef82089050837f1c74ee64f15e1db6feddbead56d6d55dba431ebc396c9af95cad0f1315bd5c9183089150837f07533ec850ba7f98eab9303cace01b4b9e4f2e8b82708cfa9c2fe45a0ae146a08408925083818180828009800909905062000ab6600052620025ba565b837f21576b438e500449a151e4eeaf17b154285c68f42d42c1808a11abf3764c075082089050837f2f17c0559b8fe79608ad5ca193d62f10bce8384c815f0906743d6930836d4a9e83089150837f2d477e3862d07708a79e8aae946170bc9775a4201318474ae665b0b1b7e2730e8408925083818180828009800909905062000b41600052620025ba565b837f162f5243967064c390e095577984f291afba2266c38f5abcd89be0f5b2747eab82089050837f2b4cb233ede9ba48264ecd2c8ae50d1ad7a8596a87f29f8a7777a7009239331183089150837f2c8fbcb2dd8573dc1dbaf8f4622854776db2eece6d85c4cf4254e7c35e03b07a8408925083818180828009800909905062000bcc600052620025ba565b837f1d6f347725e4816af2ff453f0cd56b199e1b61e9f601e9ade5e88db870949da982089050837f204b0c397f4ebe71ebc2d8b3df5b913df9e6ac02b68d31324cd49af5c456552983089150837f0c4cb9dc3c4fd8174f1149b3c63c3c2f9ecb827cd7dc25534ff8fb75bc79c5028408925083818180828009800909905062000c57600052620025ba565b837f174ad61a1448c899a25416474f4930301e5c49475279e0639a616ddc45bc7b5482089050837f1a96177bcf4d8d89f759df4ec2f3cde2eaaa28c177cc0fa13a9816d49a38d2ef83089150837f066d04b24331d71cd0ef8054bc60c4ff05202c126a233c1a8242ace360b8a30a8408925083818180828009800909905062000ce2600052620025ba565b837f2a4c4fc6ec0b0cf52195782871c6dd3b381cc65f72e02ad527037a62aa1bd80482089050837f13ab2d136ccf37d447e9f2e14a7cedc95e727f8446f6d9d7e55afc01219fd64983089150837f1121552fca26061619d24d843dc82769c1b04fcec26f55194c2e3e869acc6a9a8408925083818180828009800909905062000d6d600052620025ba565b837f00ef653322b13d6c889bc81715c37d77a6cd267d595c4a8909a5546c7c97cff182089050837f0e25483e45a665208b261d8ba74051e6400c776d652595d9845aca35d8a397d383089150837f29f536dcb9dd7682245264659e15d88e395ac3d4dde92d8c46448db979eeba898408925083818180828009800909905062000df8600052620025ba565b837f2a56ef9f2c53febadfda33575dbdbd885a124e2780bbea170e456baace0fa5be82089050837f1c8361c78eb5cf5decfb7a2d17b5c409f2ae2999a46762e8ee416240a8cb9af183089150837f151aff5f38b20a0fc0473089aaf0206b83e8e68a764507bfd3d0ab4be74319c58408925083818180828009800909905062000e83600052620025ba565b837f04c6187e41ed881dc1b239c88f7f9d43a9f52fc8c8b6cdd1e76e47615b51f10082089050837f13b37bd80f4d27fb10d84331f6fb6d534b81c61ed15776449e801b7ddc9c296783089150837f01a5c536273c2d9df578bfbd32c17b7a2ce3664c2a52032c9321ceb1c4e8a8e48408925083818180828009800909905062000f0e600052620025ba565b837f2ab3561834ca73835ad05f5d7acb950b4a9a2c666b9726da832239065b7c3b0282089050837f1d4d8ec291e720db200fe6d686c0d613acaf6af4e95d3bf69f7ed516a597b64683089150837f041294d2cc484d228f5784fe7919fd2bb925351240a04b711514c9c80b65af1d8408925083818180828009800909905062000f99600052620025ba565b837f154ac98e01708c611c4fa715991f004898f57939d126e392042971dd90e81fc682089050837f0b339d8acca7d4f83eedd84093aef51050b3684c88f8b0b04524563bc6ea4da483089150837f0955e49e6610c94254a4f84cfbab344598f0e71eaff4a7dd81ed95b50839c82e8408925083818180828009800909905062001024600052620025ba565b837f06746a6156eba54426b9e22206f15abca9a6f41e6f535c6f3525401ea065462682089050837f0f18f5a0ecd1423c496f3820c549c27838e5790e2bd0a196ac917c7ff32077fb83089150837f04f6eeca1751f7308ac59eff5beb261e4bb563583ede7bc92a738223d6f76e1384089250838181808280098009099050620010af600052620025ba565b837f2b56973364c4c4f5c1a3ec4da3cdce038811eb116fb3e45bc1768d26fc0b375882089050837f123769dd49d5b054dcd76b89804b1bcb8e1392b385716a5d83feb65d437f29ef83089150837f2147b424fc48c80a88ee52b91169aacea989f6446471150994257b2fb01c63e9840892508381818082800980090990506200113a600052620025ba565b837f0fdc1f58548b85701a6c5505ea332a29647e6f34ad4243c2ea54ad897cebe54d82089050837f12373a8251fea004df68abcf0f7786d4bceff28c5dbbe0c3944f685cc0a0b1f283089150837f21e4f4ea5f35f85bad7ea52ff742c9e8a642756b6af44203dd8a1f35c1a9003584089250838181808280098009099050620011c5600052620025ba565b837f16243916d69d2ca3dfb4722224d4c462b57366492f45e90d8a81934f1bc3b14782089050837f1efbe46dd7a578b4f66f9adbc88b4378abc21566e1a0453ca13a4159cac04ac283089150837f07ea5e8537cf5dd08886020e23a7f387d468d5525be66f853b672cc96a88969a8408925083818180828009800909905062001250600052620025ba565b837f05a8c4f9968b8aa3b7b478a30f9a5b63650f19a75e7ce11ca9fe16c0b76c00bc82089050837f20f057712cc21654fbfe59bd345e8dac3f7818c701b9c7882d9d57b72a32e83f83089150837f04a12ededa9dfd689672f8c67fee31636dcd8e88d01d49019bd90b33eb33db6984089250838181808280098009099050620012db600052620025ba565b837f27e88d8c15f37dcee44f1e5425a51decbd136ce5091a6767e49ec9544ccd101a82089050837f2feed17b84285ed9b8a5c8c5e95a41f66e096619a7703223176c41ee433de4d183089150837f1ed7cc76edf45c7c404241420f729cf394e5942911312a0d6972b8bd53aff2b88408925083818180828009800909905062001366600052620025ba565b837f15742e99b9bfa323157ff8c586f5660eac6783476144cdcadf2874be45466b1a82089050837f1aac285387f65e82c895fc6887ddf40577107454c6ec0317284f033f27d0c78583089150837f25851c3c845d4790f9ddadbdb6057357832e2e7a49775f71ec75a96554d67c7784089250838181808280098009099050620013f1600052620025ba565b837f15a5821565cc2ec2ce78457db197edf353b7ebba2c5523370ddccc3d9f146a6782089050837f2411d57a4813b9980efa7e31a1db5966dcf64f36044277502f15485f28c7172783089150837f002e6f8d6520cd4713e335b8c0b6d2e647e9a98e12f4cd2558828b5ef6cb4c9b840892508381818082800980090990506200147c600052620025ba565b837f2ff7bc8f4380cde997da00b616b0fcd1af8f0e91e2fe1ed7398834609e0315d282089050837f00b9831b948525595ee02724471bcd182e9521f6b7bb68f1e93be4febb0d3cbe83089150837f0a2f53768b8ebf6a86913b0e57c04e011ca408648a4743a87d77adbf0c9c35128408925083818180828009800909905062001507600052620025ba565b837f00248156142fd0373a479f91ff239e960f599ff7e94be69b7f2a290305e1198d82089050837f171d5620b87bfb1328cf8c02ab3f0c9a397196aa6a542c2350eb512a2b2bcda983089150837f170a4f55536f7dc970087c7c10d6fad760c952172dd54dd99d1045e4ec34a8088408925083818180828009800909905062001592600052620025ba565b837f29aba33f799fe66c2ef3134aea04336ecc37e38c1cd211ba482eca17e2dbfae182089050837f1e9bc179a4fdd758fdd1bb1945088d47e70d114a03f6a0e8b5ba650369e6497383089150837f1dd269799b660fad58f7f4892dfb0b5afeaad869a9c4b44f9c9e1c43bdaf8f09840892508381818082800980090990506200161d600052620025ba565b837f22cdbc8b70117ad1401181d02e15459e7ccd426fe869c7c95d1dd2cb0f24af3882089050837f0ef042e454771c533a9f57a55c503fcefd3150f52ed94a7cd5ba93b9c7dacefd83089150837f11609e06ad6c8fe2f287f3036037e8851318e8b08a0359a03b304ffca62e828484089250838181808280098009099050620016a8600052620025ba565b837f1166d9e554616dba9e753eea427c17b7fecd58c076dfe42708b08f5b783aa9af82089050837f2de52989431a859593413026354413db177fbf4cd2ac0b56f855a888357ee46683089150837f3006eb4ffc7a85819a6da492f3a8ac1df51aee5b17b8e89d74bf01cf5f71e9ad8408925083818180828009800909905062001733600052620025ba565b837f2af41fbb61ba8a80fdcf6fff9e3f6f422993fe8f0a4639f962344c822514508682089050837f119e684de476155fe5a6b41a8ebc85db8718ab27889e85e781b214bace4827c383089150837f1835b786e2e8925e188bea59ae363537b51248c23828f047cff784b97b3fd80084089250838181808280098009099050620017be600052620025ba565b837f28201a34c594dfa34d794996c6433a20d152bac2a7905c926c40e285ab32eeb682089050837f083efd7a27d1751094e80fefaf78b000864c82eb571187724a761f88c22cc4e783089150837f0b6f88a3577199526158e61ceea27be811c16df7774dd8519e079564f61fd13b8408925083818180828009800909905062001849600052620025ba565b837f0ec868e6d15e51d9644f66e1d6471a94589511ca00d29e1014390e6ee4254f5b82089050837f2af33e3f866771271ac0c9b3ed2e1142ecd3e74b939cd40d00d937ab84c9859183089150837f0b520211f904b5e7d09b5d961c6ace7734568c547dd6858b364ce5e47951f17884089250838181808280098009099050620018d4600052620025ba565b837f0b2d722d0919a1aad8db58f10062a92ea0c56ac4270e822cca228620188a1d4082089050837f1f790d4d7f8cf094d980ceb37c2453e957b54a9991ca38bbe0061d1ed6e562d483089150837f0171eb95dfbf7d1eaea97cd385f780150885c16235a2a6a8da92ceb01e504233840892508381818082800980090990506200195f600052620025ba565b837f0c2d0e3b5fd57549329bf6885da66b9b790b40defd2c8650762305381b16887382089050837f1162fb28689c27154e5a8228b4e72b377cbcafa589e283c35d3803054407a18d83089150837f2f1459b65dee441b64ad386a91e8310f282c5a92a89e19921623ef8249711bc084089250838181808280098009099050620019ea600052620025ba565b837f1e6ff3216b688c3d996d74367d5cd4c1bc489d46754eb712c243f70d1b53cfbb82089050837f01ca8be73832b8d0681487d27d157802d741a6f36cdc2a0576881f932647887583089150837f1f7735706ffe9fc586f976d5bdf223dc680286080b10cea00b9b5de315f9650e8408925083818180828009800909905062001a75600052620025ba565b837f2522b60f4ea3307640a0c2dce041fba921ac10a3d5f096ef4745ca838285f01982089050837f23f0bee001b1029d5255075ddc957f833418cad4f52b6c3f8ce16c235572575b83089150837f2bc1ae8b8ddbb81fcaac2d44555ed5685d142633e9df905f66d9401093082d598408925083818180828009800909905062001b00600052620025ba565b837f0f9406b8296564a37304507b8dba3ed162371273a07b1fc98011fcd6ad72205f82089050837f2360a8eb0cc7defa67b72998de90714e17e75b174a52ee4acb126c8cd995f0a883089150837f15871a5cddead976804c803cbaef255eb4815a5e96df8b006dcbbc2767f889488408925083818180828009800909905062001b8b600052620025ba565b837f193a56766998ee9e0a8652dd2f3b1da0362f4f54f72379544f957ccdeefb420f82089050837f2a394a43934f86982f9be56ff4fab1703b2e63c8ad334834e4309805e777ae0f83089150837f1859954cfeb8695f3e8b635dcb345192892cd11223443ba7b4166e8876c0d1428408925083818180828009800909905062001c16600052620025ba565b837f04e1181763050e58013444dbcb99f1902b11bc25d90bbdca408d3819f4fed32b82089050837f0fdb253dee83869d40c335ea64de8c5bb10eb82db08b5e8b1f5e5552bfd05f2383089150837f058cbe8a9a5027bdaa4efb623adead6275f08686f1c08984a9d7c5bae9b4f1c08408925083818180828009800909905062001ca1600052620025ba565b837f1382edce9971e186497eadb1aeb1f52b23b4b83bef023ab0d15228b4cceca59a82089050837f03464990f045c6ee0819ca51fd11b0be7f61b8eb99f14b77e1e6634601d9e8b583089150837f23f7bfc8720dc296fff33b41f98ff83c6fcab4605db2eb5aaa5bc137aeb70a588408925083818180828009800909905062001d2c600052620025ba565b837f0a59a158e3eec2117e6e94e7f0e9decf18c3ffd5e1531a9219636158bbaf62f282089050837f06ec54c80381c052b58bf23b312ffd3ce2c4eba065420af8f4c23ed0075fd07b83089150837f118872dc832e0eb5476b56648e867ec8b09340f7a7bcb1b4962f0ff9ed1f9d018408925083818180828009800909905062001db7600052620025ba565b837f13d69fa127d834165ad5c7cba7ad59ed52e0b0f0e42d7fea95e1906b520921b182089050837f169a177f63ea681270b1c6877a73d21bde143942fb71dc55fd8a49f19f10c77b83089150837f04ef51591c6ead97ef42f287adce40d93abeb032b922f66ffb7e9a5a7450544d8408925083818180828009800909905062001e42600052620025ba565b837f256e175a1dc079390ecd7ca703fb2e3b19ec61805d4f03ced5f45ee6dd0f69ec82089050837f30102d28636abd5fe5f2af412ff6004f75cc360d3205dd2da002813d3e2ceeb283089150837f10998e42dfcd3bbf1c0714bc73eb1bf40443a3fa99bef4a31fd31be182fcc7928408925083818180828009800909905062001ecd600052620025ba565b837f193edd8e9fcf3d7625fa7d24b598a1d89f3362eaf4d582efecad76f879e3686082089050837f18168afd34f2d915d0368ce80b7b3347d1c7a561ce611425f2664d7aa51f0b5d83089150837f29383c01ebd3b6ab0c017656ebe658b6a328ec77bc33626e29e2e95b33ea61118408925083818180828009800909905062001f58600052620025ba565b837f10646d2f2603de39a1f4ae5e7771a64a702db6e86fb76ab600bf573f9010c71182089050837f0beb5e07d1b27145f575f1395a55bf132f90c25b40da7b3864d0242dcb1117fb83089150837f16d685252078c133dc0d3ecad62b5c8830f95bb2e54b59abdffbf018d96fa3368408925083818180828009800909905062001fe3600052620025ba565b837f0a6abd1d833938f33c74154e0404b4b40a555bbbec21ddfafd672dd62047f01a82089050837f1a679f5d36eb7b5c8ea12a4c2dedc8feb12dffeec450317270a6f19b34cf186083089150837f0980fb233bd456c23974d50e0ebfde4726a423eada4e8f6ffbc7592e3f1b93d6840892508381818082800980090990506200206e600052620025ba565b837f161b42232e61b84cbf1810af93a38fc0cece3d5628c9282003ebacb5c312c72b82089050837f0ada10a90c7f0520950f7d47a60d5e6a493f09787f1564e5d09203db47de1a0b83089150837f1a730d372310ba82320345a29ac4238ed3f07a8a2b4e121bb50ddb9af407f45184089250838181808280098009099050620020f9600052620025ba565b837f2c8120f268ef054f817064c369dda7ea908377feaba5c4dffbda10ef58e8c55682089050837f1c7c8824f758753fa57c00789c684217b930e95313bcb73e6e7b8649a4968f7083089150837f2cd9ed31f5f8691c8e39e4077a74faa0f400ad8b491eb3f7b47b27fa3fd1cf778408925083818180828009800909905062002184600052620025ba565b837f23ff4f9d46813457cf60d92f57618399a5e022ac321ca550854ae23918a22eea82089050837f09945a5d147a4f66ceece6405dddd9d0af5a2c5103529407dff1ea58f180426d83089150837f188d9c528025d4c2b67660c6b771b90f7c7da6eaa29d3f268a6dd223ec6fc630840892508381818082800980090990506200220f600052620025ba565b837f3050e37996596b7f81f68311431d8734dba7d926d3633595e0c0d8ddf4f0f47f82089050837f15af1169396830a91600ca8102c35c426ceae5461e3f95d89d829518d30afd7883089150837f1da6d09885432ea9a06d9f37f873d985dae933e351466b2904284da3320d8acc840892508381818082800980090990506200229a600052620025ba565b837f2796ea90d269af29f5f8acf33921124e4e4fad3dbe658945e546ee411ddaa9cb82089050837f202d7dd1da0f6b4b0325c8b3307742f01e15612ec8e9304a7cb0319e01d32d6083089150837f096d6790d05bb759156a952ba263d672a2d7f9c788f4c831a29dace4c0f8be5f8408925083818180828009800909905062002325600052620025ba565b837f054efa1f65b0fce283808965275d877b438da23ce5b13e1963798cb1447d25a482089050837f1b162f83d917e93edb3308c29802deb9d8aa690113b2e14864ccf6e18e4165f183089150837f21e5241e12564dd6fd9f1cdd2a0de39eedfefc1466cc568ec5ceb745a0506edc84089250838181808280098009099050838281808280098009099150838381808280098009099250620023c8600052620025ba565b837f1cfb5662e8cf5ac9226a80ee17b36abecb73ab5f87e161927b4349e10e4bdf0882089050837f0f21177e302a771bbae6d8d1ecb373b62c99af346220ac0129c53f666eb2410083089150837f1671522374606992affb0dd7f71b12bec4236aede6290546bcef7e1f515c2320840892508381818082800980090990508382818082800980090991508383818082800980090992506200246b600052620025ba565b837f0fa3ec5b9488259c2eb4cf24501bfad9be2ec9e42c5cc8ccd419d2a692cad87082089050837f193c0e04e0bd298357cb266c1506080ed36edce85c648cc085e8c57b1ab54bba83089150837f102adf8ef74735a27e9128306dcbc3c99f6f7291cd406578ce14ea2adaba68f8840892508381818082800980090990508382818082800980090991508383818082800980090992506200250e600052620025ba565b837f0fe0af7858e49859e2a54d6f1ad945b1316aa24bfbdd23ae40a6d0cb70c3eab182089050837f216f6717bbc7dedb08536a2220843f4e2da5f1daa9ebdefde8a5ea7344798d2283089150837f1da55cc900f0d21f4a3e694391918a1b3c23b2ac773c6b3ef88e2e422832516184089250838181808280098009099050838281808280098009099150838381808280098009099250620025b1600052620025ba565b60005260206000f35b8360205182098460405184098591088460605185098591088460805183098560a05185098691088560c05186098691088560e0518409866101005186098791088661012051870987910894509250905060005156", "key": "0x17c85ecbaedd35be311ad177fb8cd266d4d6ca50961076aa5df5287d787e84b3" }, "0x9d4454b023096f34b160d6b654540c56a1f81688": { @@ -349,17 +425,32 @@ }, "key": "0x3247e86af51c9646bccbd6593d7598c134338c594bef4622bd0013ac9d2c2a7f" }, + "0x9e545e3c0baab3e08cdfd552c960a1050f373042": { + "balance": "0", + "nonce": 1, + "root": "0xa5123c1d51dd7986375df921b012df36448f6a7bb8122d860ba0700556b38e16", + "codeHash": "0xde8699da477e68252347489b18e5598e14dd1c762a1de948b20ebce547e1b2ef", + "code": "0x608060405234801561001057600080fd5b50600436106101ad5760003560e01c806380ab1313116100ee578063b3e7766d11610097578063d5145ebc11610071578063d5145ebc146105d7578063e39a219c146105fe578063e9371a2c14610611578063fc9d84df1461063157600080fd5b8063b3e7766d14610569578063cfb4474d14610589578063d2ee3075146105b057600080fd5b80639ded3952116100c85780639ded39521461051c578063a41483e314610543578063a6ade11f1461055657600080fd5b806380ab1313146104c25780638f3a6c88146104d55780638f86c803146104fc57600080fd5b8063461569b81161015b5780635865b607116101355780635865b607146103d05780635a6b011f146103f757806362fc00db1461049c5780636fe0e559146104af57600080fd5b8063461569b81461034d5780635375b8911461036057806354fd4d501461038757600080fd5b80632df27fa51161018c5780632df27fa51461023e57806336086417146102f15780634394c5841461031857600080fd5b80621c2ff6146101b25780631be4e27e146101f65780631db1b67214610229575b600080fd5b6101d97f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b6040516001600160a01b0390911681526020015b60405180910390f35b610219610204366004614e01565b60036020526000908152604090205460ff1681565b60405190151581526020016101ed565b61023c610237366004614e2f565b610644565b005b6102aa61024c366004614e2f565b6002602090815260009283526040808420909152908252902080546001820154600383015460049093015460ff83169367ffffffffffffffff610100850416936001600160a01b036901000000000000000000909104811693169186565b6040805160ff909716875267ffffffffffffffff90951660208701526001600160a01b039384169486019490945291166060840152608083015260a082015260c0016101ed565b6101d97f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e81565b61033f7f000000000000000000000000000000000000000000000000000000000000001e81565b6040519081526020016101ed565b61021961035b366004614e01565b6106c7565b61033f7f000000000000000000000000000000000000000000000000000000000000006481565b6103c36040518060400160405280600581526020017f312e312e3000000000000000000000000000000000000000000000000000000081525081565b6040516101ed9190614eb7565b6101d97f00000000000000000000000068b1d87f95878fe05b998f19b66f4baba5de1aed81565b61045a610405366004614e01565b6004602052600090815260409020805460018201546002909201546001600160a01b0390911691906fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041684565b604080516001600160a01b03909516855260208501939093526fffffffffffffffffffffffffffffffff918216928401929092521660608201526080016101ed565b61023c6104aa366004614eca565b6107a2565b61023c6104bd366004614fee565b610e96565b61023c6104d03660046150d0565b61113e565b61033f7f000000000000000000000000000000000000000000000000000000000000006481565b61033f61050a366004614e01565b60016020526000908152604090205481565b6101d97f0000000000000000000000008a791620dd6260079bf849dc5567adc3f2fdc31881565b61023c610551366004614e01565b611b3e565b61023c610564366004615181565b611baf565b61057c610577366004614e2f565b611e82565b6040516101ed91906151eb565b61033f7f000000000000000000000000000000000000000000000000000000000000000481565b61033f7f000000000000000000000000000000000000000000000000000000000000001e81565b61033f7fa1235b834d6f1f78f78bc4db856fbc49302cce2c519921347600693021e087f781565b61023c61060c366004614e01565b611efa565b61062461061f366004614e2f565b612319565b6040516101ed919061525e565b61023c61063f36600461529f565b61234b565b600360008381526002602090815260408083206001600160a01b0386168452909152902061067190612dd9565b60058111156106825761068261522f565b146106b9576040517f744b348200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106c38282612eb7565b5050565b6000427f00000000000000000000000000000000000000000000000000000000000000647f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663a25ae557856040518263ffffffff1660e01b815260040161073991815260200190565b608060405180830381865afa158015610756573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077a9190615303565b604001516fffffffffffffffffffffffffffffffff1661079a91906153aa565b101592915050565b6107aa613513565b6107b385613577565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018690526000907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063a25ae55790602401608060405180830381865afa158015610834573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108589190615303565b6020015114610893576040517f8796efdc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008581526004602052604090206001015482146108dd576040517f90e78fa500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fb0ea09a8000000000000000000000000000000000000000000000000000000008152600481018690527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063b0ea09a890602401602060405180830381865afa15801561095b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097f91906153c2565b6001600160a01b0316846001600160a01b03161415806109b957506000858152600460205260409020546001600160a01b03848116911614155b156109f0576040517f8036a47f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008181526003602052604090205460ff16610a38576040517f7458ca2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260036020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905587835260049182905280832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155600181018490556002019290925590517fe6646723000000000000000000000000000000000000000000000000000000008152908101869052602481018390526001600160a01b0384811660448301527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9169063e664672390606401600060405180830381600087803b158015610b3757600080fd5b505af1158015610b4b573d6000803e3d6000fd5b505050507f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd191906153c2565b6001600160a01b031663ad36d6cc866040518263ffffffff1660e01b8152600401610bfe91815260200190565b602060405180830381865afa158015610c1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3f91906153df565b15610e4b577f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ca2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc691906153c2565b6040517fab04b8aa000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b038581166024830152919091169063ab04b8aa90604401600060405180830381600087803b158015610d2b57600080fd5b505af1158015610d3f573d6000803e3d6000fd5b505050507f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015610da1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc591906153c2565b6040517fbe995dc2000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b0385811660248301528681166044830152919091169063be995dc290606401600060405180830381600087803b158015610e3257600080fd5b505af1158015610e46573d6000803e3d6000fd5b505050505b836001600160a01b0316857fdca9fa9b51a5ba03938c6a0cd5489011630370fc481ef2b0cb771ad904a7305342604051610e8791815260200190565b60405180910390a35050505050565b600054610100900460ff1615808015610eb65750600054600160ff909116105b80610ed05750303b158015610ed0575060005460ff166001145b610f61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610fbf57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b60028251610fcd9190615430565b15611004576040517ffbb795f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160005b835181101561107d5783818151811061102457611024615444565b60200260200101516001600083815260200190815260200160002081905550600184828151811061105757611057615444565b60200260200101516110699190615473565b611073908361548a565b9150600101611009565b507f000000000000000000000000000000000000000000000000000000000000000481146110d7576040517ffbb795f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5080156106c357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b61114787613577565b600087815260026020908152604080832033845290915281209061116a82612dd9565b6001830154909150611187908a906001600160a01b031683613653565b15611193575050611b35565b60058160058111156111a7576111a761522f565b141580156111c7575060048160058111156111c4576111c461522f565b14155b156111fe576040517f744b348200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611239888361121a611215368c90038c018c6154c7565b613b72565b61122f611215368d90038d0160a08e016154c7565b8b60a08101613c61565b6112628760a0810161124f610140830183615537565b61125d6101608c018c615575565b613d69565b61128e6112736101c08901896155a9565b6101808a01356101a08b013560e08c013560c08d0135613e2e565b60006112ab60208901356112a66101408b018b615537565b613f62565b60008181526003602052604090205490915060ff16156112f7576040517f7458ca2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f4292dc3e0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000008a791620dd6260079bf849dc5567adc3f2fdc3181690634292dc3e90611364908a908a908a908a908890600401615660565b602060405180830381865afa158015611381573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113a591906153df565b6113db576040517f076490f600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405142815233908b907f0431864ed2609170587bbc7c198abd8caee4c55943dfb16fd42ec6f59c91c5f79060200160405180910390a36040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018b90526000907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063a25ae55790602401608060405180830381865afa158015611493573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b79190615303565b84546020820151604051602481018f905233604482015269010000000000000000009092046001600160a01b03166064830152608482015260a481018490529091506000907f62fc00db000000000000000000000000000000000000000000000000000000009060c40160408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009095169490941790935291840151606085015192517f080b91ee0000000000000000000000000000000000000000000000000000000081529193506001600160a01b037f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e169263080b91ee926115f3929190869060040161569a565b600060405180830381600087803b15801561160d57600080fd5b505af1158015611621573d6000803e3d6000fd5b50505060008d815260046020818152604092839020865181546001600160a01b039182167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116178255828801516001830155848801516060909801516fffffffffffffffffffffffffffffffff9081167001000000000000000000000000000000000298169790971760029091015582517fb98debbf00000000000000000000000000000000000000000000000000000000815292517f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c99096169563b98debbf9550838301945090929091908290030181865afa158015611728573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061174c91906153c2565b6001600160a01b031663ad36d6cc8b6040518263ffffffff1660e01b815260040161177991815260200190565b602060405180830381865afa158015611796573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ba91906153df565b156118d6577f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561181d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184191906153c2565b83546040517fbe995dc2000000000000000000000000000000000000000000000000000000008152600481018d90523360248201526001600160a01b0369010000000000000000009092048216604482015291169063be995dc290606401600060405180830381600087803b1580156118b957600080fd5b505af11580156118cd573d6000803e3d6000fd5b505050506119d4565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611934573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195891906153c2565b6040517fdd215c5d000000000000000000000000000000000000000000000000000000008152600481018c90523360248201526001600160a01b03919091169063dd215c5d90604401600060405180830381600087803b1580156119bb57600080fd5b505af11580156119cf573d6000803e3d6000fd5b505050505b600081815260036020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091558d8452600280845282852033865290935290832080547fffffff000000000000000000000000000000000000000000000000000000000016815590810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690559190611a8290830182614d83565b5060006003820181905560049182018190556040517fe66467230000000000000000000000000000000000000000000000000000000081529182018c905260248201523360448201527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063e664672390606401600060405180830381600087803b158015611b1957600080fd5b505af1158015611b2d573d6000803e3d6000fd5b505050505050505b50505050505050565b600081815260026020908152604080832033845290915290206001810154611b799083906001600160a01b0316611b7484612dd9565b613653565b6106c3576040517f4e9d86f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611bb885613577565b60008581526002602090815260408083206001600160a01b0388168452909152812090611be482612dd9565b6001830154909150611c019088906001600160a01b031683613653565b15611c0d575050611e7b565b60006001826005811115611c2357611c2361522f565b03611c3c575060018201546001600160a01b0316611c6f565b6002826005811115611c5057611c5061522f565b03611c6f57508154690100000000000000000090046001600160a01b03165b336001600160a01b03821614611cb1576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8254600090611cc49060ff1660016156d4565b9050611d4f81856002018981548110611cdf57611cdf615444565b9060005260206000200154866002018a6001611cfb91906153aa565b81548110611d0b57611d0b615444565b906000526020600020015489898080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061401d92505050565b6000611d5a8561412e565b9050611db585888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611da092508691508d905061548a565b8860040154611daf91906153aa565b84614173565b84547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff8316178555611de98561419d565b6040805160ff841681524260208201526001600160a01b038b16918c917fcadef6622777415b0589e491bdbf6baf11242f676f77055fd03bf1658c17a145910160405180910390a3611e3a8561423b565b611e75576040516001600160a01b038a16908b907f5c4528cbb38a169d24837617d3fd3d5c70a47769a4e9af6f384720b359b716c890600090a35b50505050505b5050505050565b60008281526002602081815260408084206001600160a01b0386168552825292839020909101805483518184028101840190945280845260609392830182828015611eec57602002820191906000526020600020905b815481526020019060010190808311611ed8575b505050505090505b92915050565b611f02613513565b611f0b81613577565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018290526000907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063a25ae55790602401608060405180830381865afa158015611f8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fb09190615303565b6020810151909150611fee576040517fe66309bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fe664672300000000000000000000000000000000000000000000000000000000815260048101839052600060248201526001600160a01b037f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e811660448301527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9169063e664672390606401600060405180830381600087803b15801561209857600080fd5b505af11580156120ac573d6000803e3d6000fd5b505050507f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561210e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061213291906153c2565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b815260040161215f91815260200190565b602060405180830381865afa15801561217c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a091906153df565b156122cd577f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612203573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061222791906153c2565b81516040517fbe995dc2000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b037f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e81166024830152918216604482015291169063be995dc290606401600060405180830381600087803b1580156122b457600080fd5b505af11580156122c8573d6000803e3d6000fd5b505050505b80600001516001600160a01b0316827fa620f04b65b1d538481626bf41dc5ee321b5c48e0cc1a7daae213cf7c254b54e4260405161230d91815260200190565b60405180910390a35050565b60008281526002602090815260408083206001600160a01b0385168452909152812061234490612dd9565b9392505050565b84600003612385576040517f2604872b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061240791906153c2565b6001600160a01b031663ad36d6cc866040518263ffffffff1660e01b815260040161243491815260200190565b602060405180830381865afa158015612451573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061247591906153df565b156125b5577f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124fc91906153c2565b6040517f9f8a13d70000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b039190911690639f8a13d790602401602060405180830381865afa15801561255b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061257f91906153df565b6125b5576040517f197299a000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600085815260026020908152604080832033845290915290208054600160ff909116106126395760036125e782612dd9565b60058111156125f8576125f861522f565b1461262f576040517f744b348200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126398633612eb7565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018790526000907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063a25ae55790602401608060405180830381865afa1580156126ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126de9190615303565b9050427f000000000000000000000000000000000000000000000000000000000000006482604001516fffffffffffffffffffffffffffffffff1661272391906153aa565b101561275b576040517fa0388b4700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020810151612796576040517fe66309bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516001600160a01b031633036127d9576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85158015906127e85750844015155b156128275785854014612827576040517f72f1f56300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006001600160a01b037f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c91663a25ae55761286360018b615473565b6040518263ffffffff1660e01b815260040161288191815260200190565b608060405180830381865afa15801561289e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c29190615303565b60208101519091506129305761292b6001868660008181106128e6576128e6615444565b90506020020135846020015188888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061401d92505050565b612978565b61297860018260200151846020015188888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061401d92505050565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129fa91906153c2565b6001600160a01b031663ad36d6cc896040518263ffffffff1660e01b8152600401612a2791815260200190565b602060405180830381865afa158015612a44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a6891906153df565b15612b68577f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612acb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aef91906153c2565b6040517f8c1516c70000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b039190911690638c1516c790602401600060405180830381600087803b158015612b4b57600080fd5b505af1158015612b5f573d6000803e3d6000fd5b50505050612c66565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612bc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bea91906153c2565b6040517f5a544742000000000000000000000000000000000000000000000000000000008152600481018a90523360248201526001600160a01b039190911690635a54474290604401600060405180830381600087803b158015612c4d57600080fd5b505af1158015612c61573d6000803e3d6000fd5b505050505b612d058386868080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050506060860151612cdf91507f0000000000000000000000000000000000000000000000000000000000000004906fffffffffffffffffffffffffffffffff16615473565b7f0000000000000000000000000000000000000000000000000000000000000004614173565b825482516001600160a01b03166901000000000000000000027fffffff0000000000000000000000000000000000000000ffffffffffffffff009091161760019081178455830180547fffffffffffffffffffffffff00000000000000000000000000000000000000001633179055612d7d8361419d565b815160405142815233916001600160a01b0316908a907fd2f7931a802085b3d0234d4c320ce7ee0041da96678ce2bf5c93e8d3d7e65f529060200160405180910390a45050505050505050565b6001600160a01b03163b151590565b8054600090600160ff9091161015612df357506000919050565b8154600090612e079060029060ff166156f9565b835460ff91909116159150610100900467ffffffffffffffff16421115612e8c578015612e375750600392915050565b8254612e73907f000000000000000000000000000000000000000000000000000000000000001e90610100900467ffffffffffffffff166153aa565b421115612e835750600392915050565b50600492915050565b612e958361423b565b612ea25750600592915050565b80612eae576002612344565b60019392505050565b60008281526002602081815260408084206001600160a01b0386168552909152822080547fffffff00000000000000000000000000000000000000000000000000000000001681556001810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690559190612f3790830182614d83565b600382016000905560048201600090555050806001600160a01b0316827fbf4506ef5d06ecb6168f37bc9e69dd473089eb9e3f2675322d01b4d466cff05142604051612f8591815260200190565b60405180910390a37f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612feb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061300f91906153c2565b6001600160a01b031663ad36d6cc836040518263ffffffff1660e01b815260040161303c91815260200190565b602060405180830381865afa158015613059573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061307d91906153df565b15613227577f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156130e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061310491906153c2565b6001600160a01b031663be995dc2837f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b0ea09a8866040518263ffffffff1660e01b815260040161316191815260200190565b602060405180830381865afa15801561317e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131a291906153c2565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526001600160a01b039081166024830152841660448201526064015b600060405180830381600087803b15801561320b57600080fd5b505af115801561321f573d6000803e3d6000fd5b505050505050565b6040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316906333727c4d90602401602060405180830381865afa1580156132a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132c991906153df565b15613441577f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561332c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061335091906153c2565b6001600160a01b03166336b8346983837f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b0ea09a8876040518263ffffffff1660e01b81526004016133ae91815260200190565b602060405180830381865afa1580156133cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133ef91906153c2565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815260048101939093526001600160a01b0391821660248401521660448201526064016131f1565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561349f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134c391906153c2565b6040517fdd215c5d000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b038381166024830152919091169063dd215c5d906044016131f1565b336001600160a01b037f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e1614613575576040517f9d02a7c200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b6040517f33727c4d000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b0316906333727c4d90602401602060405180830381865afa1580156135f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061361991906153df565b15613650576040517f5c9d9a2300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b6040517fa25ae5570000000000000000000000000000000000000000000000000000000081526004810184905260009081907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b03169063a25ae55790602401608060405180830381865afa1580156136d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136fa9190615303565b602001511461370b57506000612344565b336001600160a01b0384161461374d576040517f21e62a3f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008260058111156137615761376161522f565b148061377e5750600382600581111561377c5761377c61522f565b145b156137b5576040517ff691b6e600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000848152600260208181526040808420338552909152822080547fffffff00000000000000000000000000000000000000000000000000000000001681556001810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055919061382c90830182614d83565b50600060038201819055600490910155604051428152339085907f6f3468a095154788e69ed719ee418416c1e338ac2348ccb3531bb97a0ed6ed9d9060200160405180910390a37f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138f591906153c2565b6001600160a01b031663ad36d6cc856040518263ffffffff1660e01b815260040161392291815260200190565b602060405180830381865afa15801561393f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061396391906153df565b15613a63577f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663ae9483e06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156139c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139ea91906153c2565b6040517fa83871720000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03919091169063a838717290602401600060405180830381600087803b158015613a4657600080fd5b505af1158015613a5a573d6000803e3d6000fd5b50505050613b68565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c96001600160a01b031663b98debbf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ac1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ae591906153c2565b6040517f36b8346900000000000000000000000000000000000000000000000000000000815260048101869052336024820181905260448201526001600160a01b0391909116906336b8346990606401600060405180830381600087803b158015613b4f57600080fd5b505af1158015613b63573d6000803e3d6000fd5b505050505b5060019392505050565b8051600090613bd45781516020808401516040808601516060808801516080808a0151855180890199909952888601969096529187019290925285015260a0808501929092528051808503909201825260c09093019092528151910120611ef4565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f48617368696e673a20756e6b6e6f776e206f757470757420726f6f742070726f60448201527f6f662076657273696f6e000000000000000000000000000000000000000000006064820152608401610f58565b919050565b83856002018781548110613c7757613c77615444565b906000526020600020015414613cb9576040517f224dff3200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613cc28561423b565b613d28578260028601613cd68860016153aa565b81548110613ce657613ce6615444565b906000526020600020015403613d28576040517f87c1943200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806060013582608001351461321f576040517f3f126fab00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82602001358260e0013514613daa576040517f4d9e774000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610180830135613dd557613dd0613dc284615799565b613dcb846158f3565b61424f565b613def565b613def613de184615799565b613dea846158f3565b6142f3565b905080856080013514611e7b576040517fb033950600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051600060208201528082018690526060810185905260808082018590528251808303909101815260a08201928390527f12e64a72000000000000000000000000000000000000000000000000000000009092527f00000000000000000000000068b1d87f95878fe05b998f19b66f4baba5de1aed6001600160a01b0316906312e64a7290613eeb907f42000000000000000000000000000000000000030000000000000000000000009085908c908c90899060a401615a94565b602060405180830381865afa158015613f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f2c91906153df565b611b35576040517ff35959c000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060607f0000000000000000000000000000000000000000000000000000000000000064613f956101208501856155a9565b9050101561400257613fff7fa1235b834d6f1f78f78bc4db856fbc49302cce2c519921347600693021e087f7613fcf6101208601866155a9565b613ffa91507f0000000000000000000000000000000000000000000000000000000000000064615473565b614404565b90505b6140158461400f85615799565b83614490565b949350505050565b80516001600061402d8288615b6f565b60ff1681526020019081526020016000205414614076576040517ffbb795f000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008151811061408957614089615444565b602002602001015183146140c9576040517f224dff3200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600182516140d89190615473565b815181106140e8576140e8615444565b60200260200101518203614128576040517f87c1943200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b80546000906001908190839061414890839060ff16615b6f565b60ff168152602001908152602001600020546141649190615473565b8260030154611ef49190615b92565b82516141889060028601906020860190614da1565b50600484019190915560039092019190915550565b6141a68161423b565b614211576141d47f000000000000000000000000000000000000000000000000000000000000001e426153aa565b815467ffffffffffffffff91909116610100027fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000ff90911617815550565b6141d47f000000000000000000000000000000000000000000000000000000000000001e426153aa565b600060016142488361412e565b1192915050565b6040805160118082526102408201909252600091829190816020015b606081526020019060019003908161426b57905050905061428d848483614502565b6142bc8461010001516040516020016142a891815260200190565b6040516020818303038152906040526147b5565b816010815181106142cf576142cf615444565b60200260200101819052506142e381614824565b8051906020012091505092915050565b6040805160148082526102a08201909252600091829190816020015b606081526020019060019003908161430f579050509050614331848483614502565b61434c8461010001516040516020016142a891815260200190565b8160108151811061435f5761435f615444565b602002602001018190525061438284610140015167ffffffffffffffff16614868565b8160118151811061439557614395615444565b60200260200101819052506143b884610160015167ffffffffffffffff16614868565b816012815181106143cb576143cb615444565b60200260200101819052506143f18461018001516040516020016142a891815260200190565b816013815181106142cf576142cf615444565b606060008267ffffffffffffffff81111561442157614421614f1c565b60405190808252806020026020018201604052801561444a578160200160208202803683370190505b50905060005b83811015614488578482828151811061446b5761446b615444565b60209081029190910101528061448081615ba6565b915050614450565b509392505050565b6000838360e001516000801b85600001518660200151876060015188604001518960a001518a608001518b6101200151518c61012001518c6040516020016144e39c9b9a99989796959493929190615c11565b6040516020818303038152906040528051906020012090509392505050565b61451c83602001516040516020016142a891815260200190565b8160008151811061452f5761452f615444565b602002602001018190525081600001518160018151811061455257614552615444565b602002602001018190525081602001518160028151811061457557614575615444565b602002602001018190525061459a8360e001516040516020016142a891815260200190565b816003815181106145ad576145ad615444565b60200260200101819052506145d28360c001516040516020016142a891815260200190565b816004815181106145e5576145e5615444565b602002602001018190525081604001518160058151811061460857614608615444565b602002602001018190525081606001518160068151811061462b5761462b615444565b602002602001018190525081608001518160078151811061464e5761464e615444565b6020026020010181905250614670836060015167ffffffffffffffff16614868565b8160088151811061468357614683615444565b60200260200101819052506146a5836080015167ffffffffffffffff16614868565b816009815181106146b8576146b8615444565b60200260200101819052508160a0015181600a815181106146db576146db615444565b60200260200101819052506146fd836040015167ffffffffffffffff16614868565b81600b8151811061471057614710615444565b60200260200101819052508160c0015181600c8151811061473357614733615444565b60200260200101819052508160e0015181600d8151811061475657614756615444565b602002602001018190525081610100015181600e8151811061477a5761477a615444565b60200260200101819052506147928360a00151614868565b81600f815181106147a5576147a5615444565b6020026020010181905250505050565b606080825160011480156147e357506080836000815181106147d9576147d9615444565b016020015160f81c105b156147ef575081611ef4565b6147fb8351608061487b565b8360405160200161480d929190615cca565b604051602081830303815290604052905092915050565b6060600061483183614a71565b905061483f815160c061487b565b81604051602001614851929190615cca565b604051602081830303815290604052915050919050565b6060611ef461487683614ba9565b6147b5565b60608060388410156148fa57604080516001808252818301909252906020820181803683370190505090506148b083856156d4565b60f81b816000815181106148c6576148c6615444565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612344565b600060015b6149098187615b92565b1561492f578161491881615ba6565b925061492890506101008261548a565b90506148ff565b61493a8260016153aa565b67ffffffffffffffff81111561495257614952614f1c565b6040519080825280601f01601f19166020018201604052801561497c576020820181803683370190505b50925061498985836156d4565b6149949060376156d4565b60f81b836000815181106149aa576149aa615444565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190505b818111614a68576101006149f28284615473565b6149fe90610100615e19565b614a089088615b92565b614a129190615430565b60f81b838281518110614a2757614a27615444565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080614a6081615ba6565b9150506149de565b50509392505050565b60608151600003614a9057505060408051600081526020810190915290565b6000805b8351811015614ad757838181518110614aaf57614aaf615444565b60200260200101515182614ac391906153aa565b915080614acf81615ba6565b915050614a94565b60008267ffffffffffffffff811115614af257614af2614f1c565b6040519080825280601f01601f191660200182016040528015614b1c576020820181803683370190505b50600092509050602081015b8551831015614ba0576000868481518110614b4557614b45615444565b602002602001015190506000602082019050614b6383828451614d08565b878581518110614b7557614b75615444565b60200260200101515183614b8991906153aa565b925050508280614b9890615ba6565b935050614b28565b50949350505050565b6060600082604051602001614bc091815260200190565b604051602081830303815290604052905060005b6020811015614c2f57818181518110614bef57614bef615444565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016600003614c2f5780614c2781615ba6565b915050614bd4565b6000614c3c826020615473565b67ffffffffffffffff811115614c5457614c54614f1c565b6040519080825280601f01601f191660200182016040528015614c7e576020820181803683370190505b50905060005b8151811015614ba0578383614c9881615ba6565b945081518110614caa57614caa615444565b602001015160f81c60f81b828281518110614cc757614cc7615444565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535080614d0081615ba6565b915050614c84565b8282825b60208110614d445781518352614d236020846153aa565b9250614d306020836153aa565b9150614d3d602082615473565b9050614d0c565b905182516020929092036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0180199091169116179052505050565b50805460008255906000526020600020908101906136509190614dec565b828054828255906000526020600020908101928215614ddc579160200282015b82811115614ddc578251825591602001919060010190614dc1565b50614de8929150614dec565b5090565b5b80821115614de85760008155600101614ded565b600060208284031215614e1357600080fd5b5035919050565b6001600160a01b038116811461365057600080fd5b60008060408385031215614e4257600080fd5b823591506020830135614e5481614e1a565b809150509250929050565b60005b83811015614e7a578181015183820152602001614e62565b838111156141285750506000910152565b60008151808452614ea3816020860160208601614e5f565b601f01601f19169290920160200192915050565b6020815260006123446020830184614e8b565b600080600080600060a08688031215614ee257600080fd5b853594506020860135614ef481614e1a565b93506040860135614f0481614e1a565b94979396509394606081013594506080013592915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516101a0810167ffffffffffffffff81118282101715614f6f57614f6f614f1c565b60405290565b604051610120810167ffffffffffffffff81118282101715614f6f57614f6f614f1c565b604051601f8201601f1916810167ffffffffffffffff81118282101715614fc257614fc2614f1c565b604052919050565b600067ffffffffffffffff821115614fe457614fe4614f1c565b5060051b60200190565b6000602080838503121561500157600080fd5b823567ffffffffffffffff81111561501857600080fd5b8301601f8101851361502957600080fd5b803561503c61503782614fca565b614f99565b81815260059190911b8201830190838101908783111561505b57600080fd5b928401925b8284101561507957833582529284019290840190615060565b979650505050505050565b60008083601f84011261509657600080fd5b50813567ffffffffffffffff8111156150ae57600080fd5b6020830191508360208260051b85010111156150c957600080fd5b9250929050565b600080600080600080600060a0888a0312156150eb57600080fd5b8735965060208801359550604088013567ffffffffffffffff8082111561511157600080fd5b908901906101e0828c03121561512657600080fd5b9095506060890135908082111561513c57600080fd5b6151488b838c01615084565b909650945060808a013591508082111561516157600080fd5b5061516e8a828b01615084565b989b979a50959850939692959293505050565b60008060008060006080868803121561519957600080fd5b8535945060208601356151ab81614e1a565b935060408601359250606086013567ffffffffffffffff8111156151ce57600080fd5b6151da88828901615084565b969995985093965092949392505050565b6020808252825182820181905260009190848201906040850190845b8181101561522357835183529284019291840191600101615207565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160068310615299577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806000806000608086880312156152b757600080fd5b853594506020860135935060408601359250606086013567ffffffffffffffff8111156151ce57600080fd5b80516fffffffffffffffffffffffffffffffff81168114613c5c57600080fd5b60006080828403121561531557600080fd5b6040516080810181811067ffffffffffffffff8211171561533857615338614f1c565b604052825161534681614e1a565b81526020838101519082015261535e604084016152e3565b604082015261536f606084016152e3565b60608201529392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156153bd576153bd61537b565b500190565b6000602082840312156153d457600080fd5b815161234481614e1a565b6000602082840312156153f157600080fd5b8151801515811461234457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261543f5761543f615401565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000828210156154855761548561537b565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156154c2576154c261537b565b500290565b600060a082840312156154d957600080fd5b60405160a0810181811067ffffffffffffffff821117156154fc576154fc614f1c565b806040525082358152602083013560208201526040830135604082015260608301356060820152608083013560808201528091505092915050565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6183360301811261556b57600080fd5b9190910192915050565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee183360301811261556b57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126155de57600080fd5b83018035915067ffffffffffffffff8211156155f957600080fd5b6020019150600581901b36038213156150c957600080fd5b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561564357600080fd5b8260051b8083602087013760009401602001938452509192915050565b606081526000615674606083018789615611565b8281036020840152615687818688615611565b9150508260408301529695505050505050565b8381526fffffffffffffffffffffffffffffffff831660208201526060604082015260006156cb6060830184614e8b565b95945050505050565b600060ff821660ff84168060ff038211156156f1576156f161537b565b019392505050565b600060ff83168061570c5761570c615401565b8060ff84160691505092915050565b803567ffffffffffffffff81168114613c5c57600080fd5b600082601f83011261574457600080fd5b8135602061575461503783614fca565b82815260059290921b8401810191818101908684111561577357600080fd5b8286015b8481101561578e5780358352918301918301615777565b509695505050505050565b60006101a082360312156157ac57600080fd5b6157b4614f4b565b82358152602083013560208201526157ce6040840161571b565b60408201526157df6060840161571b565b60608201526157f06080840161571b565b608082015260a083013560a082015260c083013560c082015260e083013560e08201526101008084013581830152506101208084013567ffffffffffffffff81111561583b57600080fd5b61584736828701615733565b82840152505061014061585b81850161571b565b9082015261016061586d84820161571b565b9082015261018092830135928101929092525090565b600082601f83011261589457600080fd5b813567ffffffffffffffff8111156158ae576158ae614f1c565b6158c16020601f19601f84011601614f99565b8181528460208386010111156158d657600080fd5b816020850160208301376000918101602001919091529392505050565b6000610120823603121561590657600080fd5b61590e614f75565b823567ffffffffffffffff8082111561592657600080fd5b61593236838701615883565b8352602085013591508082111561594857600080fd5b61595436838701615883565b6020840152604085013591508082111561596d57600080fd5b61597936838701615883565b6040840152606085013591508082111561599257600080fd5b61599e36838701615883565b606084015260808501359150808211156159b757600080fd5b6159c336838701615883565b608084015260a08501359150808211156159dc57600080fd5b6159e836838701615883565b60a084015260c0850135915080821115615a0157600080fd5b615a0d36838701615883565b60c084015260e0850135915080821115615a2657600080fd5b615a3236838701615883565b60e084015261010091508185013581811115615a4d57600080fd5b615a5936828801615883565b8385015250505080915050919050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b85815260006020608081840152615aae6080840188614e8b565b8381036040850152858152818101600587901b820183018860005b89811015615b5657601f1985840301845281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18c3603018112615b0c57600080fd5b8b01868101903567ffffffffffffffff811115615b2857600080fd5b803603821315615b3757600080fd5b615b42858284615a69565b958801959450505090850190600101615ac9565b5050809450505050508260608301529695505050505050565b600060ff821660ff841680821015615b8957615b8961537b565b90039392505050565b600082615ba157615ba1615401565b500490565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615bd757615bd761537b565b5060010190565b60008151602080840160005b83811015615c0657815187529582019590820190600101615bea565b509495945050505050565b8c81528b60208201528a604082015289606082015288608082015260007fffffffffffffffff000000000000000000000000000000000000000000000000808a60c01b1660a0840152808960c01b1660a88401528760b0840152808760c01b1660d0840152507fffff0000000000000000000000000000000000000000000000000000000000008560f01b1660d8830152615cb8615cb260da840186615bde565b84615bde565b9e9d5050505050505050505050505050565b60008351615cdc818460208801614e5f565b835190830190615cf0818360208801614e5f565b01949350505050565b600181815b80851115615d5257817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615d3857615d3861537b565b80851615615d4557918102915b93841c9390800290615cfe565b509250929050565b600082615d6957506001611ef4565b81615d7657506000611ef4565b8160018114615d8c5760028114615d9657615db2565b6001915050611ef4565b60ff841115615da757615da761537b565b50506001821b611ef4565b5060208310610133831016604e8410600b8410161715615dd5575081810a611ef4565b615ddf8383615cf9565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615e1157615e1161537b565b029392505050565b60006123448383615d5a56fea164736f6c634300080f000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "01", + "0x7dfe757ecd65cbd7922a9c0161e935dd7fdbcc0e999689c7d31633896b1fc60b": "03", + "0xa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb49": "02", + "0xcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f": "02", + "0xd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec330f": "03" + }, + "key": "0xed887ba298276e378c422b1a275e365711e6b29aaa834cebdc8465b204127702" + }, "0x9fe46736679d2d9a65f0992f2272de9f3c7fa6e0": { "balance": "0", "nonce": 1, - "root": "0x38be4ba5cca5bf3775d7ab4358b62124d2ee67a221870e04eee8b6f9ec582a20", + "root": "0x10742a0b2db5b499924b90b31138bccb72ed6d7333e9017a3860f2a83e0c3d2a", "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", "code": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", "storage": { "0x0000000000000000000000000000000000000000000000000000000000000000": "01", - "0x0000000000000000000000000000000000000000000000000000000000000001": "2700000000000000000000000000000000000000003b9aca00", + "0x0000000000000000000000000000000000000000000000000000000000000001": "2800000000000000000000000000000000000000003b9aca00", "0x0000000000000000000000000000000000000000000000000000000000000032": "dead", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "a82ff9afd8f496c3d6ac40e2a0f282e47488cfc9", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "1613beb3b2c4f22ee086b2b38c1476a3ce7f78e8", "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "5fbdb2315678afecb367f032d93f642f64180aa3" }, "key": "0x08460e45164e07e0e4df7165de40d5863fb7b8ece896a164bf57a134287c68f5" @@ -367,11 +458,11 @@ "0xa513e6e4b8f2a923d98304ec87f64353c4d5c853": { "balance": "0", "nonce": 1, - "root": "0x50dcd80ea68a5975c2f00ac2cd3358ddf1417ea4eacd8836275436966314519c", + "root": "0xdcb8bb08e9ca2969a8c8d71d038f8e20921c6648e015d72f82352cf3a97de669", "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", "code": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", "storage": { - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "4ed7c70f96b99c776995fb64377f0d4ab3b0e1c1", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "322813fd9a801c5507c9de605d63cea4f2ce6c44", "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "5fbdb2315678afecb367f032d93f642f64180aa3" }, "key": "0x3f005d5c85385294c7a0de617e62ea384bebca06a5b203bd6166371f023de860" @@ -379,80 +470,42 @@ "0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0": { "balance": "0", "nonce": 1, - "root": "0x931a826cd66929549ae6066e92fa355345065cfb546130e6ca1b4aa1989604a3", + "root": "0x85db2eeb4053d6ca80a005a7222b2f83689ad8af5ae864242cc658447c516ae7", "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", "code": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", "storage": { "0x0000000000000000000000000000000000000000000000000000000000000000": "01", "0x0000000000000000000000000000000000000000000000000000000000000065": "4b726f6d615365637572697479436f756e63696c000000000000000000000028", "0x0000000000000000000000000000000000000000000000000000000000000066": "4b53430000000000000000000000000000000000000000000000000000000006", - "0x0000000000000000000000000000000000000000000000000000000000000099": "03", + "0x0000000000000000000000000000000000000000000000000000000000000099": "02", "0x000000000000000000000000000000000000000000000000000000000000012d": "f39fd6e51aad88f6f4ce6ab8827279cfffb92266", "0x0000000000000000000000000000000000000000000000000000000000000161": "4b726f6d615365637572697479436f756e63696c000000000000000000000028", "0x0000000000000000000000000000000000000000000000000000000000000162": "3100000000000000000000000000000000000000000000000000000000000002", - "0x0000000000000000000000000000000000000000000000000000000000000195": "03", - "0x00000000000000000000000000000000000000000000000000000000000001f7": "03", + "0x0000000000000000000000000000000000000000000000000000000000000195": "02", + "0x00000000000000000000000000000000000000000000000000000000000001f7": "02", "0x00000000000000000000000000000000000000000000000000000000000001f8": "01", "0x0368ef2524a38b6b115d8ebd4b69ba6955d052f73f6a344b60cd0a0506a9d257": "70997970c51812dc3a010c7d01b50e0d17dc79c8", "0x057edaae68d51eec754066df75dd2069eb696ff039b09734aba5812253786c27": "01", - "0x1b5420bf53fcfb00d9f99ce9bca9913de940cff08ed8b58c6100c58cdb99dcaf": "02", - "0x2f09a8ecadf9dcffddc0520948687cf84b3134ffe164b9b816be8f223e9e3f0c": "010000002d", - "0x2f7a9cff6166705937132e731d03ca3e5faa143373c7792e6ce15f51d1ab24b7": "01", - "0x34a128ff2438bccb68124de780ea45be60aca78c6fb6ce114324ee2dd88c546d": "fabb0ac9d68b0b445fb7357272ff202c5651694a", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "95401dc811bb5740090279ba06cfa8fcf6113778", - "0x54034dca961b61bc2a3147cc0c1986762915b42723ed64155364f17a2e296770": "010000002c", - "0x54034dca961b61bc2a3147cc0c1986762915b42723ed64155364f17a2e296771": "020000002d", - "0x54034dca961b61bc2a3147cc0c1986762915b42723ed64155364f17a2e296772": "030000002e", + "0x18156c81dcf3fb323401e2be29aa6cf147b01ccf17bbce35023b3250e001cde5": "010000002e", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "998abeb3e57409262ae5b751f60747921b33613e", + "0x38edd6e6b9b564301a1dfcfff8ee08e144d45b79a3fe2ad6c02b66ba5939153c": "01", + "0x3d0fb76aa8078ae9b1562043dcfdd7d5d52d2da206694e1bd45a1b44632424e6": "01", + "0x54034dca961b61bc2a3147cc0c1986762915b42723ed64155364f17a2e296770": "010000002d", + "0x54034dca961b61bc2a3147cc0c1986762915b42723ed64155364f17a2e296771": "020000002e", "0x5b542b52981c4f2fa9965514d5bb7f37f1b7bc0902a6a4dc6b04dc05be85586b": "01", - "0x6b5af3b1d385c06ee560b099063c98155ccb14d842fd04c7a6955cd2edcd5166": "01", - "0x6bee784efeb983674392298ab585b22866bedf00ebb0eea949d1e66f3f50e71d": "71be63f3384f5fb98995898a86b02fb2426c5788", + "0x6bee784efeb983674392298ab585b22866bedf00ebb0eea949d1e66f3f50e71d": "1cbd3b2770909d4e10f157cabc84c7264073c9ec", + "0x7256db6e1a3a9a88515503855dfa22457f63c2a54d44fe0e7a86be7d09dfba10": "1cbd3b2770909d4e10f157cabc84c7264073c9ec", "0x72a152ddfb8e864297c917af52ea6c1c68aead0fee1a62673fcc7e0c94979d01": "01", - "0x72a152ddfb8e864297c917af52ea6c1c68aead0fee1a62673fcc7e0c94979d02": "02", "0x81fe90a866a48a634a12852c1be675b683a22307409932a7443b8029347be756": "312e706e6700000000000000000000000000000000000000000000000000000a", - "0x8cad034229e7b37f8fa1634fc76a99eb0843bd3d554bbf516dc212c13b2f1c76": "332e706e6700000000000000000000000000000000000000000000000000000a", - "0x8cef3c7042a130027243cb2f998ead5342d2a129784eda79676f7704b2ea4f6c": "01", - "0x8df7a434b53c9aea5a5338791875bc3a8969cb613c974168f95eefeae5fd01ae": "01", + "0xaeb5afcfa19e3c204d68128666f5742662909dbf0df67093c848d2c2853e9b39": "01", "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "5fbdb2315678afecb367f032d93f642f64180aa3", - "0xb6aab34db6ad98c1b7e7142146804ce9fc6992da8076478d289c62788d5fa80f": "010000002c", - "0xb7daf9b15a61fd1e001a01cae8981f19b5cd917dea1a292fe96bf8ed779c8ac9": "71be63f3384f5fb98995898a86b02fb2426c5788", - "0xc4f77ef82cda0901cfdbeef8591c09692efae33b0f3173d67fb6cd42be529d44": "010000002e", + "0xb6aab34db6ad98c1b7e7142146804ce9fc6992da8076478d289c62788d5fa80f": "010000002d", "0xd4e1ac8b62c3ff1e2c1b7113742533b8310ce5ab8a8767ead9ba8b250c7e3cc9": "70997970c51812dc3a010c7d01b50e0d17dc79c8", "0xd9841eb47aa407700e14e706cabe283f9effe927976c5e8d4e2a2d8069f76af8": "01", - "0xe7659034bb7a5559d77c81228f78f1269e2e2532abae1c7e5319fa4c1ffcfff7": "fabb0ac9d68b0b445fb7357272ff202c5651694a", - "0xe8490770d22d54fb4d645fe3400077e850a009c5757ff32d576f5c74522c27e2": "01", - "0xec506dfa273b51989632259ed9c63e160e61bff5202e6a55d2c8927ffef177ed": "322e706e6700000000000000000000000000000000000000000000000000000a", - "0xf92510f12505915ee936d1a26b042eea9fe2264e0cd332bcee071a2783d1a3e9": "02" + "0xec506dfa273b51989632259ed9c63e160e61bff5202e6a55d2c8927ffef177ed": "322e706e6700000000000000000000000000000000000000000000000000000a" }, "key": "0x7b52b82e709191be4bae3bb8544d2a6b51d7440a1d15ba1f09e33bcf049e47a5" }, - "0xa82ff9afd8f496c3d6ac40e2a0f282e47488cfc9": { - "balance": "0", - "nonce": 1, - "root": "0xf05636166cad95d73ae816957c4a7e8ba11c37a78010bd04d4261e85ccb7b510", - "codeHash": "0x3283cdb6e4de5541675a974c1aad04ee74fab053a43f4d15a7c28f323f6ddf07", - "code": "0x6080604052600436106101475760003560e01c80638c3152e9116100c0578063cff0ab9611610074578063e965084c11610059578063e965084c146104b5578063e9e05c4214610541578063f04987501461055457600080fd5b8063cff0ab96146103f4578063d53a822f1461049557600080fd5b8063a14238e7116100a5578063a14238e714610370578063b98debbf146103a0578063c30af388146103d457600080fd5b80638c3152e9146103235780639bf62d821461034357600080fd5b80635865b607116101175780636dbffb78116100fc5780636dbffb78146102ba578063724c184c146102da5780638456cb591461030e57600080fd5b80635865b6071461025c5780635c975abb1461029057600080fd5b80621c2ff6146101735780630757b244146101d15780633f4ba83a146101f157806354fd4d501461020657600080fd5b3661016e5761016c3334620186a0600060405180602001604052806000815250610588565b005b600080fd5b34801561017f57600080fd5b506101a77f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c981565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101dd57600080fd5b5061016c6101ec366004612a08565b61076e565b3480156101fd57600080fd5b5061016c610d72565b34801561021257600080fd5b5061024f6040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516101c89190612b5f565b34801561026857600080fd5b506101a77f0000000000000000000000009a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae81565b34801561029c57600080fd5b506035546102aa9060ff1681565b60405190151581526020016101c8565b3480156102c657600080fd5b506102aa6102d5366004612b72565b610e7b565b3480156102e657600080fd5b506101a77f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e81565b34801561031a57600080fd5b5061016c610f52565b34801561032f57600080fd5b5061016c61033e366004612b8b565b611057565b34801561034f57600080fd5b506032546101a79073ffffffffffffffffffffffffffffffffffffffff1681565b34801561037c57600080fd5b506102aa61038b366004612b72565b60336020526000908152604090205460ff1681565b3480156103ac57600080fd5b506101a77f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b3480156103e057600080fd5b5061016c6103ef366004612bd8565b611825565b34801561040057600080fd5b5060015461045c906fffffffffffffffffffffffffffffffff81169067ffffffffffffffff7001000000000000000000000000000000008204811691780100000000000000000000000000000000000000000000000090041683565b604080516fffffffffffffffffffffffffffffffff909416845267ffffffffffffffff92831660208501529116908201526060016101c8565b3480156104a157600080fd5b5061016c6104b0366004612c46565b611983565b3480156104c157600080fd5b506105136104d0366004612b72565b603460205260009081526040902080546001909101546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041683565b604080519384526fffffffffffffffffffffffffffffffff92831660208501529116908201526060016101c8565b61016c61054f366004612c63565b610588565b34801561056057600080fd5b506101a77f000000000000000000000000e7f1725e7734ce288f8367e1bb143e90bb3f051281565b8260005a905083156106235773ffffffffffffffffffffffffffffffffffffffff8716156106235760405162461bcd60e51b815260206004820152603d60248201527f4b726f6d61506f7274616c3a206d7573742073656e6420746f2061646472657360448201527f73283029207768656e206372656174696e67206120636f6e747261637400000060648201526084015b60405180910390fd5b6152088567ffffffffffffffff1610156106a55760405162461bcd60e51b815260206004820152603560248201527f4b726f6d61506f7274616c3a20676173206c696d6974206d75737420636f766560448201527f7220696e737472696e7369632067617320636f73740000000000000000000000606482015260840161061a565b333281146106c6575033731111000000000000000000000000000000001111015b600034888888886040516020016106e1959493929190612ce0565b604051602081830303815290604052905060008973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32846040516107519190612b5f565b60405180910390a450506107658282611b72565b50505050505050565b60355460ff16156107c15760405162461bcd60e51b815260206004820152601360248201527f4b726f6d61506f7274616c3a2070617573656400000000000000000000000000604482015260640161061a565b3073ffffffffffffffffffffffffffffffffffffffff16856040015173ffffffffffffffffffffffffffffffffffffffff16036108665760405162461bcd60e51b815260206004820152603c60248201527f4b726f6d61506f7274616c3a20796f752063616e6e6f742073656e64206d657360448201527f736167657320746f2074686520706f7274616c20636f6e747261637400000000606482015260840161061a565b6040517fa25ae557000000000000000000000000000000000000000000000000000000008152600481018590526000907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c973ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401608060405180830381865afa1580156108f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109189190612d65565b60200151905061093561093036869003860186612ddd565b611e85565b81146109a95760405162461bcd60e51b815260206004820152602660248201527f4b726f6d61506f7274616c3a20696e76616c6964206f757470757420726f6f7460448201527f2070726f6f660000000000000000000000000000000000000000000000000000606482015260840161061a565b60006109b487611f0a565b6000818152603460209081526040918290208251606081018452815481526001909101546fffffffffffffffffffffffffffffffff8082169383018490527001000000000000000000000000000000009091041692810192909252919250901580610ae95750805160408083015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff90911660048201527f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c973ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401608060405180830381865afa158015610abe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae29190612d65565b6020015114155b610b5b5760405162461bcd60e51b815260206004820152603460248201527f4b726f6d61506f7274616c3a207769746864726177616c20686173682068617360448201527f20616c7265616479206265656e2070726f76656e000000000000000000000000606482015260840161061a565b60408051602080820185905260008284015282518083038401815260608301808552815191909201207f12e64a7200000000000000000000000000000000000000000000000000000000909152917f0000000000000000000000009a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae73ffffffffffffffffffffffffffffffffffffffff16916312e64a7291610bfd9185918b918b918e013590606401612e96565b602060405180830381865afa158015610c1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3e9190612f97565b610cb05760405162461bcd60e51b815260206004820152602f60248201527f4b726f6d61506f7274616c3a20696e76616c6964207769746864726177616c2060448201527f696e636c7573696f6e2070726f6f660000000000000000000000000000000000606482015260840161061a565b604080516060810182528581526fffffffffffffffffffffffffffffffff42811660208084019182528c831684860190815260008981526034835286812095518655925190518416700100000000000000000000000000000000029316929092176001909301929092558b830151908c0151925173ffffffffffffffffffffffffffffffffffffffff918216939091169186917f67a6208cfcc0801d50f6cbe764733f4fddf66ac0b04442061a8a8c0cb6b63f629190a4505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e1614610e1d5760405162461bcd60e51b815260206004820152602660248201527f4b726f6d61506f7274616c3a206f6e6c7920677561726469616e2063616e207560448201527f6e70617573650000000000000000000000000000000000000000000000000000606482015260840161061a565b603580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b6040517fa25ae55700000000000000000000000000000000000000000000000000000000815260048101829052600090610f4c9073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c9169063a25ae55790602401608060405180830381865afa158015610f0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f319190612d65565b604001516fffffffffffffffffffffffffffffffff16611f57565b92915050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000b7f8bc63bbcad18155201308c8f3540b07f84f5e1614610ffc5760405162461bcd60e51b8152602060048201526024808201527f4b726f6d61506f7274616c3a206f6e6c7920677561726469616e2063616e207060448201527f6175736500000000000000000000000000000000000000000000000000000000606482015260840161061a565b603580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001610e71565b60355460ff16156110aa5760405162461bcd60e51b815260206004820152601360248201527f4b726f6d61506f7274616c3a2070617573656400000000000000000000000000604482015260640161061a565b60325473ffffffffffffffffffffffffffffffffffffffff1661dead146111395760405162461bcd60e51b815260206004820152603c60248201527f4b726f6d61506f7274616c3a2063616e206f6e6c792074726967676572206f6e60448201527f65207769746864726177616c20706572207472616e73616374696f6e00000000606482015260840161061a565b600061114482611f0a565b60008181526034602090815260408083208151606081018352815481526001909101546fffffffffffffffffffffffffffffffff808216948301859052700100000000000000000000000000000000909104169181019190915292935090036112155760405162461bcd60e51b815260206004820152602f60248201527f4b726f6d61506f7274616c3a207769746864726177616c20686173206e6f742060448201527f6265656e2070726f76656e207965740000000000000000000000000000000000606482015260840161061a565b7f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c973ffffffffffffffffffffffffffffffffffffffff1663887862726040518163ffffffff1660e01b8152600401602060405180830381865afa158015611280573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a49190612fb4565b81602001516fffffffffffffffffffffffffffffffff1610156113555760405162461bcd60e51b815260206004820152604860248201527f4b726f6d61506f7274616c3a207769746864726177616c2074696d657374616d60448201527f70206c657373207468616e204c32204f7261636c65207374617274696e67207460648201527f696d657374616d70000000000000000000000000000000000000000000000000608482015260a40161061a565b61137481602001516fffffffffffffffffffffffffffffffff16611f57565b61140c5760405162461bcd60e51b815260206004820152604260248201527f4b726f6d61506f7274616c3a2070726f76656e207769746864726177616c206660448201527f696e616c697a6174696f6e20706572696f6420686173206e6f7420656c61707360648201527f6564000000000000000000000000000000000000000000000000000000000000608482015260a40161061a565b60408181015190517fa25ae5570000000000000000000000000000000000000000000000000000000081526fffffffffffffffffffffffffffffffff90911660048201526000907f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c973ffffffffffffffffffffffffffffffffffffffff169063a25ae55790602401608060405180830381865afa1580156114b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d59190612d65565b82516020820151919250146115785760405162461bcd60e51b815260206004820152604660248201527f4b726f6d61506f7274616c3a206f757470757420726f6f742070726f76656e2060448201527f6973206e6f74207468652073616d652061732063757272656e74206f7574707560648201527f7420726f6f740000000000000000000000000000000000000000000000000000608482015260a40161061a565b61159781604001516fffffffffffffffffffffffffffffffff16611f57565b61162f5760405162461bcd60e51b815260206004820152604260248201527f4b726f6d61506f7274616c3a20636865636b706f696e74206f7574707574206660448201527f696e616c697a6174696f6e20706572696f6420686173206e6f7420656c61707360648201527f6564000000000000000000000000000000000000000000000000000000000000608482015260a40161061a565b60008381526033602052604090205460ff16156116b45760405162461bcd60e51b815260206004820152603260248201527f4b726f6d61506f7274616c3a207769746864726177616c2068617320616c726560448201527f616479206265656e2066696e616c697a65640000000000000000000000000000606482015260840161061a565b600083815260336020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055908601516032805473ffffffffffffffffffffffffffffffffffffffff9092167fffffffffffffffffffffffff00000000000000000000000000000000000000009092169190911790558501516080860151606087015160a088015161175693929190611ffa565b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905560405190915084907fdb5c7652857aa163daadd670e116628fb42e869d8ac4251ef8971d9e5727df1b906117bb90841515815260200190565b60405180910390a2801580156117d15750326001145b1561181e5760405162461bcd60e51b815260206004820152601e60248201527f4b726f6d61506f7274616c3a207769746864726177616c206661696c65640000604482015260640161061a565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc916146118d05760405162461bcd60e51b815260206004820152603f60248201527f4b726f6d61506f7274616c3a2066756e6374696f6e2063616e206f6e6c79206260448201527f652063616c6c65642066726f6d207468652056616c696461746f72506f6f6c00606482015260840161061a565b6040513373111100000000000000000000000000000000111101906000906119049082908190879082908890602001612ce0565b604051602081830303815290604052905060008573ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb3813568d9991fc951961fcb4c784893574240a28925604d09fc577c55bb7c32846040516119749190612b5f565b60405180910390a45050505050565b600054610100900460ff16158080156119a35750600054600160ff909116105b806119bd5750303b1580156119bd575060005460ff166001145b611a2f5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161061a565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611a8d57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b603280547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055603580548315157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909116179055611aef612058565b8015611b5257600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b600154600090611ba8907801000000000000000000000000000000000000000000000000900467ffffffffffffffff1643612ffc565b90506000611bb4612121565b90506000816020015160ff16826000015163ffffffff16611bd59190613042565b90508215611d0c57600154600090611c0c908390700100000000000000000000000000000000900467ffffffffffffffff166130aa565b90506000836040015160ff1683611c23919061311e565b600154611c439084906fffffffffffffffffffffffffffffffff1661311e565b611c4d9190613042565b600154909150600090611c9e90611c779084906fffffffffffffffffffffffffffffffff166131da565b866060015163ffffffff168760a001516fffffffffffffffffffffffffffffffff166121e7565b90506001861115611ccd57611cca611c7782876040015160ff1660018a611cc59190612ffc565b612204565b90505b6fffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000067ffffffffffffffff4316021760015550505b60018054869190601090611d3f908490700100000000000000000000000000000000900467ffffffffffffffff1661324e565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550816000015163ffffffff16600160000160109054906101000a900467ffffffffffffffff1667ffffffffffffffff161315611e085760405162461bcd60e51b815260206004820152603e60248201527f5265736f757263654d65746572696e673a2063616e6e6f7420627579206d6f7260448201527f6520676173207468616e20617661696c61626c6520676173206c696d69740000606482015260840161061a565b600154600090611e34906fffffffffffffffffffffffffffffffff1667ffffffffffffffff881661327a565b90506000611e4648633b9aca00612259565b611e5090836132b7565b905060005a611e5f9088612ffc565b905080821115611e7b57611e7b611e768284612ffc565b612271565b5050505050505050565b8051600090611e9757610f4c8261229f565b60405162461bcd60e51b815260206004820152602a60248201527f48617368696e673a20756e6b6e6f776e206f757470757420726f6f742070726f60448201527f6f662076657273696f6e00000000000000000000000000000000000000000000606482015260840161061a565b919050565b80516020808301516040808501516060860151608087015160a08801519351600097611f3a9790969591016132cb565b604051602081830303815290604052805190602001209050919050565b60007f000000000000000000000000dc64a140aa3e981100a9beca4e685f962f0cf6c973ffffffffffffffffffffffffffffffffffffffff1663f4daa2916040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fc4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fe89190612fb4565b611ff29083613322565b421192915050565b600080600061200a8660006122e2565b905080612040576308c379a06000526020805278185361666543616c6c3a204e6f7420656e6f756768206761736058526064601cfd5b600080855160208701888b5af1979650505050505050565b600054610100900460ff166120d55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161061a565b60408051606081018252633b9aca00808252600060208301524367ffffffffffffffff169190920181905278010000000000000000000000000000000000000000000000000217600155565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091527f000000000000000000000000e7f1725e7734ce288f8367e1bb143e90bb3f051273ffffffffffffffffffffffffffffffffffffffff1663cc731b026040518163ffffffff1660e01b815260040160c060405180830381865afa1580156121be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121e2919061335f565b905090565b60006121fc6121f68585612300565b8361230f565b949350505050565b6000670de0b6b3a764000061224561221c8583613042565b61222e90670de0b6b3a76400006130aa565b61224085670de0b6b3a764000061311e565b61231e565b61224f908661311e565b6121fc9190613042565b6000818311612268578161226a565b825b9392505050565b6000805a90505b825a6122849083612ffc565b101561229a57612293826133fe565b9150612278565b505050565b80516020808301516040808501516060808701516080808901518551978801989098529386019490945284015282015260a081019190915260009060c001611f3a565b600080603f83619c4001026040850201603f5a021015949350505050565b6000818313612268578161226a565b6000818312612268578161226a565b600061226a670de0b6b3a7640000836123368661234f565b612340919061311e565b61234a9190613042565b612579565b60008082136123a05760405162461bcd60e51b815260206004820152600960248201527f554e444546494e45440000000000000000000000000000000000000000000000604482015260640161061a565b600060606123ad8461279e565b03609f8181039490941b90931c6c465772b2bbbb5f824b15207a3081018102606090811d6d0388eaa27412d5aca026815d636e018202811d6d0df99ac502031bf953eff472fdcc018202811d6d13cdffb29d51d99322bdff5f2211018202811d6d0a0f742023def783a307a986912e018202811d6d01920d8043ca89b5239253284e42018202811d6c0b7a86d7375468fac667a0a527016c29508e458543d8aa4df2abee7883018302821d6d0139601a2efabe717e604cbb4894018302821d6d02247f7a7b6594320649aa03aba1018302821d7fffffffffffffffffffffffffffffffffffffff73c0c716a594e00d54e3c4cbc9018302821d7ffffffffffffffffffffffffffffffffffffffdc7b88c420e53a9890533129f6f01830290911d7fffffffffffffffffffffffffffffffffffffff465fda27eb4d63ded474e5f832019091027ffffffffffffffff5f6af8f7b3396644f18e157960000000000000000000000000105711340daa0d5f769dba1915cef59f0815a5506027d0267a36c0c95b3975ab3ee5b203a7614a3f75373f047d803ae7b6687f2b393909302929092017d57115e47018c7177eebf7cd370a3356a1b7863008a5ae8028c72b88642840160ae1d92915050565b60007ffffffffffffffffffffffffffffffffffffffffffffffffdb731c958f34d94c182136125aa57506000919050565b680755bf798b4a1bf1e582126126025760405162461bcd60e51b815260206004820152600c60248201527f4558505f4f564552464c4f570000000000000000000000000000000000000000604482015260640161061a565b6503782dace9d9604e83901b059150600060606bb17217f7d1cf79abc9e3b39884821b056b80000000000000000000000001901d6bb17217f7d1cf79abc9e3b39881029093037fffffffffffffffffffffffffffffffffffffffdbf3ccf1604d263450f02a550481018102606090811d6d0277594991cfc85f6e2461837cd9018202811d7fffffffffffffffffffffffffffffffffffffe5adedaa1cb095af9e4da10e363c018202811d6db1bbb201f443cf962f1a1d3db4a5018202811d7ffffffffffffffffffffffffffffffffffffd38dc772608b0ae56cce01296c0eb018202811d6e05180bb14799ab47a8a8cb2a527d57016d02d16720577bd19bf614176fe9ea6c10fe68e7fd37d0007b713f765084018402831d9081019084017ffffffffffffffffffffffffffffffffffffffe2c69812cf03b0763fd454a8f7e010290911d6e0587f503bb6ea29d25fcb7401964500190910279d835ebba824c98fb31b83b2ca45c000000000000000000000000010574029d9dc38563c32e5c2f6dc192ee70ef65f9978af30260c3939093039290921c92915050565b60008082116127ef5760405162461bcd60e51b815260206004820152600960248201527f554e444546494e45440000000000000000000000000000000000000000000000604482015260640161061a565b5060016fffffffffffffffffffffffffffffffff821160071b82811c67ffffffffffffffff1060061b1782811c63ffffffff1060051b1782811c61ffff1060041b1782811c60ff10600390811b90911783811c600f1060021b1783811c909110821b1791821c111790565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff811681146128ab57600080fd5b50565b600082601f8301126128bf57600080fd5b813567ffffffffffffffff808211156128da576128da61285a565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156129205761292061285a565b8160405283815286602085880101111561293957600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060c0828403121561296b57600080fd5b60405160c0810167ffffffffffffffff828210818311171561298f5761298f61285a565b8160405282935084358352602085013591506129aa82612889565b816020840152604085013591506129c082612889565b816040840152606085013560608401526080850135608084015260a08501359150808211156129ee57600080fd5b506129fb858286016128ae565b60a0830152505092915050565b6000806000806000858703610100811215612a2257600080fd5b863567ffffffffffffffff80821115612a3a57600080fd5b612a468a838b01612959565b97506020890135965060a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc084011215612a7f57600080fd5b60408901955060e0890135925080831115612a9957600080fd5b828901925089601f840112612aad57600080fd5b8235915080821115612abe57600080fd5b508860208260051b8401011115612ad457600080fd5b959894975092955050506020019190565b60005b83811015612b00578181015183820152602001612ae8565b83811115612b0f576000848401525b50505050565b60008151808452612b2d816020860160208601612ae5565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061226a6020830184612b15565b600060208284031215612b8457600080fd5b5035919050565b600060208284031215612b9d57600080fd5b813567ffffffffffffffff811115612bb457600080fd5b6121fc84828501612959565b803567ffffffffffffffff81168114611f0557600080fd5b600080600060608486031215612bed57600080fd5b8335612bf881612889565b9250612c0660208501612bc0565b9150604084013567ffffffffffffffff811115612c2257600080fd5b612c2e868287016128ae565b9150509250925092565b80151581146128ab57600080fd5b600060208284031215612c5857600080fd5b813561226a81612c38565b600080600080600060a08688031215612c7b57600080fd5b8535612c8681612889565b945060208601359350612c9b60408701612bc0565b92506060860135612cab81612c38565b9150608086013567ffffffffffffffff811115612cc757600080fd5b612cd3888289016128ae565b9150509295509295909350565b8581528460208201527fffffffffffffffff0000000000000000000000000000000000000000000000008460c01b16604082015282151560f81b604882015260008251612d34816049850160208701612ae5565b919091016049019695505050505050565b80516fffffffffffffffffffffffffffffffff81168114611f0557600080fd5b600060808284031215612d7757600080fd5b6040516080810181811067ffffffffffffffff82111715612d9a57612d9a61285a565b6040528251612da881612889565b815260208381015190820152612dc060408401612d45565b6040820152612dd160608401612d45565b60608201529392505050565b600060a08284031215612def57600080fd5b60405160a0810181811067ffffffffffffffff82111715612e1257612e1261285a565b806040525082358152602083013560208201526040830135604082015260608301356060820152608083013560808201528091505092915050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8481526000602060808184015280608084015260018060a085015260c0840160c060408601528087825260e08601905060e08860051b87010191508860005b89811015612f7f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2088850301835281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18c3603018112612f3657600080fd5b8b01868101903567ffffffffffffffff811115612f5257600080fd5b803603821315612f6157600080fd5b612f6c868284612e4d565b9550505091850191908501908401612ed5565b50505080935050505082606083015295945050505050565b600060208284031215612fa957600080fd5b815161226a81612c38565b600060208284031215612fc657600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561300e5761300e612fcd565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261305157613051613013565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f8000000000000000000000000000000000000000000000000000000000000000831416156130a5576130a5612fcd565b500590565b6000808312837f8000000000000000000000000000000000000000000000000000000000000000018312811516156130e4576130e4612fcd565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01831381161561311857613118612fcd565b50500390565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008413600084138583048511828216161561315f5761315f612fcd565b7f8000000000000000000000000000000000000000000000000000000000000000600087128682058812818416161561319a5761319a612fcd565b600087129250878205871284841616156131b6576131b6612fcd565b878505871281841616156131cc576131cc612fcd565b505050929093029392505050565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0384138115161561321457613214612fcd565b827f800000000000000000000000000000000000000000000000000000000000000003841281161561324857613248612fcd565b50500190565b600067ffffffffffffffff80831681851680830382111561327157613271612fcd565b01949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156132b2576132b2612fcd565b500290565b6000826132c6576132c6613013565b500490565b868152600073ffffffffffffffffffffffffffffffffffffffff808816602084015280871660408401525084606083015283608083015260c060a083015261331660c0830184612b15565b98975050505050505050565b6000821982111561333557613335612fcd565b500190565b805163ffffffff81168114611f0557600080fd5b805160ff81168114611f0557600080fd5b600060c0828403121561337157600080fd5b60405160c0810181811067ffffffffffffffff821117156133945761339461285a565b6040526133a08361333a565b81526133ae6020840161334e565b60208201526133bf6040840161334e565b60408201526133d06060840161333a565b60608201526133e16080840161333a565b60808201526133f260a08401612d45565b60a08201529392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361342f5761342f612fcd565b506001019056fea164736f6c634300080f000a", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000000": "01", - "0x0000000000000000000000000000000000000000000000000000000000000001": "2600000000000000000000000000000000000000003b9aca00", - "0x0000000000000000000000000000000000000000000000000000000000000032": "dead" - }, - "key": "0x8f9c59785b25c2aaced68d553bb192545553e42593130ee4862efe93a6040df8" - }, - "0xa85233c63b9ee964add6f2cffe00fd84eb32338f": { - "balance": "0", - "nonce": 1, - "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "0xe7d30c7952210033e3cfd18ff7d7741d27b94e7cbaa9ddfcab4a59bbcb34746f", - "code": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c80635269aa1b1461004657806354fd4d5014610083578063ee9a31a2146100cc575b600080fd5b61005961005436600461033a565b6100f3565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6100bf6040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161007a9190610434565b6100597f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f81565b600073ffffffffffffffffffffffffffffffffffffffff841661019c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f4b726f6d614d696e7461626c654552433230466163746f72793a206d7573742060448201527f70726f766964652072656d6f746520746f6b656e206164647265737300000000606482015260840160405180910390fd5b60007f0000000000000000000000000165878a594ca255338adfa4d48449f69242eb8f8585856040516101ce90610253565b6101db949392919061044e565b604051809103906000f0801580156101f7573d6000803e3d6000fd5b5060405133815290915073ffffffffffffffffffffffffffffffffffffffff80871691908316907f16f14001f89df9d8ecc68e7cbb61373ece9025038b9df30bea3635fc0e4701a99060200160405180910390a3949350505050565b611441806104a583390190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f8301126102a057600080fd5b813567ffffffffffffffff808211156102bb576102bb610260565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561030157610301610260565b8160405283815286602085880101111561031a57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060006060848603121561034f57600080fd5b833573ffffffffffffffffffffffffffffffffffffffff8116811461037357600080fd5b9250602084013567ffffffffffffffff8082111561039057600080fd5b61039c8783880161028f565b935060408601359150808211156103b257600080fd5b506103bf8682870161028f565b9150509250925092565b6000815180845260005b818110156103ef576020818501810151868301820152016103d3565b81811115610401576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061044760208301846103c9565b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152506080604083015261048760808301856103c9565b828103606084015261049981856103c9565b97965050505050505056fe60c06040523480156200001157600080fd5b50604051620014413803806200144183398101604081905262000034916200015a565b8181600362000044838262000279565b50600462000053828262000279565b5050506001600160a01b0392831660805250501660a05262000345565b80516001600160a01b03811681146200008857600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620000b557600080fd5b81516001600160401b0380821115620000d257620000d26200008d565b604051601f8301601f19908116603f01168101908282118183101715620000fd57620000fd6200008d565b816040528381526020925086838588010111156200011a57600080fd5b600091505b838210156200013e57858201830151818301840152908201906200011f565b83821115620001505760008385830101525b9695505050505050565b600080600080608085870312156200017157600080fd5b6200017c8562000070565b93506200018c6020860162000070565b60408601519093506001600160401b0380821115620001aa57600080fd5b620001b888838901620000a3565b93506060870151915080821115620001cf57600080fd5b50620001de87828801620000a3565b91505092959194509250565b600181811c90821680620001ff57607f821691505b6020821081036200022057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200027457600081815260208120601f850160051c810160208610156200024f5750805b601f850160051c820191505b8181101562000270578281556001016200025b565b5050505b505050565b81516001600160401b038111156200029557620002956200008d565b620002ad81620002a68454620001ea565b8462000226565b602080601f831160018114620002e55760008415620002cc5750858301515b600019600386901b1c1916600185901b17855562000270565b600085815260208120601f198616915b828110156200031657888601518255948401946001909101908401620002f5565b5085821015620003355787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a0516110c862000379600039600081816103160152818161050a01526106270152600061014d01526110c86000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c806340c10f19116100b25780639dc29fac11610081578063a9059cbb11610066578063a9059cbb146102b8578063dd62ed3e146102cb578063ee9a31a21461031157600080fd5b80639dc29fac14610292578063a457c2d7146102a557600080fd5b806340c10f191461020357806354fd4d501461021857806370a082311461025457806395d89b411461028a57600080fd5b806318160ddd116100ee57806318160ddd146101bc57806323b872dd146101ce578063313ce567146101e157806339509351146101f057600080fd5b806301ffc9a714610120578063033964be1461014857806306fdde0314610194578063095ea7b3146101a9575b600080fd5b61013361012e366004610e90565b610338565b60405190151581526020015b60405180910390f35b61016f7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161013f565b61019c6103d8565b60405161013f9190610ed9565b6101336101b7366004610f75565b61046a565b6002545b60405190815260200161013f565b6101336101dc366004610f9f565b610482565b6040516012815260200161013f565b6101336101fe366004610f75565b6104a6565b610216610211366004610f75565b6104f2565b005b61019c6040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6101c0610262366004610fdb565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b61019c610600565b6102166102a0366004610f75565b61060f565b6101336102b3366004610f75565b61070c565b6101336102c6366004610f75565b6107c3565b6101c06102d9366004610ff6565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b61016f7f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f30a0c5a9000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000084168214806103d057507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b6060600380546103e790611029565b80601f016020809104026020016040519081016040528092919081815260200182805461041390611029565b80156104605780601f1061043557610100808354040283529160200191610460565b820191906000526020600020905b81548152906001019060200180831161044357829003601f168201915b5050505050905090565b6000336104788185856107d1565b5060019392505050565b600033610490858285610951565b61049b858585610a0e565b506001949350505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919061047890829086906104ed90879061107c565b6107d1565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146105a25760405162461bcd60e51b815260206004820152603160248201527f4b726f6d614d696e7461626c6545524332303a206f6e6c79206272696467652060448201527f63616e206d696e7420616e64206275726e00000000000000000000000000000060648201526084015b60405180910390fd5b6105ac8282610c2f565b8173ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885826040516105f491815260200190565b60405180910390a25050565b6060600480546103e790611029565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146106ba5760405162461bcd60e51b815260206004820152603160248201527f4b726f6d614d696e7461626c6545524332303a206f6e6c79206272696467652060448201527f63616e206d696e7420616e64206275726e0000000000000000000000000000006064820152608401610599565b6106c48282610d08565b8173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040516105f491815260200190565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107b65760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610599565b61049b82868684036107d1565b600033610478818585610a0e565b73ffffffffffffffffffffffffffffffffffffffff83166108595760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610599565b73ffffffffffffffffffffffffffffffffffffffff82166108e25760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610599565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610a0857818110156109fb5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610599565b610a0884848484036107d1565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610a975760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610599565b73ffffffffffffffffffffffffffffffffffffffff8216610b205760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610599565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610bbc5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610599565b73ffffffffffffffffffffffffffffffffffffffff848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610a08565b73ffffffffffffffffffffffffffffffffffffffff8216610c925760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610599565b8060026000828254610ca4919061107c565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216610d915760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610599565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090205481811015610e2d5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610599565b73ffffffffffffffffffffffffffffffffffffffff83166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610944565b600060208284031215610ea257600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610ed257600080fd5b9392505050565b600060208083528351808285015260005b81811015610f0657858101830151858201604001528201610eea565b81811115610f18576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610f7057600080fd5b919050565b60008060408385031215610f8857600080fd5b610f9183610f4c565b946020939093013593505050565b600080600060608486031215610fb457600080fd5b610fbd84610f4c565b9250610fcb60208501610f4c565b9150604084013590509250925092565b600060208284031215610fed57600080fd5b610ed282610f4c565b6000806040838503121561100957600080fd5b61101283610f4c565b915061102060208401610f4c565b90509250929050565b600181811c9082168061103d57607f821691505b602082108103611076577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600082198211156110b6577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b50019056fea164736f6c634300080f000aa164736f6c634300080f000a", - "key": "0xea5bcd16c6bba173a130ee9dbf9a8d7e4a9f75be48c7f605934587f6ccd1eb76" - }, - "0xb0b2b93cc0fddfab5e67f762d18c30d4ec63459d": { - "balance": "115792089237316195423570985008687907853269984665640564039455583849457825464927", - "nonce": 2, - "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "key": "0xd3c13149613971fd1612f4ff2f5f219507f0b6897ddf8aa1a7ad5dc3b816cb46" - }, "0xb7f8bc63bbcad18155201308c8f3540b07f84f5e": { "balance": "0", "nonce": 1, @@ -465,35 +518,24 @@ }, "key": "0xad6ff7dc4f5626bc6b49eb92a9bbcd72320506ab7bfa9f543c096f7a28980df6" }, - "0xc5a5c42992decbae36851359345fe25997f5c42d": { - "balance": "0", - "nonce": 1, - "root": "0x821e2556a290c86405f8160a2d662042a431ba456b9db265c79bb837c04be5f0", - "codeHash": "0x9df5a7cdcb6bd8923cbea0b29d9f61fc8a290503488353e9c788e98be4277ff2", - "code": "0x6080604052600436106101745760003560e01c80639e45e8f4116100cb578063cf8e5cf01161007f578063e4a3011611610059578063e4a30116146104bb578063e6646723146104db578063f4daa291146104fb57600080fd5b8063cf8e5cf014610466578063d1de856c14610486578063dcec3348146104a657600080fd5b8063a48ea6de116100b0578063a48ea6de146103f2578063b0ea09a814610412578063b98debbf1461043257600080fd5b80639e45e8f41461031a578063a25ae5571461037357600080fd5b80635a045f781161012d57806370872aa51161010757806370872aa5146102ce5780637f006420146102e4578063887862721461030457600080fd5b80635a045f781461028f57806369f16eec146102a45780636abcf563146102b957600080fd5b80634599c7881161015e5780634599c788146101f0578063529933df1461020557806354fd4d501461023957600080fd5b80622134cc1461017957806333727c4d146101c0575b600080fd5b34801561018557600080fd5b506101ad7f000000000000000000000000000000000000000000000000000000000000000281565b6040519081526020015b60405180910390f35b3480156101cc57600080fd5b506101e06101db3660046115f1565b61052f565b60405190151581526020016101b7565b3480156101fc57600080fd5b506101ad61059d565b34801561021157600080fd5b506101ad7f000000000000000000000000000000000000000000000000000000000000000481565b34801561024557600080fd5b506102826040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516101b7919061160a565b6102a261029d36600461167d565b610610565b005b3480156102b057600080fd5b506101ad610c17565b3480156102c557600080fd5b506003546101ad565b3480156102da57600080fd5b506101ad60015481565b3480156102f057600080fd5b506101ad6102ff3660046115f1565b610c29565b34801561031057600080fd5b506101ad60025481565b34801561032657600080fd5b5061034e7f000000000000000000000000610178da211fef7d417bc0e6fed39f05609ad78881565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b7565b34801561037f57600080fd5b5061039361038e3660046115f1565b610e09565b60408051825173ffffffffffffffffffffffffffffffffffffffff16815260208084015190820152828201516fffffffffffffffffffffffffffffffff90811692820192909252606092830151909116918101919091526080016101b7565b3480156103fe57600080fd5b506101ad61040d3660046115f1565b610ec6565b34801561041e57600080fd5b5061034e61042d3660046115f1565b610f32565b34801561043e57600080fd5b5061034e7f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc981565b34801561047257600080fd5b506103936104813660046115f1565b610f74565b34801561049257600080fd5b506101ad6104a13660046115f1565b610fb3565b3480156104b257600080fd5b506101ad610ffb565b3480156104c757600080fd5b506102a26104d63660046116af565b611041565b3480156104e757600080fd5b506102a26104f63660046116f6565b61125a565b34801561050757600080fd5b506101ad7f000000000000000000000000000000000000000000000000000000000000007881565b6000427f0000000000000000000000000000000000000000000000000000000000000078600384815481106105665761056661172f565b600091825260209091206002600390920201015461059691906fffffffffffffffffffffffffffffffff1661178d565b1092915050565b6003546000901561060757600380546105b8906001906117a5565b815481106105c8576105c861172f565b600091825260209091206003909102016002015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16919050565b6001545b905090565b60007f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc973ffffffffffffffffffffffffffffffffffffffff16633a5490466040518163ffffffff1660e01b8152600401602060405180830381865afa15801561067d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a191906117bc565b905073ffffffffffffffffffffffffffffffffffffffff80821614610776573373ffffffffffffffffffffffffffffffffffffffff8216146107765760405162461bcd60e51b815260206004820152604260248201527f4c324f75747075744f7261636c653a206f6e6c7920746865206e65787420736560448201527f6c65637465642076616c696461746f722063616e207375626d6974206f75747060648201527f7574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b61077e610ffb565b84146108185760405162461bcd60e51b815260206004820152604860248201527f4c324f75747075744f7261636c653a20626c6f636b206e756d626572206d757360448201527f7420626520657175616c20746f206e65787420657870656374656420626c6f6360648201527f6b206e756d626572000000000000000000000000000000000000000000000000608482015260a40161076d565b4261082285610fb3565b106108955760405162461bcd60e51b815260206004820152603560248201527f4c324f75747075744f7261636c653a2063616e6e6f74207375626d6974204c3260448201527f206f757470757420696e20746865206675747572650000000000000000000000606482015260840161076d565b846109085760405162461bcd60e51b815260206004820152603c60248201527f4c324f75747075744f7261636c653a204c3220636865636b706f696e74206f7560448201527f747075742063616e6e6f7420626520746865207a65726f206861736800000000606482015260840161076d565b82158015906109175750814015155b156109b857828240146109b85760405162461bcd60e51b815260206004820152604960248201527f4c324f75747075744f7261636c653a20626c6f636b206861736820646f65732060448201527f6e6f74206d61746368207468652068617368206174207468652065787065637460648201527f6564206865696768740000000000000000000000000000000000000000000000608482015260a40161076d565b60006109c360035490565b60408051608081018252338152602081018981526fffffffffffffffffffffffffffffffff428181168486019081528b831660608601908152600380546001810182556000829052965196027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b8101805473ffffffffffffffffffffffffffffffffffffffff989098167fffffffffffffffffffffffff00000000000000000000000000000000000000009098169790971790965593517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c86015551925182167001000000000000000000000000000000000292909116919091177fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d9092019190915590519192508691839189917f457b4388026260019ae0b0b4f16c98235d74fe7359be469bdcba16e6d0d4968991610b209190815260200190565b60405180910390a473ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc91663d38dc7ee82610b8f7f00000000000000000000000000000000000000000000000000000000000000784261178d565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815260048101929092526fffffffffffffffffffffffffffffffff166024820152604401600060405180830381600087803b158015610bf757600080fd5b505af1158015610c0b573d6000803e3d6000fd5b50505050505050505050565b60035460009061060b906001906117a5565b6000610c3361059d565b821115610cce5760405162461bcd60e51b815260206004820152604960248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f7420666f72206120626c6f636b207468617420686173206e6f74206265656e2060648201527f7375626d69747465640000000000000000000000000000000000000000000000608482015260a40161076d565b600354610d695760405162461bcd60e51b815260206004820152604760248201527f4c324f75747075744f7261636c653a2063616e6e6f7420676574206f7574707560448201527f74206173206e6f206f7574707574732068617665206265656e207375626d697460648201527f7465642079657400000000000000000000000000000000000000000000000000608482015260a40161076d565b6003546000905b80821015610e025760006002610d86838561178d565b610d9091906117e0565b90508460038281548110610da657610da661172f565b600091825260209091206003909102016002015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff161015610df857610df181600161178d565b9250610dfc565b8091505b50610d70565b5092915050565b60408051608081018252600080825260208201819052918101829052606081019190915260038281548110610e4057610e4061172f565b6000918252602091829020604080516080810182526003909302909101805473ffffffffffffffffffffffffffffffffffffffff1683526001810154938301939093526002909201546fffffffffffffffffffffffffffffffff808216938301939093527001000000000000000000000000000000009004909116606082015292915050565b60007f000000000000000000000000000000000000000000000000000000000000007860038381548110610efc57610efc61172f565b6000918252602090912060026003909202010154610f2c91906fffffffffffffffffffffffffffffffff1661178d565b92915050565b600060038281548110610f4757610f4761172f565b600091825260209091206003909102015473ffffffffffffffffffffffffffffffffffffffff1692915050565b6040805160808101825260008082526020820181905291810182905260608101919091526003610fa383610c29565b81548110610e4057610e4061172f565b60007f000000000000000000000000000000000000000000000000000000000000000260015483610fe491906117a5565b610fee919061181b565b600254610f2c919061178d565b60035460009015611039577f000000000000000000000000000000000000000000000000000000000000000461102f61059d565b61060b919061178d565b61060b61059d565b600054610100900460ff16158080156110615750600054600160ff909116105b8061107b5750303b15801561107b575060005460ff166001145b6110ed5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161076d565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561114b57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b428211156111e85760405162461bcd60e51b8152602060048201526044602482018190527f4c324f75747075744f7261636c653a207374617274696e67204c322074696d65908201527f7374616d70206d757374206265206c657373207468616e2063757272656e742060648201527f74696d6500000000000000000000000000000000000000000000000000000000608482015260a40161076d565b60028290556001839055801561125557600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000610178da211fef7d417bc0e6fed39f05609ad788161461132b5760405162461bcd60e51b815260206004820152604160248201527f4c324f75747075744f7261636c653a206f6e6c792074686520636f6c6f73736560448201527f756d20636f6e74726163742063616e207265706c61636520616e206f7574707560648201527f7400000000000000000000000000000000000000000000000000000000000000608482015260a40161076d565b73ffffffffffffffffffffffffffffffffffffffff81166113b45760405162461bcd60e51b815260206004820152603060248201527f4c324f75747075744f7261636c653a207375626d69747465722061646472657360448201527f732063616e6e6f74206265207a65726f00000000000000000000000000000000606482015260840161076d565b60035483106114515760405162461bcd60e51b815260206004820152604660248201527f4c324f75747075744f7261636c653a2063616e6e6f74207265706c616365206160448201527f6e206f757470757420616674657220746865206c6174657374206f757470757460648201527f20696e6465780000000000000000000000000000000000000000000000000000608482015260a40161076d565b6000600384815481106114665761146661172f565b6000918252602090912060039091020160028101549091507f0000000000000000000000000000000000000000000000000000000000000078906114bc906fffffffffffffffffffffffffffffffff16426117a5565b106115555760405162461bcd60e51b815260206004820152604860248201527f4c324f75747075744f7261636c653a2063616e6e6f74207265706c616365206160448201527f6e206f757470757420746861742068617320616c7265616479206265656e206660648201527f696e616c697a6564000000000000000000000000000000000000000000000000608482015260a40161076d565b6001810183905580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831617815560405183815284907fa1b831bb8b6b242db6d0988a6d21f869c610de9f703a5e45e1b7d3dc3137b9069060200160405180910390a250505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60006020828403121561160357600080fd5b5035919050565b600060208083528351808285015260005b818110156116375785810183015185820160400152820161161b565b81811115611649576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b6000806000806080858703121561169357600080fd5b5050823594602084013594506040840135936060013592509050565b600080604083850312156116c257600080fd5b50508035926020909101359150565b73ffffffffffffffffffffffffffffffffffffffff811681146116f357600080fd5b50565b60008060006060848603121561170b57600080fd5b83359250602084013591506040840135611724816116d1565b809150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156117a0576117a061175e565b500190565b6000828210156117b7576117b761175e565b500390565b6000602082840312156117ce57600080fd5b81516117d9816116d1565b9392505050565b600082611816577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156118535761185361175e565b50029056fea164736f6c634300080f000a", - "storage": { - "0x0000000000000000000000000000000000000000000000000000000000000000": "01" - }, - "key": "0xd76a9e3251db48a3dc95c22482b0e33783cfd46d1b333e3b373cdf5adece583b" - }, - "0xc6e7df5e7b4f2a278906862b61205850344d4e7d": { + "0xc3e53f4d16ae77db1c982e75a937b9f60fe63690": { "balance": "0", "nonce": 1, "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "0xdcc518c7fadf757cf1e4e6a15d0ac839b78d9dbaa999e18b0ae05ede6535b58c", - "code": "0x6080604052600436106100b55760003560e01c80637f46ddb2116100695780638f601f661161004e5780638f601f6614610298578063927ede2d146102db578063e11013dd1461030f57600080fd5b80637f46ddb21461021f578063870876231461027857600080fd5b80631635f5fd1161009a5780631635f5fd1461018d578063540abf73146101a057806354fd4d50146101c057600080fd5b80630166a07a1461015a57806309fc88431461017a57600080fd5b3661015557333b156101345760405162461bcd60e51b815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f4100000000000000000060648201526084015b60405180910390fd5b61015333333462030d4060405180602001604052806000815250610322565b005b600080fd5b34801561016657600080fd5b50610153610175366004611973565b610547565b610153610188366004611a24565b610943565b61015361019b366004611a77565b610a00565b3480156101ac57600080fd5b506101536101bb366004611aea565b610e7a565b3480156101cc57600080fd5b506102096040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6040516102169190611bd7565b60405180910390f35b34801561022b57600080fd5b506102537f000000000000000000000000420000000000000000000000000000000000000981565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610216565b34801561028457600080fd5b50610153610293366004611bea565b610ec8565b3480156102a457600080fd5b506102cd6102b3366004611c6d565b600060208181529281526040808220909352908152205481565b604051908152602001610216565b3480156102e757600080fd5b506102537f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570781565b61015361031d366004611ca6565b610f82565b8234146103975760405162461bcd60e51b815260206004820152603e60248201527f5374616e646172644272696467653a206272696467696e6720455448206d757360448201527f7420696e636c7564652073756666696369656e74204554482076616c75650000606482015260840161012b565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f2849b43074093a05396b6f2a937dee8565b15a48a7b3d4bffb732a5017380af585846040516103f6929190611d09565b60405180910390a37f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570773ffffffffffffffffffffffffffffffffffffffff16633dbb202b847f0000000000000000000000004200000000000000000000000000000000000009631635f5fd60e01b8989898860405160240161047b9493929190611d22565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e086901b909216825261050e92918890600401611d6b565b6000604051808303818588803b15801561052757600080fd5b505af115801561053b573d6000803e3d6000fd5b50505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f8757071614801561066557507f000000000000000000000000420000000000000000000000000000000000000973ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570773ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015610629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064d9190611db0565b73ffffffffffffffffffffffffffffffffffffffff16145b6106fd5760405162461bcd60e51b815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a40161012b565b61070687610fcb565b1561083a576107158787610ffd565b6107ad5760405162461bcd60e51b815260206004820152604760248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204b726f6d61204d696e7461626c65204552433230206c6f636160648201527f6c20746f6b656e00000000000000000000000000000000000000000000000000608482015260a40161012b565b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590528816906340c10f1990604401600060405180830381600087803b15801561081d57600080fd5b505af1158015610831573d6000803e3d6000fd5b505050506108b8565b73ffffffffffffffffffffffffffffffffffffffff808816600090815260208181526040808320938a1683529290522054610876908490611dfc565b73ffffffffffffffffffffffffffffffffffffffff808916600081815260208181526040808320948c16835293905291909120919091556108b89085856110a4565b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167fd59c65b35445225835c83f50b6ede06a7be047d22e357073e250d9af537518cd878787876040516109329493929190611e5c565b60405180910390a450505050505050565b333b156109b85760405162461bcd60e51b815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f41000000000000000000606482015260840161012b565b6109fb3333348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061032292505050565b505050565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570716148015610b1e57507f000000000000000000000000420000000000000000000000000000000000000973ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570773ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ae2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b069190611db0565b73ffffffffffffffffffffffffffffffffffffffff16145b610bb65760405162461bcd60e51b815260206004820152604160248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20746865206f7468657220627269646760648201527f6500000000000000000000000000000000000000000000000000000000000000608482015260a40161012b565b823414610c2b5760405162461bcd60e51b815260206004820152603a60248201527f5374616e646172644272696467653a20616d6f756e742073656e7420646f657360448201527f206e6f74206d6174636820616d6f756e74207265717569726564000000000000606482015260840161012b565b3073ffffffffffffffffffffffffffffffffffffffff851603610cb65760405162461bcd60e51b815260206004820152602360248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f207360448201527f656c660000000000000000000000000000000000000000000000000000000000606482015260840161012b565b7f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570773ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610d775760405162461bcd60e51b815260206004820152602860248201527f5374616e646172644272696467653a2063616e6e6f742073656e6420746f206d60448201527f657373656e676572000000000000000000000000000000000000000000000000606482015260840161012b565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f31b2166ff604fc5672ea5df08a78081d2bc6d746cadce880747f3643d819e83d858585604051610dd893929190611e92565b60405180910390a36000610dfd855a8660405180602001604052806000815250611178565b905080610e725760405162461bcd60e51b815260206004820152602360248201527f5374616e646172644272696467653a20455448207472616e736665722066616960448201527f6c65640000000000000000000000000000000000000000000000000000000000606482015260840161012b565b505050505050565b610ebf87873388888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061119492505050565b50505050505050565b333b15610f3d5760405162461bcd60e51b815260206004820152603760248201527f5374616e646172644272696467653a2066756e6374696f6e2063616e206f6e6c60448201527f792062652063616c6c65642066726f6d20616e20454f41000000000000000000606482015260840161012b565b610e7286863333888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061119492505050565b610fc53385348686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061032292505050565b50505050565b6000610ff7827f30a0c5a90000000000000000000000000000000000000000000000000000000061152f565b92915050565b60008273ffffffffffffffffffffffffffffffffffffffff1663033964be6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561104a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106e9190611db0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614905092915050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109fb9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611552565b600080600080845160208601878a8af19150505b949350505050565b61119d87610fcb565b156112d1576111ac8787610ffd565b6112445760405162461bcd60e51b815260206004820152604760248201527f5374616e646172644272696467653a2077726f6e672072656d6f746520746f6b60448201527f656e20666f72204b726f6d61204d696e7461626c65204552433230206c6f636160648201527f6c20746f6b656e00000000000000000000000000000000000000000000000000608482015260a40161012b565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015260248201859052881690639dc29fac90604401600060405180830381600087803b1580156112b457600080fd5b505af11580156112c8573d6000803e3d6000fd5b50505050611361565b6112f373ffffffffffffffffffffffffffffffffffffffff8816863086611647565b73ffffffffffffffffffffffffffffffffffffffff808816600090815260208181526040808320938a168352929052205461132f908490611eb5565b73ffffffffffffffffffffffffffffffffffffffff808916600090815260208181526040808320938b16835292905220555b8473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff167f7ff126db8024424bbfd9826e8ab82ff59136289ea440b04b39a0df1b03b9cabf8787866040516113d993929190611ecd565b60405180910390a47f0000000000000000000000005fc8d32690cc91d4c39d9d3abcbd16989f87570773ffffffffffffffffffffffffffffffffffffffff16633dbb202b7f0000000000000000000000004200000000000000000000000000000000000009630166a07a60e01b898b8a8a8a8960405160240161146196959493929190611f02565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009485161790525160e085901b90921682526114f492918790600401611d6b565b600060405180830381600087803b15801561150e57600080fd5b505af1158015611522573d6000803e3d6000fd5b5050505050505050505050565b600061153a836116a5565b801561154b575061154b8383611709565b9392505050565b60006115b4826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166117d89092919063ffffffff16565b90508051600014806115d55750808060200190518101906115d59190611f5d565b6109fb5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161012b565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052610fc59085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016110f6565b60006116d1827f01ffc9a700000000000000000000000000000000000000000000000000000000611709565b8015610ff75750611702827fffffffff00000000000000000000000000000000000000000000000000000000611709565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156117c1575060208210155b80156117cd5750600081115b979650505050505050565b606061118c8484600085856000808673ffffffffffffffffffffffffffffffffffffffff16858760405161180c9190611f7f565b60006040518083038185875af1925050503d8060008114611849576040519150601f19603f3d011682016040523d82523d6000602084013e61184e565b606091505b50915091506117cd87838387606083156118d65782516000036118cf5773ffffffffffffffffffffffffffffffffffffffff85163b6118cf5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161012b565b508161118c565b61118c83838151156118eb5781518083602001fd5b8060405162461bcd60e51b815260040161012b9190611bd7565b73ffffffffffffffffffffffffffffffffffffffff8116811461192757600080fd5b50565b60008083601f84011261193c57600080fd5b50813567ffffffffffffffff81111561195457600080fd5b60208301915083602082850101111561196c57600080fd5b9250929050565b600080600080600080600060c0888a03121561198e57600080fd5b873561199981611905565b965060208801356119a981611905565b955060408801356119b981611905565b945060608801356119c981611905565b93506080880135925060a088013567ffffffffffffffff8111156119ec57600080fd5b6119f88a828b0161192a565b989b979a50959850939692959293505050565b803563ffffffff81168114611a1f57600080fd5b919050565b600080600060408486031215611a3957600080fd5b611a4284611a0b565b9250602084013567ffffffffffffffff811115611a5e57600080fd5b611a6a8682870161192a565b9497909650939450505050565b600080600080600060808688031215611a8f57600080fd5b8535611a9a81611905565b94506020860135611aaa81611905565b935060408601359250606086013567ffffffffffffffff811115611acd57600080fd5b611ad98882890161192a565b969995985093965092949392505050565b600080600080600080600060c0888a031215611b0557600080fd5b8735611b1081611905565b96506020880135611b2081611905565b95506040880135611b3081611905565b945060608801359350611b4560808901611a0b565b925060a088013567ffffffffffffffff8111156119ec57600080fd5b60005b83811015611b7c578181015183820152602001611b64565b83811115610fc55750506000910152565b60008151808452611ba5816020860160208601611b61565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061154b6020830184611b8d565b60008060008060008060a08789031215611c0357600080fd5b8635611c0e81611905565b95506020870135611c1e81611905565b945060408701359350611c3360608801611a0b565b9250608087013567ffffffffffffffff811115611c4f57600080fd5b611c5b89828a0161192a565b979a9699509497509295939492505050565b60008060408385031215611c8057600080fd5b8235611c8b81611905565b91506020830135611c9b81611905565b809150509250929050565b60008060008060608587031215611cbc57600080fd5b8435611cc781611905565b9350611cd560208601611a0b565b9250604085013567ffffffffffffffff811115611cf157600080fd5b611cfd8782880161192a565b95989497509550505050565b82815260406020820152600061118c6040830184611b8d565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152611d616080830184611b8d565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff84168152606060208201526000611d9a6060830185611b8d565b905063ffffffff83166040830152949350505050565b600060208284031215611dc257600080fd5b815161154b81611905565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082821015611e0e57611e0e611dcd565b500390565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152606060408201526000611d61606083018486611e13565b838152604060208201526000611eac604083018486611e13565b95945050505050565b60008219821115611ec857611ec8611dcd565b500190565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201526000611eac6060830184611b8d565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a0830152611f5160c0830184611b8d565b98975050505050505050565b600060208284031215611f6f57600080fd5b8151801515811461154b57600080fd5b60008251611f91818460208701611b61565b919091019291505056fea164736f6c634300080f000a", - "key": "0x4ea7799478a7af2a47ba555f04aec4ae4ba240bf410d7c859c34c310f0413892" + "codeHash": "0xc4825f5ac697c051a52eaac72a6c24043b771675aa90db220fe7fa7d0e8a7c13", + "code": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80634292dc3e1461003b57806354fd4d5014610063575b600080fd5b61004e61004936600461576f565b6100ac565b60405190151581526020015b60405180910390f35b61009f6040518060400160405280600581526020017f302e312e3500000000000000000000000000000000000000000000000000000081525081565b60405161005a91906157e3565b60006100b661560c565b848460008181106100c9576100c9615856565b9050602002013570ffffffffffffffffffffffffffffffffff16816000600681106100f6576100f6615856565b602002015260888585600181811061011057610110615856565b90506020020135600116901b60888686600081811061013157610131615856565b90506020020135901c61014491906158b4565b60208201528484600281811061015c5761015c615856565b9050602002013570ffffffffffffffffffffffffffffffffff168160026006811061018957610189615856565b60200201526088858560038181106101a3576101a3615856565b90506020020135600116901b6088868660028181106101c4576101c4615856565b90506020020135901c6101d791906158b4565b606080830191909152608084811c908301526fffffffffffffffffffffffffffffffff841660a08301526040805160028082529281019091526000918291829182918291816020015b60408051808201909152600080825260208201528152602001906001900390816102205750506040805160028082526060820190925291925060009190602082015b61026a61562a565b81526020019060019003908161026257905050905061028a8d8d896104fb565b85519399509097509095509350869083906000906102aa576102aa615856565b6020026020010151600001818152505083826000815181106102ce576102ce615856565b6020026020010151602001818152505084826001815181106102f2576102f2615856565b60200260200101516000018181525050828260018151811061031657610316615856565b6020026020010151602001818152505061032e614a63565b8160008151811061034157610341615856565b6020026020010181905250610354614b0e565b8160018151811061036757610367615856565b602002602001018190525061037c8282614bb5565b6103905760009750505050505050506104f2565b8a8a60008181106103a3576103a3615856565b90506020020135826000815181106103bd576103bd615856565b6020908102919091010151528a8a60018181106103dc576103dc615856565b90506020020135826000815181106103f6576103f6615856565b602002602001015160200181815250508a8a600281811061041957610419615856565b905060200201358260018151811061043357610433615856565b6020908102919091010151528a8a600381811061045257610452615856565b905060200201358260018151811061046c5761046c615856565b60200260200101516020018181525050610484614a63565b8160008151811061049757610497615856565b60200260200101819052506104aa614b0e565b816001815181106104bd576104bd615856565b60200260200101819052506104d28282614bb5565b6104e65760009750505050505050506104f2565b60019750505050505050505b95945050505050565b60008060008061050961564f565b61051161566e565b6000806105667f2754b04f3f510d0e86a0d0e811f0fc16f92b722514e1729066d2abf90811d6f27f1816b0f9909a5a979bd34c559e57b4096bee5cce7eb668bc0a9805677f40dc858b845b6020020151614e89565b90925090506105c07f174fa57071f8f6e53fcb31a5ecc33274ec76e4e186eeb0b64255d2f314cd50b27f1c399365e85e4de2761ebcf350da85ff4518cc82f7cef64a477a7a5fd11d4a448b60015b60200201518585614eef565b90925090506106127f259a4d5cd83279b6dc9ca2008b669f82e91f23804e2524c5087a2452d52c33bd7f303abddb7ae0f35e3a6bd39314b347c3c3a433f72833dda1998ad2176258baa38b60026105b4565b90925090506106647f252b158900f31a7c0c00b924e7d3c8d61a60c5e9fd2b83251ba73d1dc0b680f57f29c8c2b3f0d74267bc2b0f9f3568838cdb0eee4719391790d93d0015c00ce5af8b60036105b4565b90925090506106b67f0c25f9f3c38b6a128d7d38c5625a3976d389b5f9f33098bb419968e4d18e150e7f21fb777462c7f4af71940423babc7f882f0c97be9620ef84f6f11974ee0edb8e8b60046105b4565b90925090506107087f2280a0fd7dbf95c450830906ffc607a373d5b9b56b9101138e925ad557eb355a7f0697ab7e9a5377e2759ab6d1283301ccae9c72bad14946a9513ee19be1ec825e8b60056105b4565b6020860152845261073b7f00b54142d3712f03ff5c15914a3dce82c0d8a8d537e165e2342048adf14e34aa846000614f3b565b8351602085015161074f9190856002614f87565b600091505b600482116107ed576107db8b8b61076c8560026158fb565b6107779060006158b4565b81811061078657610786615856565b905060200201358c8c85600261079c91906158fb565b6107a79060016158b4565b8181106107b6576107b6615856565b90506020020135858560036107cb91906158fb565b6107d69060056158b4565b614f87565b816107e581615938565b925050610754565b6107f8836014614ff7565b6040850152600091505b600d8211610896576108848b8b61081a8560026158fb565b61082590600a6158b4565b81811061083457610834615856565b905060200201358c8c85600261084a91906158fb565b61085590600b6158b4565b81811061086457610864615856565b905060200201358585600361087991906158fb565b6107d69060016158b4565b8161088e81615938565b925050610802565b6108a183602b614ff7565b60608501526108b1836001614ff7565b6080850152600091505b600982116109205761090e8b8b6108d38560026158fb565b6108de9060266158b4565b8181106108ed576108ed615856565b905060200201358c8c85600261090391906158fb565b6108559060276158b4565b8161091881615938565b9250506108bb565b61092b83601f614ff7565b60a0850152600091505b6003821161099a576109888b8b61094d8560026158fb565b61095890603a6158b4565b81811061096757610967615856565b905060200201358c8c85600261097d91906158fb565b61085590603b6158b4565b8161099281615938565b925050610935565b6109a583600d614ff7565b60c0850152600091505b60468211610a1857610a068b8b6109c78560016158fb565b6109d29060426158b4565b8181106109e1576109e1615856565b90506020020135848460026109f691906158fb565b610a019060016158b4565b614f3b565b81610a1081615938565b9250506109af565b610a2383608f614ff7565b60e0850152600091505b60038211610a9257610a808b8b610a458560026158fb565b610a509060896158b4565b818110610a5f57610a5f615856565b905060200201358c8c856002610a7591906158fb565b61085590608a6158b4565b81610a8a81615938565b925050610a2d565b610a9d83600d614ff7565b61010085015260c0840151600080516020615a46833981519152907f1dba8b5bdd64ef6ce29a9039aca3c0e524395c43b9227b96c75090cc6cc7ec97900961012085015260c0840151600080516020615a46833981519152907f24a1fcd63e9f03b27281db85fe631ec8e5c466f8178a4ee94d4942b7ccd90e1c900961014085015260c0840151600080516020615a46833981519152907f20bab6e5f766b4edf82399e9c5ff0e40d4b6875321a3d8020e18521d8f5c7241900961016085015260c0840151610b70906304000000615059565b610180850152600080516020615a46833981519152610b90600182615970565b610180860151086101a08501819052600080516020615a46833981519152907f30644e66c81e03716be83b486d6feabcc7ddd0fe6cbf5e72d585d142f7829b05096101c0850152600080516020615a46833981519152610bf1600182615970565b60c0860151089150610c0b84600e5b6020020151836150c0565b6101c08501526101a0840151600080516020615a46833981519152907f07baaa5b7af9cf52cd226bc56865f0f99ef8fcd4219060f09f43e9a148b5ab68096101e0850152600080516020615a46833981519152610c887f20bab6e5f766b4edf82399e9c5ff0e40d4b6875321a3d8020e18521d8f5c724182615970565b60c0860151089150610c9b84600f610c00565b6101e08501526101a0840151600080516020615a46833981519152907f1c699f652457365bf2fc4fa2c5c63d6c4349b03cb46d633d7a2655c5da4b900a09610200850152600080516020615a46833981519152610d187f19277f31ecb5bfe8604677099c09556812b0b5c50cceb2b584098183a5a6c5c882615970565b60c0860151089150610d2b846010610c00565b6102008501526101a0840151600080516020615a46833981519152907f205cdbaf03903a5c23e60eef0df90673bc65a25762694c501e3281153b4e588a09610220850152600080516020615a46833981519152610da87f082a7bd4c0a7e4352229d332c27a160da18f0d7c651f3047df41b80345532f6e82615970565b60c0860151089150610dbb846011610c00565b6102208501526101a0840151600080516020615a46833981519152907f27db73b1a831278e143aab90091db38afdea3294c4ba05d1c697a392eb09cc7909610240850152600080516020615a46833981519152610e387f26501ebfe559ea5826f023d3e76e4b66f170cd940408eb5590a4075c80b498d682615970565b60c0860151089150610e4b846012610c00565b6102408501526101a0840151600080516020615a46833981519152907f0204822d629ab653697f028f5fa17d23ac2ba08c60c7112d98ebd28f325f0af609610260850152600080516020615a46833981519152610ec87f0d5eb4c216db2c3262de3f6a2ef71a9be95ff21a7a1a50ed069d6131e7d54e5f82615970565b60c0860151089150610edb846013610c00565b6102608501526101a0840151600080516020615a46833981519152907f2622622a60c0d9327ccf066a0f1fce13c48601b976affd1f41c2a72a9f77da6409610280850152600080516020615a46833981519152610f587f24a1fcd63e9f03b27281db85fe631ec8e5c466f8178a4ee94d4942b7ccd90e1c82615970565b60c0860151089150610f6b846014610c00565b6102808501526102008401516101e0850151600080516020615a468339815191529190089150600080516020615a46833981519152846011602002015183089150600080516020615a46833981519152846012602002015183089150600080516020615a46833981519152846013602002015183086101e085015261103c8b8b604a818110610ffc57610ffc615856565b905060200201358c8c604881811061101657611016615856565b905060200201358d8d604981811061103057611030615856565b905060200201356150f0565b915061107b8b8b604b81811061105457611054615856565b905060200201358c8c604381811061106e5761106e615856565b90506020020135846150f0565b91506110ad8b8b604c81811061109357611093615856565b905060200201358c8c604481811061106e5761106e615856565b91506110df8b8b604d8181106110c5576110c5615856565b905060200201358c8c604581811061106e5761106e615856565b91506111118b8b604e8181106110f7576110f7615856565b905060200201358c8c604681811061106e5761106e615856565b91506111438b8b604f81811061112957611129615856565b905060200201358c8c604781811061106e5761106e615856565b610200850152600080516020615a468339815191528b8b604481811061116b5761116b615856565b905060200201358c8c604381811061118557611185615856565b905060200201350991506111ca8b8b60508181106111a5576111a5615856565b9050602002013583866010605481106111c0576111c0615856565b60200201516150f0565b610200850152600080516020615a468339815191528b8b60468181106111f2576111f2615856565b905060200201358c8c604581811061120c5761120c615856565b9050602002013509915061122c8b8b60518181106111a5576111a5615856565b610200850152600080516020615a468339815191528b8b606181811061125457611254615856565b90506020020135600080516020615a468339815191526112749190615970565b6001089150600080516020615a468339815191528285600e602002015109610220850152600080516020615a468339815191528b8b60648181106112ba576112ba615856565b905060200201358c8c60648181106112d4576112d4615856565b90506020020135099150600080516020615a468339815191528b8b606481811061130057611300615856565b90506020020135600080516020615a468339815191526113209190615970565b83089150600080516020615a4683398151915282856014602002015109610240850152600080516020615a468339815191528b8b606381811061136557611365615856565b90506020020135600080516020615a468339815191526113859190615970565b8c8c606481811061139857611398615856565b90506020020135089150600080516020615a4683398151915284600e6020020151830961026085015260c08401516060850151600080516020615a468339815191529190096102a08501526101e0840151610280850151600080516020615a468339815191529190089150600080516020615a4683398151915261142a83600080516020615a46833981519152615970565b6001086101e08501526080840151600080516020615a46833981519152908c8c604381811061145b5761145b615856565b90506020020135086102c08501526114a68b8b605b81811061147f5761147f615856565b905060200201358560036054811061149957611499615856565b60200201518660166111c0565b9150600080516020615a468339815191528b8b60628181106114ca576114ca615856565b9050602002013583096102e08501526102a08401516102c0850151600080516020615a468339815191529190089150600080516020615a468339815191528b8b606181811061151b5761151b615856565b9050602002013583096102c08501526102a0840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096103008501526080840151600080516020615a46833981519152908c8c604481811061159057611590615856565b90506020020135086103208501526115db8b8b605c8181106115b4576115b4615856565b90506020020135856003605481106115ce576115ce615856565b60200201518660196111c0565b9150600080516020615a46833981519152846017602002015183096102e0850152610300840151610320850151600080516020615a468339815191529190089150600080516020615a46833981519152846016602002015183096102c0850152610300840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096103008501526080840151600080516020615a46833981519152908c8c60458181106116a1576116a1615856565b90506020020135086103208501526116c58b8b605d8181106115b4576115b4615856565b9150600080516020615a46833981519152846017602002015183096102e0850152610300840151610320850151600080516020615a468339815191529190089150600080516020615a46833981519152846016602002015183096102c0850152610300840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096103008501526102c0840151600080516020615a46833981519152906117839082615970565b6102e0860151089150600080516020615a4683398151915284600f602002015183096102c08501526102a0840151600080516020615a46833981519152907f18afdf23e9bd9302673fc1e076a492d4d65bd18ebc4d854ed189139bab313e5290096102a08501526080840151600080516020615a46833981519152908c8c604681811061181257611812615856565b90506020020135086102e085015261185d8b8b605e81811061183657611836615856565b905060200201358560036054811061185057611850615856565b60200201518660176111c0565b9150600080516020615a468339815191528b8b606581811061188157611881615856565b9050602002013583096103008501526102a08401516102e0850151600080516020615a468339815191529190089150600080516020615a468339815191528b8b60648181106118d2576118d2615856565b9050602002013583096102e08501526102a0840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096102a08501526080840151600080516020615a46833981519152908c8c604781811061194757611947615856565b905060200201350861032085015261196b8b8b605f8181106115b4576115b4615856565b9150600080516020615a46833981519152846018602002015183096103008501526102a0840151610320850151600080516020615a468339815191529190089150600080516020615a46833981519152846017602002015183096102e08501526102a0840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096102a08501526080840151600080516020615a46833981519152908c8c6042818110611a3157611a31615856565b9050602002013508610320850152611a558b8b60608181106115b4576115b4615856565b9150600080516020615a46833981519152846018602002015183096103008501526102a0840151610320850151600080516020615a468339815191529190089150600080516020615a46833981519152846017602002015183096102e08501526102a0840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096102a08501526102e0840151600080516020615a4683398151915290611b139082615970565b610300860151089150600080516020615a4683398151915284600f602002015183096102a08501526060840151600080516020615a46833981519152908c8c6068818110611b6357611b63615856565b90506020020135089150600080516020615a46833981519152828c8c6067818110611b9057611b90615856565b90506020020135096102e08501526080840151600080516020615a46833981519152908c8c606a818110611bc657611bc6615856565b90506020020135089150600080516020615a46833981519152828560176020020151096102e0850152600080516020615a468339815191528b8b6052818110611c1157611c11615856565b905060200201358c8c6043818110611c2b57611c2b615856565b90506020020135096103008501526040840151600080516020615a468339815191529060000960408501819052610300850151600080516020615a468339815191529108610300850152600080516020615a468339815191528b8b6053818110611c9757611c97615856565b9050602002013585600260548110611cb157611cb1615856565b602002015108610320850152600080516020615a468339815191528b8b606a818110611cdf57611cdf615856565b90506020020135600080516020615a46833981519152611cff9190615970565b8c8c6068818110611d1257611d12615856565b9050602002013508610340850152600080516020615a468339815191528b8b6066818110611d4257611d42615856565b90506020020135600080516020615a46833981519152611d629190615970565b6001089150600080516020615a468339815191528285600e602002015109610360850152600080516020615a468339815191528b8b6066818110611da857611da8615856565b905060200201358c8c6066818110611dc257611dc2615856565b90506020020135099150600080516020615a468339815191528b8b6066818110611dee57611dee615856565b90506020020135600080516020615a46833981519152611e0e9190615970565b83089150600080516020615a46833981519152828560146020020151096103808501526060840151610300850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c6066818110611e7357611e73615856565b90506020020135096103008501526080840151610320850151600080516020615a468339815191529190086103208501819052610300850151600080516020615a468339815191529190099150600080516020615a46833981519152611ee783600080516020615a46833981519152615970565b6102e0860151089150600080516020615a4683398151915284600f602002015183096102e08501526103408401516101c0850151600080516020615a46833981519152919009610300850152600080516020615a468339815191528b8b6069818110611f5557611f55615856565b90506020020135600080516020615a46833981519152611f759190615970565b8c8c6068818110611f8857611f88615856565b90506020020135089150600080516020615a468339815191528285601a6020020151099150600080516020615a4683398151915284600f602002015183096103408501526060840151600080516020615a46833981519152908c8c606d818110611ff457611ff4615856565b90506020020135089150600080516020615a46833981519152828c8c606c81811061202157612021615856565b90506020020135096103a08501526080840151600080516020615a46833981519152908c8c606f81811061205757612057615856565b90506020020135089150600080516020615a468339815191528285601d6020020151096103a08501526120ca8b8b605281811061209657612096615856565b905060200201358c8c60448181106120b0576120b0615856565b90506020020135866002605481106111c0576111c0615856565b6103c0850152600080516020615a468339815191528b8b606f8181106120f2576120f2615856565b90506020020135600080516020615a468339815191526121129190615970565b8c8c606d81811061212557612125615856565b90506020020135086103e0850152600080516020615a468339815191528b8b606b81811061215557612155615856565b90506020020135600080516020615a468339815191526121759190615970565b6001089150600080516020615a468339815191528285600e602002015109610400850152600080516020615a468339815191528b8b606b8181106121bb576121bb615856565b905060200201358c8c606b8181106121d5576121d5615856565b90506020020135099150600080516020615a468339815191528b8b606b81811061220157612201615856565b90506020020135600080516020615a468339815191526122219190615970565b83089150600080516020615a468339815191528285601460200201510961042085015260608401516103c0850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c606b81811061228657612286615856565b90506020020135099150600080516020615a46833981519152846019602002015183099150600080516020615a468339815191526122d283600080516020615a46833981519152615970565b6103a0860151089150600080516020615a4683398151915284600f602002015183096103a08501526103e08401516101c0850151600080516020615a468339815191529190096103c0850152600080516020615a468339815191528b8b606e81811061234057612340615856565b90506020020135600080516020615a468339815191526123609190615970565b8c8c606d81811061237357612373615856565b90506020020135089150600080516020615a468339815191528285601f6020020151099150600080516020615a4683398151915284600f602002015183096103e08501526060840151600080516020615a46833981519152908c8c60728181106123df576123df615856565b90506020020135089150600080516020615a46833981519152828c8c607181811061240c5761240c615856565b90506020020135096104408501526080840151600080516020615a46833981519152908c8c607481811061244257612442615856565b90506020020135089150600080516020615a468339815191528285602260200201510961044085015261249b8b8b605281811061248157612481615856565b905060200201358c8c60458181106120b0576120b0615856565b610460850152600080516020615a468339815191528b8b60748181106124c3576124c3615856565b90506020020135600080516020615a468339815191526124e39190615970565b8c8c60728181106124f6576124f6615856565b9050602002013508610480850152600080516020615a468339815191528b8b607081811061252657612526615856565b90506020020135600080516020615a468339815191526125469190615970565b6001089150600080516020615a468339815191528285600e6020020151096104a0850152600080516020615a468339815191528b8b607081811061258c5761258c615856565b905060200201358c8c60708181106125a6576125a6615856565b90506020020135099150600080516020615a468339815191528b8b60708181106125d2576125d2615856565b90506020020135600080516020615a468339815191526125f29190615970565b83089150600080516020615a46833981519152828560146020020151096104c08501526060840151610460850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c607081811061265757612657615856565b90506020020135099150600080516020615a46833981519152846019602002015183099150600080516020615a468339815191526126a383600080516020615a46833981519152615970565b610440860151089150600080516020615a4683398151915284600f602002015183096104408501526104808401516101c0850151600080516020615a46833981519152919009610460850152600080516020615a468339815191528b8b607381811061271157612711615856565b90506020020135600080516020615a468339815191526127319190615970565b8c8c607281811061274457612744615856565b90506020020135089150600080516020615a46833981519152828560246020020151099150600080516020615a4683398151915284600f602002015183096104808501526060840151600080516020615a46833981519152908c8c60778181106127b0576127b0615856565b90506020020135089150600080516020615a46833981519152828c8c60768181106127dd576127dd615856565b90506020020135096104e08501526080840151600080516020615a46833981519152908c8c607981811061281357612813615856565b90506020020135089150600080516020615a46833981519152828560276020020151096104e085015261286c8b8b605281811061285257612852615856565b905060200201358c8c60468181106120b0576120b0615856565b610500850152600080516020615a468339815191528b8b607981811061289457612894615856565b90506020020135600080516020615a468339815191526128b49190615970565b8c8c60778181106128c7576128c7615856565b9050602002013508610520850152600080516020615a468339815191528b8b60758181106128f7576128f7615856565b90506020020135600080516020615a468339815191526129179190615970565b6001089150600080516020615a468339815191528285600e602002015109610540850152600080516020615a468339815191528b8b607581811061295d5761295d615856565b905060200201358c8c607581811061297757612977615856565b90506020020135099150600080516020615a468339815191528b8b60758181106129a3576129a3615856565b90506020020135600080516020615a468339815191526129c39190615970565b83089150600080516020615a46833981519152828560146020020151096105608501526060840151610500850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c6075818110612a2857612a28615856565b90506020020135099150600080516020615a46833981519152846019602002015183099150600080516020615a46833981519152612a7483600080516020615a46833981519152615970565b6104e0860151089150600080516020615a4683398151915284600f602002015183096103208501526105208401516101c0850151600080516020615a468339815191529190096104e0850152600080516020615a468339815191528b8b6078818110612ae257612ae2615856565b90506020020135600080516020615a46833981519152612b029190615970565b8c8c6077818110612b1557612b15615856565b90506020020135089150600080516020615a46833981519152828560296020020151099150600080516020615a4683398151915284600f602002015183096105008501526060840151600080516020615a46833981519152908c8c607c818110612b8157612b81615856565b90506020020135089150600080516020615a46833981519152828c8c607b818110612bae57612bae615856565b90506020020135096105208501526080840151600080516020615a46833981519152908c8c607e818110612be457612be4615856565b90506020020135089150600080516020615a4683398151915282856029602002015109610520850152612c3d8b8b6054818110612c2357612c23615856565b905060200201358c8c60438181106120b0576120b0615856565b610580850152600080516020615a468339815191528b8b6055818110612c6557612c65615856565b9050602002013585600260548110612c7f57612c7f615856565b6020020151086105a0850152600080516020615a468339815191528b8b607e818110612cad57612cad615856565b90506020020135600080516020615a46833981519152612ccd9190615970565b8c8c607c818110612ce057612ce0615856565b90506020020135086105c0850152600080516020615a468339815191528b8b607a818110612d1057612d10615856565b90506020020135600080516020615a46833981519152612d309190615970565b6001089150600080516020615a468339815191528285600e6020020151096105e0850152600080516020615a468339815191528b8b607a818110612d7657612d76615856565b905060200201358c8c607a818110612d9057612d90615856565b90506020020135099150600080516020615a468339815191528b8b607a818110612dbc57612dbc615856565b90506020020135600080516020615a46833981519152612ddc9190615970565b83089150600080516020615a46833981519152828560146020020151096106008501526060840151610580850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c607a818110612e4157612e41615856565b905060200201350961058085015260808401516105a0850151600080516020615a468339815191529190089150600080516020615a468339815191528285602c6020020151099150600080516020615a46833981519152612eb083600080516020615a46833981519152615970565b610520860151089150600080516020615a4683398151915284600f602002015183096105208501526105c08401516101c0850151600080516020615a46833981519152919009610580850152600080516020615a468339815191528b8b607d818110612f1e57612f1e615856565b90506020020135600080516020615a46833981519152612f3e9190615970565b8c8c607c818110612f5157612f51615856565b90506020020135089150600080516020615a468339815191528285602e6020020151099150600080516020615a4683398151915284600f602002015183096105a08501526060840151600080516020615a46833981519152908c8c6081818110612fbd57612fbd615856565b90506020020135089150600080516020615a46833981519152828c8c6080818110612fea57612fea615856565b90506020020135096105c08501526080840151600080516020615a46833981519152908c8c608381811061302057613020615856565b90506020020135089150600080516020615a468339815191528285602e6020020151096105c085015261305f8b8b6056818110612c2357612c23615856565b610620850152600080516020615a468339815191528b8b605781811061308757613087615856565b90506020020135856002605481106130a1576130a1615856565b602002015108610640850152600080516020615a468339815191528b8b60838181106130cf576130cf615856565b90506020020135600080516020615a468339815191526130ef9190615970565b8c8c608181811061310257613102615856565b9050602002013508610660850152600080516020615a468339815191528b8b607f81811061313257613132615856565b90506020020135600080516020615a468339815191526131529190615970565b6001089150600080516020615a468339815191528285600e602002015109610680850152600080516020615a468339815191528b8b607f81811061319857613198615856565b905060200201358c8c607f8181106131b2576131b2615856565b90506020020135099150600080516020615a468339815191528b8b607f8181106131de576131de615856565b90506020020135600080516020615a468339815191526131fe9190615970565b83089150600080516020615a46833981519152828560146020020151096106a08501526060840151610620850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c607f81811061326357613263615856565b90506020020135096106208501526080840151610640850151600080516020615a468339815191529190089150600080516020615a46833981519152828560316020020151099150600080516020615a468339815191526132d283600080516020615a46833981519152615970565b6105c0860151089150600080516020615a4683398151915284600f602002015183096105c08501526106608401516101c0850151600080516020615a46833981519152919009610620850152600080516020615a468339815191528b8b608281811061334057613340615856565b90506020020135600080516020615a468339815191526133609190615970565b8c8c608181811061337357613373615856565b90506020020135089150600080516020615a46833981519152828560336020020151099150600080516020615a4683398151915284600f602002015183096106408501526060840151600080516020615a46833981519152908c8c60868181106133df576133df615856565b90506020020135089150600080516020615a46833981519152828c8c608581811061340c5761340c615856565b90506020020135096106608501526080840151600080516020615a46833981519152908c8c608881811061344257613442615856565b90506020020135089150600080516020615a46833981519152828560336020020151096106608501526134818b8b6058818110612c2357612c23615856565b6106c0850152600080516020615a468339815191528b8b60598181106134a9576134a9615856565b90506020020135856002605481106134c3576134c3615856565b6020020151086040850152600080516020615a468339815191528b8b60888181106134f0576134f0615856565b90506020020135600080516020615a468339815191526135109190615970565b8c8c608681811061352357613523615856565b90506020020135086106e0850152600080516020615a468339815191528b8b608481811061355357613553615856565b90506020020135600080516020615a468339815191526135739190615970565b6001089150600080516020615a468339815191528285600e602002015109610700850152600080516020615a468339815191528b8b60848181106135b9576135b9615856565b905060200201358c8c60848181106135d3576135d3615856565b90506020020135099150600080516020615a468339815191528b8b60848181106135ff576135ff615856565b90506020020135600080516020615a4683398151915261361f9190615970565b83089150600080516020615a468339815191528285601460200201510961028085015260608401516106c0850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c608481811061368457613684615856565b9050602002013509606085015260808401516040850151600080516020615a468339815191529190089150600080516020615a46833981519152828560036020020151099150600080516020615a468339815191526136f183600080516020615a46833981519152615970565b610660860151089150600080516020615a4683398151915284600f6020020151830960408501526106e08401516101c0850151600080516020615a468339815191529190096060850152600080516020615a468339815191528b8b608781811061375d5761375d615856565b90506020020135600080516020615a4683398151915261377d9190615970565b8c8c608681811061379057613790615856565b90506020020135089150600080516020615a46833981519152828560376020020151099150600080516020615a4683398151915284600f60200201518309608085015260a08401516137e69060008660106111c0565b915061381b8480600560200201517f35342d2c29302f2827192b2a24232226251f1e1d21201a18171c1b15161312118561511d565b915061383984806005602002015168ff040302143832312e8561511d565b915061384c8285600d60200201516150c0565b6040850152610100840151600080516020615a4683398151915290800960608501819052610100850151600080516020615a46833981519152910960808501526138d68b8b608f8181106138a2576138a2615856565b905060200201358c8c60908181106138bc576138bc615856565b905060200201358660046054811061055c5761055c615856565b90925090506138ef848c8c65ffff088b038d86866151a0565b909250905061393282828d8d608981811061390c5761390c615856565b905060200201358e8e608a81811061392657613926615856565b905060200201356152a8565b6101e08601526101c08501526101608401516080850151600080516020615a4683398151915291900960a085015260e08401516080850151600080516020615a46833981519152919009610160850181905260e0850151600080516020615a4683398151915291096101a0850181905260e0850151600080516020615a468339815191529109610200850181905260e0850151600080516020615a468339815191529109610220850181905260e0850151600080516020615a468339815191529109610240850181905260e0850151600080516020615a468339815191529109610260850152600080516020615a468339815191528b8b6087818110613a3a57613a3a615856565b9050602002013585601360548110613a5457613a54615856565b6020020151099150613a75848c8c6bffff0b6e0d731078117d128286615316565b9150613ab28b8b6069818110613a8d57613a8d615856565b9050602002013585600460548110613aa757613aa7615856565b6020020151846150f0565b6102808501526101408401516060850151600080516020615a46833981519152919009610140850152613b188b8b6063818110613af157613af1615856565b9050602002013585600360548110613b0b57613b0b615856565b60200201518660146111c0565b610280850152610120840151610100850151600080516020615a4683398151915291900961012085015260e0840151610100850151600080516020615a468339815191529190096102a0850152600091505b6008821015613c1957600080516020615a4683398151915284613b8e8460006158fb565b613b999060076158b4565b60548110613ba957613ba9615856565b602002015185613bba8560016158fb565b613bc59060156158b4565b60548110613bd557613bd5615856565b60200201510984613be78460016158fb565b613bf29060166158b4565b60548110613c0257613c02615856565b602002015281613c1181615938565b925050613b6a565b600080516020615a468339815191528b8b6085818110613c3b57613c3b615856565b9050602002013585601d60548110613c5557613c55615856565b6020020151099150613c7e848c8c73ffff0848156216651767186c19711a761b7b1c8086615316565b9150600080516020615a46833981519152828560146020020151086102808501526102a08401516060850151600080516020615a46833981519152919008606085015260e0840151600080516020615a468339815191529080096102a0850181905260e0850151600080516020615a4683398151915291096103c0850152600091505b6032821015613db057600080516020615a4683398151915284613d258460006158fb565b613d309060076158b4565b60548110613d4057613d40615856565b602002015185613d518560016158fb565b613d5c90601e6158b4565b60548110613d6c57613d6c615856565b60200201510984613d7e8460016158fb565b613d8990601f6158b4565b60548110613d9957613d99615856565b602002015281613da881615938565b925050613d01565b600080516020615a468339815191528b8b605a818110613dd257613dd2615856565b9050602002013585605060548110613dec57613dec615856565b602002015109610a208501526101808401516109e0850151600080516020615a46833981519152919009610a408501819052610180850151600080516020615a468339815191529109610a608501819052610180850151600080516020615a4683398151915291096101808501526109e08401516040850151613e7291908660516111c0565b9150613ea1848c8c7f3f50405141524253435444554556465747584859495b4a5c4b5d4c5e4d5f4e6086615316565b9150613ed0848c8c7f2f7a307c317e327f338134833584368637883849394a3a4b3b4c3c4d3d4e3e4f86615316565b9150613eff848c8c7f1f4620472161226423662468256a266b276d286f29702a722b742c752d772e7986615316565b9150613f16848c8c67ffff074315441e4586615316565b9150600080516020615a468339815191528b8b6042818110613f3a57613f3a615856565b9050602002013583089150600080516020615a468339815191528285601460200201510860408501526106c0840151610260850151600080516020615a468339815191529190086102608501526106a08401516103a0850151600080516020615a46833981519152919008610280850152610660840151610240850151600080516020615a46833981519152919008610240850152610640840151610380850151600080516020615a46833981519152919008610380850152610600840151610220850151600080516020615a468339815191529190086102208501526105e0840151610360850151600080516020615a468339815191529190086103608501526105a0840151610200850151600080516020615a46833981519152919008610200850152610580840151610340850151600080516020615a468339815191529190086103408501526105408401516101a0850151600080516020615a468339815191529190086101a0850152610520840151610320850151600080516020615a468339815191529190086103208501526104e0840151610160850151600080516020615a468339815191529190086101608501526104c0840151610300850151600080516020615a468339815191529190086103008501526104808401516080850151600080516020615a4683398151915291900860808501526104608401516102e0850151600080516020615a468339815191529190086102e08501526104408401516102c0850151600080516020615a468339815191529190086102c08501526104208401516060850151600080516020615a468339815191529190086060850152610400840151610100850151600080516020615a4683398151915291900861010085015261420d8b8b608f8181106141d9576141d9615856565b905060200201358c8c60908181106141f3576141f3615856565b905060200201358660056054811061055c5761055c615856565b9092509050614240848c8c7f182c192e1a301b321c341436098b03260a8d040a0b0e0d121016111a121e132286866151a0565b9092509050614267848c8c73ffff4f3a523c533e0c405038068908081628172a86866151a0565b90925090506142b97f22cbc20a434be99c890d0fbf8c441feaf0dfb2178561a82783b0e74fad5d91eb7f186f16fd4e05464ed8a90fea4fac4fa3a80944bcaf19d9f536f8a67e301e75f386604e6105b4565b909250905061430b7f034336e9ed495c46a1c3ca745bad166bbb675c8ee31092792d0b3d435d3da0a77f120d0016a186defe5e27918247f5fb2c6f578d8ed259080a6a91ed9e503bc79c86604d6105b4565b909250905061435d7f2c4cbb935d4c9990fcaae8d9b0a244ee3f5327a7ca816aa58a58a40c8e00457e7f130d42ccd64a2e29acce747d0e976a363ab4b22f78b8a11b13ca81cf3549943986604c6105b4565b90925090506143af7f05ba13020527a88585e1f01f1d23dd68ee0d64cad4dcb82fce758883bafc1ef27f01696dcfadbe9736c07870ef063e349b30fddbd9ce85ccc7f7b19d1b18ddaf4b86604b6105b4565b90925090506144017f1adae7001a26c1f2f5640d6c60724b413dc22ae2ed96aaaccc659021a3ae1a307f2e6ff83e2f71937c1be92fe36ad1280cb68bcdf07699ee52e4d5540fef5a4bf386604a6105b4565b90925090506144537f1b9a33b5b4544142fd3f804b5f9457c34a4ff7da0852efc4b8d4241954ef859b7f2dc9f73c2504de7a2996b6c20aac9e53a6d6bee0e32ccdd44562c3498bd57a4e8660496105b4565b90925090506144a57f2bf75d9dd944249cd720ee71585980774cb83905b860feb5af3da42ca043b1157f07b4ff44a8e4250bf3ce16c06e8430b585a7a1e85243febe565a7929db37cc9f8660486105b4565b90925090506144f77f2444b554a3ef28ed5743cf5883acf229c2d774bf5076626197ca3093666a7fe57f2f54a38842d7fb7870618b48df360608f1a801e01dfa34b49e5964dc43f989bf8660476105b4565b90925090506145497f25d344a083be7e69cb907b8705b3bab3417d4a23f06d43ca7b287028a88ec5837f2c03f591ec6858cdff27cadaac1a67a1dc9ab7877f898686efe7033e7fd02a168660466105b4565b909250905061459b7f2fd1b96dd6e1ac88d9b5d438bace1ce6e7fe07412454779502af65284fef7e227f2fe224e0009d4ab99131c7c1cc045d0d0d7a50d6757fc12e4cfd720abc066d058660456105b4565b90925090506145ed7f2bf75d9dd944249cd720ee71585980774cb83905b860feb5af3da42ca043b1157f07b4ff44a8e4250bf3ce16c06e8430b585a7a1e85243febe565a7929db37cc9f8660446105b4565b909250905061463f7f1969a5f2f2d86eecccfdee75c39368f79759667bf445eed2f9d2d72c859011bf7f055449f64bace3dadff58d914f1647a98729c5476b53b66f1ff472b9537d183c8660436105b4565b90925090506146917f2fd08ae291ca0c95ada3f562b9f9be896737fd57493c4cefa087979abda4d2d67f04a6506069e2d39e944abcc54e70e881ccdd429ed4c1017fbe1099efeb70465f8660426105b4565b90925090506146e37f0ce55ceb7e62f5d45b387d78d357bc9a8423737e1c47b079a6cd4b64748aca117f2f92a53112cbb38374218eafba1349b77d3647f0423a3b48c8cc622f53c9c3e48660416105b4565b90925090506147357f229f748a69bee4ae7fdc62af12994ec2bd7f47b607216d282cc1f96054dac0787f015e9c5665a513c49920a46fbf7e607586f5b394f7487e045d45e99b7104f4778660406105b4565b90925090506147877f1fbdd7e6e58f01eb5a63b5922c2c6babed9c93d98d28363d97f78cd474cd4f1a7f23a726f04321315f0a8d73d3b596905c3e72eb5a899bd281f18abf3d674d1cfe86603f6105b4565b90925090506147d97f250ebdee646f64bb4af9f5f55fd76ae257408de7f0786f4817032e2581aeb8477f0ec875e3938bc9be9eab457a7d1655c96e5573e0d5c047692c45c3e4eaaa5a4386603e6105b4565b909250905061482b7f2617cd43f1512cc7ec9c2b728bbf4cf18de4b4f30912c811a6bd6d7a90eb35807f0c6dd39b0cb2bde148a8aa1dd84b71f6e47365a1cd726b8428c166e2d6f9e2d886603d6105b4565b909250905061487d7f24f6a4c5ff09d31cca15502ee379d50685bfe70be297201f44d4d967deb8be147f13e3df7f2f1cd670e9f473583298014f5286eb1f2402750ece5f75825484678286603c6105b4565b90925090506148cf7f0102612ad204a0291df816e0cbd8bfb60d03a26493db681420f83add5da28c3e7f0a229f00ff3a8cfce146e4c3ab5447e9d300c83f88e2072c860e05da3b9d60cc86603b6105b4565b90925090506149217f138c357f0a9847d66feca030756c854971c8783fb6a2c2547db480cda037781c7f2c03ebe8c2606106b122920dfe0a42293421ddff6bd205db46eacc956ff2a8a186603a6105b4565b90925090506149737f04a6e8bdc030c8594e55d7fb89399e76dba4d5e9bf60fb6e1fbdb2c0ffed69267f1094abfe954af52dbe746c8cf9aaabad56aa7e4da6a9294a1736fe685fee312f8660396105b4565b90925090506149c57f175a2d1aaf07ee184a955e35f3deac123ef1088b68c38bace37056dcfc9d304d7f150856c3d1750c2578b823cb3c7d74ed3e94c1cfece7e1bfdaaff36eea788fb98660386105b4565b90925090506149f0848c8c77ffff070015021e041f06250c28102b142e18311c3420372486866151a0565b85516020870151929450909250614a0a91849184916152a8565b60208601528452614a1f60016002868161055c565b85516020870151929450909250614a379184846153b8565b602086018190528186526101c08601516101e090960151959d959c50909a509850929650505050505050565b614a6b61562a565b80517f186282957db913abd99f91db59fe69922e95040603ef44c0bd7aa3adeef8f5ac905280517f17944351223333f260ddc3b4af45191b856689eda9eab5cbcddbbe570ce860d2602091820152810180517f298adc7396bd3865cbf6d6df91bae406694e6d2215baa893bdeadb63052895f49052517f297772d34bc9aa8ae56162486363ffe417b02dc7e8c207fc2cc20203e67a02ad9060015b602002015290565b614b1661562a565b80517f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2905280517f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed602091820152810180517f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec9052517f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d906001614b06565b60008083516006614bc691906158fb565b905060008167ffffffffffffffff811115614be357614be36158cc565b604051908082528060200260200182016040528015614c0c578160200160208202803683370190505b509050614c1761568d565b60008551875114614c2757600080fd5b60005b8751811015614e6057878181518110614c4557614c45615856565b60200260200101516000015184826006614c5f91906158fb565b614c6a9060006158b4565b81518110614c7a57614c7a615856565b602002602001018181525050878181518110614c9857614c98615856565b60200260200101516020015184826006614cb291906158fb565b614cbd9060016158b4565b81518110614ccd57614ccd615856565b602002602001018181525050868181518110614ceb57614ceb615856565b6020908102919091010151515184614d048360066158fb565b614d0f9060026158b4565b81518110614d1f57614d1f615856565b602002602001018181525050868181518110614d3d57614d3d615856565b60209081029190910181015151015184614d588360066158fb565b614d639060036158b4565b81518110614d7357614d73615856565b602002602001018181525050868181518110614d9157614d91615856565b602002602001015160200151600060028110614daf57614daf615856565b602002015184614dc08360066158fb565b614dcb9060046158b4565b81518110614ddb57614ddb615856565b602002602001018181525050868181518110614df957614df9615856565b602002602001015160200151600160028110614e1757614e17615856565b602002015184614e288360066158fb565b614e339060056158b4565b81518110614e4357614e43615856565b602090810291909101015280614e5881615938565b915050614c2a565b50602082602086026020860160085afa905080614e7c57600080fd5b5051151595945050505050565b600080614e946156ab565b6000614eb3604051806040016040528060008152602001600081525090565b8783526020830187905260408084018790528160608560075afa915081614ed957600080fd5b8051602090910151909890975095505050505050565b600080614efa6156c9565b87815260208101879052604081018690526060810185905260808101849052614f22816153fd565b6060810151608090910151909890975095505050505050565b60028282614f4881615938565b935060908110614f5a57614f5a615856565b6020020152828282614f6b81615938565b935060908110614f7d57614f7d615856565b6020020152505050565b60018282614f9481615938565b935060908110614fa657614fa6615856565b6020020152838282614fb781615938565b935060908110614fc957614fc9615856565b6020020152828282614fda81615938565b935060908110614fec57614fec615856565b602002015250505050565b600080838363ffffffff166090811061501257615012615856565b60200201818152505060006150448484602061502e9190615987565b6150399060016159b3565b63ffffffff16615438565b5190506150508161546e565b93525090919050565b600061506361560c565b61506b61568d565b6020808352828101819052604083018190526060830186905260808301859052600080516020615a4683398151915260a08401526000908260c08560055afa9050806150b657600080fd5b5051949350505050565b6000816000036150cf57600080fd5b600080516020615a468339815191526150e7836155e2565b84099392505050565b6000600080516020615a4683398151915282600080516020615a4683398151915285870908949350505050565b6000805b60208110156151965760ff80851690811461517d5760089490941c93600080516020615a4683398151915287826054811061515e5761515e615856565b6020020151600080516020615a46833981519152868909089350615183565b50615196565b5061518f6001826158b4565b9050615121565b5090949350505050565b6000806151ab6156c9565b606081018590526080810184905260005b602081101561528d5760ff80881690811461527457601088901c9760081c60ff168a8a838181106151ef576151ef615856565b905060200201358460006005811061520957615209615856565b60200201528a8a61521b8460016158b4565b81811061522a5761522a615856565b905060200201358460016005811061524457615244615856565b60200201528b816054811061525b5761525b615856565b6020020151604085015261526e846153fd565b5061527a565b5061528d565b506152866002826158b4565b90506151bc565b50606081015160809091015190999098509650505050505050565b60008060006152ca604051806040016040528060008152602001600081525090565b6152d26156e7565b888152602081018890526040808201889052606082018790528260808360065afa9250826152ff57600080fd5b508051602090910151909890975095505050505050565b6000805b60208110156153ad5760ff80851690811461539457601085901c9460081c60ff16600080516020615a4683398151915285600080516020615a468339815191528b846054811061536c5761536c615856565b60200201518b8b8781811061538357615383615856565b90506020020135090894505061539a565b506153ad565b506153a66002826158b4565b905061531a565b509095945050505050565b6000806153f08686866153eb877f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47615970565b6152a8565b9150915094509492505050565b600060406020830160608460075afa90508061541857600080fd5b60406060830160806020850160065afa90508061543457600080fd5b5050565b61544061568d565b6000602082848660026107d05a03fa9050808061545957fe5b5080615467576154676159db565b5092915050565b6000816155c18160008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b6008827fff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0016901c1790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b6010827fffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff000016901c1790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b6020827fffffffff00000000ffffffff00000000ffffffff00000000ffffffff0000000016901c17905060408177ffffffffffffffff0000000000000000ffffffffffffffff16901b6040827fffffffffffffffff0000000000000000ffffffffffffffff000000000000000016901c179050608081901b608082901c179050919050565b90506155db600080516020615a4683398151915282615a0a565b9392505050565b6000615606826156016002600080516020615a46833981519152615970565b615059565b92915050565b6040518060c001604052806006906020820280368337509192915050565b604051806040016040528061563d615705565b815260200161564a615705565b905290565b60405180610a8001604052806054906020820280368337509192915050565b6040518061120001604052806090906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b60405180606001604052806003906020820280368337509192915050565b6040518060a001604052806005906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b60008083601f84011261573557600080fd5b50813567ffffffffffffffff81111561574d57600080fd5b6020830191508360208260051b850101111561576857600080fd5b9250929050565b60008060008060006060868803121561578757600080fd5b853567ffffffffffffffff8082111561579f57600080fd5b6157ab89838a01615723565b909750955060208801359150808211156157c457600080fd5b506157d188828901615723565b96999598509660400135949350505050565b600060208083528351808285015260005b81811015615810578581018301518582016040015282016157f4565b81811115615822576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156158c7576158c7615885565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561593357615933615885565b500290565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361596957615969615885565b5060010190565b60008282101561598257615982615885565b500390565b600063ffffffff808316818516818304811182151516156159aa576159aa615885565b02949350505050565b600063ffffffff8083168185168083038211156159d2576159d2615885565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082615a40577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50069056fe30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a164736f6c634300080f000a", + "key": "0xe645f3e3dba1eb870eb045c6df181f42832b2ef1c0ba7b9eaac56d015a81bc52" }, "0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9": { "balance": "0", "nonce": 1, - "root": "0x32a700132902f5a9b9b36c35a8d4bf02fcc87a44d4a50cb70594888097afa490", + "root": "0x84fca44e98047a84beede48a330ff069336023c8e8e5e3349e5e6cb1bd534404", "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", "code": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", "storage": { "0x0000000000000000000000000000000000000000000000000000000000000000": "01", "0x0000000000000000000000000000000000000000000000000000000000000001": "01", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "7a2088a1bfc9d81c55368ae168c2c02570cb814f", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "09635f643e140090a9a8dcd712ed6285858cebef", "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "5fbdb2315678afecb367f032d93f642f64180aa3" }, "key": "0xfe007bdba68bf70aaeb167af64e1fe093e2da7911c8fdd2ca2cbd15510556466" @@ -501,28 +543,20 @@ "0xdc64a140aa3e981100a9beca4e685f962f0cf6c9": { "balance": "0", "nonce": 1, - "root": "0xb489c9c7bc087c551a58321da061aacbd3ad5015bd6e71daf04ac9f5eea52d5d", + "root": "0x6f22237ad748a49888344782eeecd1f1f031eab6d5a52da92470955b28231e53", "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", "code": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", "storage": { "0x0000000000000000000000000000000000000000000000000000000000000000": "01", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "c5a5c42992decbae36851359345fe25997f5c42d", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "67d269191c92caf3cd7723f116c85e6e9bf55933", "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "5fbdb2315678afecb367f032d93f642f64180aa3" }, "key": "0x5955c038e06073af9c7343aebef817ef3c1a62b10ca675a3d129ce4e4269f7ea" }, - "0xe6e340d132b5f46d1e472debcd681b2abc16e57e": { - "balance": "0", - "nonce": 1, - "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", - "codeHash": "0x814eecb211e89246cbfbb7bf992dac067874002d6ce97bd037179653f82396d5", - "code": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80634292dc3e1461003b57806354fd4d5014610063575b600080fd5b61004e61004936600461576e565b6100ac565b60405190151581526020015b60405180910390f35b61009f6040518060400160405280600581526020017f302e312e3500000000000000000000000000000000000000000000000000000081525081565b60405161005a91906157e2565b60006100b661560b565b848460008181106100c9576100c9615855565b9050602002013570ffffffffffffffffffffffffffffffffff16816000600681106100f6576100f6615855565b602002015260888585600181811061011057610110615855565b90506020020135600116901b60888686600081811061013157610131615855565b90506020020135901c61014491906158b3565b60208201528484600281811061015c5761015c615855565b9050602002013570ffffffffffffffffffffffffffffffffff168160026006811061018957610189615855565b60200201526088858560038181106101a3576101a3615855565b90506020020135600116901b6088868660028181106101c4576101c4615855565b90506020020135901c6101d791906158b3565b606080830191909152608084811c908301526fffffffffffffffffffffffffffffffff841660a08301526040805160028082529281019091526000918291829182918291816020015b60408051808201909152600080825260208201528152602001906001900390816102205750506040805160028082526060820190925291925060009190602082015b61026a615629565b81526020019060019003908161026257905050905061028a8d8d896104fb565b85519399509097509095509350869083906000906102aa576102aa615855565b6020026020010151600001818152505083826000815181106102ce576102ce615855565b6020026020010151602001818152505084826001815181106102f2576102f2615855565b60200260200101516000018181525050828260018151811061031657610316615855565b6020026020010151602001818152505061032e614a62565b8160008151811061034157610341615855565b6020026020010181905250610354614b0d565b8160018151811061036757610367615855565b602002602001018190525061037c8282614bb4565b6103905760009750505050505050506104f2565b8a8a60008181106103a3576103a3615855565b90506020020135826000815181106103bd576103bd615855565b6020908102919091010151528a8a60018181106103dc576103dc615855565b90506020020135826000815181106103f6576103f6615855565b602002602001015160200181815250508a8a600281811061041957610419615855565b905060200201358260018151811061043357610433615855565b6020908102919091010151528a8a600381811061045257610452615855565b905060200201358260018151811061046c5761046c615855565b60200260200101516020018181525050610484614a62565b8160008151811061049757610497615855565b60200260200101819052506104aa614b0d565b816001815181106104bd576104bd615855565b60200260200101819052506104d28282614bb4565b6104e65760009750505050505050506104f2565b60019750505050505050505b95945050505050565b60008060008061050961564e565b61051161566d565b6000806105667f2754b04f3f510d0e86a0d0e811f0fc16f92b722514e1729066d2abf90811d6f27f1816b0f9909a5a979bd34c559e57b4096bee5cce7eb668bc0a9805677f40dc858b845b6020020151614e88565b90925090506105c07f174fa57071f8f6e53fcb31a5ecc33274ec76e4e186eeb0b64255d2f314cd50b27f1c399365e85e4de2761ebcf350da85ff4518cc82f7cef64a477a7a5fd11d4a448b60015b60200201518585614eee565b90925090506106127f259a4d5cd83279b6dc9ca2008b669f82e91f23804e2524c5087a2452d52c33bd7f303abddb7ae0f35e3a6bd39314b347c3c3a433f72833dda1998ad2176258baa38b60026105b4565b90925090506106647f252b158900f31a7c0c00b924e7d3c8d61a60c5e9fd2b83251ba73d1dc0b680f57f29c8c2b3f0d74267bc2b0f9f3568838cdb0eee4719391790d93d0015c00ce5af8b60036105b4565b90925090506106b67f0c25f9f3c38b6a128d7d38c5625a3976d389b5f9f33098bb419968e4d18e150e7f21fb777462c7f4af71940423babc7f882f0c97be9620ef84f6f11974ee0edb8e8b60046105b4565b90925090506107087f2280a0fd7dbf95c450830906ffc607a373d5b9b56b9101138e925ad557eb355a7f0697ab7e9a5377e2759ab6d1283301ccae9c72bad14946a9513ee19be1ec825e8b60056105b4565b6020860152845261073b7f12f2215154abbfe8c4cbb6ce26e741c074f0b2b7382f8de01f7dee61b6d83d05846000614f3a565b8351602085015161074f9190856002614f86565b600091505b600482116107ed576107db8b8b61076c8560026158fa565b6107779060006158b3565b81811061078657610786615855565b905060200201358c8c85600261079c91906158fa565b6107a79060016158b3565b8181106107b6576107b6615855565b90506020020135858560036107cb91906158fa565b6107d69060056158b3565b614f86565b816107e581615937565b925050610754565b6107f8836014614ff6565b6040850152600091505b600d8211610896576108848b8b61081a8560026158fa565b61082590600a6158b3565b81811061083457610834615855565b905060200201358c8c85600261084a91906158fa565b61085590600b6158b3565b81811061086457610864615855565b905060200201358585600361087991906158fa565b6107d69060016158b3565b8161088e81615937565b925050610802565b6108a183602b614ff6565b60608501526108b1836001614ff6565b6080850152600091505b600982116109205761090e8b8b6108d38560026158fa565b6108de9060266158b3565b8181106108ed576108ed615855565b905060200201358c8c85600261090391906158fa565b6108559060276158b3565b8161091881615937565b9250506108bb565b61092b83601f614ff6565b60a0850152600091505b6003821161099a576109888b8b61094d8560026158fa565b61095890603a6158b3565b81811061096757610967615855565b905060200201358c8c85600261097d91906158fa565b61085590603b6158b3565b8161099281615937565b925050610935565b6109a583600d614ff6565b60c0850152600091505b60468211610a1857610a068b8b6109c78560016158fa565b6109d29060426158b3565b8181106109e1576109e1615855565b90506020020135848460026109f691906158fa565b610a019060016158b3565b614f3a565b81610a1081615937565b9250506109af565b610a2383608f614ff6565b60e0850152600091505b60038211610a9257610a808b8b610a458560026158fa565b610a509060896158b3565b818110610a5f57610a5f615855565b905060200201358c8c856002610a7591906158fa565b61085590608a6158b3565b81610a8a81615937565b925050610a2d565b610a9d83600d614ff6565b61010085015260c0840151600080516020615a45833981519152907f1dba8b5bdd64ef6ce29a9039aca3c0e524395c43b9227b96c75090cc6cc7ec97900961012085015260c0840151600080516020615a45833981519152907f24a1fcd63e9f03b27281db85fe631ec8e5c466f8178a4ee94d4942b7ccd90e1c900961014085015260c0840151600080516020615a45833981519152907f20bab6e5f766b4edf82399e9c5ff0e40d4b6875321a3d8020e18521d8f5c7241900961016085015260c0840151610b70906304000000615058565b610180850152600080516020615a45833981519152610b9060018261596f565b610180860151086101a08501819052600080516020615a45833981519152907f30644e66c81e03716be83b486d6feabcc7ddd0fe6cbf5e72d585d142f7829b05096101c0850152600080516020615a45833981519152610bf160018261596f565b60c0860151089150610c0b84600e5b6020020151836150bf565b6101c08501526101a0840151600080516020615a45833981519152907f07baaa5b7af9cf52cd226bc56865f0f99ef8fcd4219060f09f43e9a148b5ab68096101e0850152600080516020615a45833981519152610c887f20bab6e5f766b4edf82399e9c5ff0e40d4b6875321a3d8020e18521d8f5c72418261596f565b60c0860151089150610c9b84600f610c00565b6101e08501526101a0840151600080516020615a45833981519152907f1c699f652457365bf2fc4fa2c5c63d6c4349b03cb46d633d7a2655c5da4b900a09610200850152600080516020615a45833981519152610d187f19277f31ecb5bfe8604677099c09556812b0b5c50cceb2b584098183a5a6c5c88261596f565b60c0860151089150610d2b846010610c00565b6102008501526101a0840151600080516020615a45833981519152907f205cdbaf03903a5c23e60eef0df90673bc65a25762694c501e3281153b4e588a09610220850152600080516020615a45833981519152610da87f082a7bd4c0a7e4352229d332c27a160da18f0d7c651f3047df41b80345532f6e8261596f565b60c0860151089150610dbb846011610c00565b6102208501526101a0840151600080516020615a45833981519152907f27db73b1a831278e143aab90091db38afdea3294c4ba05d1c697a392eb09cc7909610240850152600080516020615a45833981519152610e387f26501ebfe559ea5826f023d3e76e4b66f170cd940408eb5590a4075c80b498d68261596f565b60c0860151089150610e4b846012610c00565b6102408501526101a0840151600080516020615a45833981519152907f0204822d629ab653697f028f5fa17d23ac2ba08c60c7112d98ebd28f325f0af609610260850152600080516020615a45833981519152610ec87f0d5eb4c216db2c3262de3f6a2ef71a9be95ff21a7a1a50ed069d6131e7d54e5f8261596f565b60c0860151089150610edb846013610c00565b6102608501526101a0840151600080516020615a45833981519152907f2622622a60c0d9327ccf066a0f1fce13c48601b976affd1f41c2a72a9f77da6409610280850152600080516020615a45833981519152610f587f24a1fcd63e9f03b27281db85fe631ec8e5c466f8178a4ee94d4942b7ccd90e1c8261596f565b60c0860151089150610f6b846014610c00565b6102808501526102008401516101e0850151600080516020615a458339815191529190089150600080516020615a45833981519152846011602002015183089150600080516020615a45833981519152846012602002015183089150600080516020615a45833981519152846013602002015183086101e085015261103c8b8b604a818110610ffc57610ffc615855565b905060200201358c8c604881811061101657611016615855565b905060200201358d8d604981811061103057611030615855565b905060200201356150ef565b915061107b8b8b604b81811061105457611054615855565b905060200201358c8c604381811061106e5761106e615855565b90506020020135846150ef565b91506110ad8b8b604c81811061109357611093615855565b905060200201358c8c604481811061106e5761106e615855565b91506110df8b8b604d8181106110c5576110c5615855565b905060200201358c8c604581811061106e5761106e615855565b91506111118b8b604e8181106110f7576110f7615855565b905060200201358c8c604681811061106e5761106e615855565b91506111438b8b604f81811061112957611129615855565b905060200201358c8c604781811061106e5761106e615855565b610200850152600080516020615a458339815191528b8b604481811061116b5761116b615855565b905060200201358c8c604381811061118557611185615855565b905060200201350991506111ca8b8b60508181106111a5576111a5615855565b9050602002013583866010605481106111c0576111c0615855565b60200201516150ef565b610200850152600080516020615a458339815191528b8b60468181106111f2576111f2615855565b905060200201358c8c604581811061120c5761120c615855565b9050602002013509915061122c8b8b60518181106111a5576111a5615855565b610200850152600080516020615a458339815191528b8b606181811061125457611254615855565b90506020020135600080516020615a45833981519152611274919061596f565b6001089150600080516020615a458339815191528285600e602002015109610220850152600080516020615a458339815191528b8b60648181106112ba576112ba615855565b905060200201358c8c60648181106112d4576112d4615855565b90506020020135099150600080516020615a458339815191528b8b606481811061130057611300615855565b90506020020135600080516020615a45833981519152611320919061596f565b83089150600080516020615a4583398151915282856014602002015109610240850152600080516020615a458339815191528b8b606381811061136557611365615855565b90506020020135600080516020615a45833981519152611385919061596f565b8c8c606481811061139857611398615855565b90506020020135089150600080516020615a4583398151915284600e6020020151830961026085015260c08401516060850151600080516020615a458339815191529190096102a08501526101e0840151610280850151600080516020615a458339815191529190089150600080516020615a4583398151915261142a83600080516020615a4583398151915261596f565b6001086101e08501526080840151600080516020615a45833981519152908c8c604381811061145b5761145b615855565b90506020020135086102c08501526114a68b8b605b81811061147f5761147f615855565b905060200201358560036054811061149957611499615855565b60200201518660166111c0565b9150600080516020615a458339815191528b8b60628181106114ca576114ca615855565b9050602002013583096102e08501526102a08401516102c0850151600080516020615a458339815191529190089150600080516020615a458339815191528b8b606181811061151b5761151b615855565b9050602002013583096102c08501526102a0840151600080516020615a45833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096103008501526080840151600080516020615a45833981519152908c8c604481811061159057611590615855565b90506020020135086103208501526115db8b8b605c8181106115b4576115b4615855565b90506020020135856003605481106115ce576115ce615855565b60200201518660196111c0565b9150600080516020615a45833981519152846017602002015183096102e0850152610300840151610320850151600080516020615a458339815191529190089150600080516020615a45833981519152846016602002015183096102c0850152610300840151600080516020615a45833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096103008501526080840151600080516020615a45833981519152908c8c60458181106116a1576116a1615855565b90506020020135086103208501526116c58b8b605d8181106115b4576115b4615855565b9150600080516020615a45833981519152846017602002015183096102e0850152610300840151610320850151600080516020615a458339815191529190089150600080516020615a45833981519152846016602002015183096102c0850152610300840151600080516020615a45833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096103008501526102c0840151600080516020615a4583398151915290611783908261596f565b6102e0860151089150600080516020615a4583398151915284600f602002015183096102c08501526102a0840151600080516020615a45833981519152907f18afdf23e9bd9302673fc1e076a492d4d65bd18ebc4d854ed189139bab313e5290096102a08501526080840151600080516020615a45833981519152908c8c604681811061181257611812615855565b90506020020135086102e085015261185d8b8b605e81811061183657611836615855565b905060200201358560036054811061185057611850615855565b60200201518660176111c0565b9150600080516020615a458339815191528b8b606581811061188157611881615855565b9050602002013583096103008501526102a08401516102e0850151600080516020615a458339815191529190089150600080516020615a458339815191528b8b60648181106118d2576118d2615855565b9050602002013583096102e08501526102a0840151600080516020615a45833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096102a08501526080840151600080516020615a45833981519152908c8c604781811061194757611947615855565b905060200201350861032085015261196b8b8b605f8181106115b4576115b4615855565b9150600080516020615a45833981519152846018602002015183096103008501526102a0840151610320850151600080516020615a458339815191529190089150600080516020615a45833981519152846017602002015183096102e08501526102a0840151600080516020615a45833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096102a08501526080840151600080516020615a45833981519152908c8c6042818110611a3157611a31615855565b9050602002013508610320850152611a558b8b60608181106115b4576115b4615855565b9150600080516020615a45833981519152846018602002015183096103008501526102a0840151610320850151600080516020615a458339815191529190089150600080516020615a45833981519152846017602002015183096102e08501526102a0840151600080516020615a45833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096102a08501526102e0840151600080516020615a4583398151915290611b13908261596f565b610300860151089150600080516020615a4583398151915284600f602002015183096102a08501526060840151600080516020615a45833981519152908c8c6068818110611b6357611b63615855565b90506020020135089150600080516020615a45833981519152828c8c6067818110611b9057611b90615855565b90506020020135096102e08501526080840151600080516020615a45833981519152908c8c606a818110611bc657611bc6615855565b90506020020135089150600080516020615a45833981519152828560176020020151096102e0850152600080516020615a458339815191528b8b6052818110611c1157611c11615855565b905060200201358c8c6043818110611c2b57611c2b615855565b90506020020135096103008501526040840151600080516020615a458339815191529060000960408501819052610300850151600080516020615a458339815191529108610300850152600080516020615a458339815191528b8b6053818110611c9757611c97615855565b9050602002013585600260548110611cb157611cb1615855565b602002015108610320850152600080516020615a458339815191528b8b606a818110611cdf57611cdf615855565b90506020020135600080516020615a45833981519152611cff919061596f565b8c8c6068818110611d1257611d12615855565b9050602002013508610340850152600080516020615a458339815191528b8b6066818110611d4257611d42615855565b90506020020135600080516020615a45833981519152611d62919061596f565b6001089150600080516020615a458339815191528285600e602002015109610360850152600080516020615a458339815191528b8b6066818110611da857611da8615855565b905060200201358c8c6066818110611dc257611dc2615855565b90506020020135099150600080516020615a458339815191528b8b6066818110611dee57611dee615855565b90506020020135600080516020615a45833981519152611e0e919061596f565b83089150600080516020615a45833981519152828560146020020151096103808501526060840151610300850151600080516020615a458339815191529190089150600080516020615a45833981519152828c8c6066818110611e7357611e73615855565b90506020020135096103008501526080840151610320850151600080516020615a458339815191529190086103208501819052610300850151600080516020615a458339815191529190099150600080516020615a45833981519152611ee783600080516020615a4583398151915261596f565b6102e0860151089150600080516020615a4583398151915284600f602002015183096102e08501526103408401516101c0850151600080516020615a45833981519152919009610300850152600080516020615a458339815191528b8b6069818110611f5557611f55615855565b90506020020135600080516020615a45833981519152611f75919061596f565b8c8c6068818110611f8857611f88615855565b90506020020135089150600080516020615a458339815191528285601a6020020151099150600080516020615a4583398151915284600f602002015183096103408501526060840151600080516020615a45833981519152908c8c606d818110611ff457611ff4615855565b90506020020135089150600080516020615a45833981519152828c8c606c81811061202157612021615855565b90506020020135096103a08501526080840151600080516020615a45833981519152908c8c606f81811061205757612057615855565b90506020020135089150600080516020615a458339815191528285601d6020020151096103a08501526120ca8b8b605281811061209657612096615855565b905060200201358c8c60448181106120b0576120b0615855565b90506020020135866002605481106111c0576111c0615855565b6103c0850152600080516020615a458339815191528b8b606f8181106120f2576120f2615855565b90506020020135600080516020615a45833981519152612112919061596f565b8c8c606d81811061212557612125615855565b90506020020135086103e0850152600080516020615a458339815191528b8b606b81811061215557612155615855565b90506020020135600080516020615a45833981519152612175919061596f565b6001089150600080516020615a458339815191528285600e602002015109610400850152600080516020615a458339815191528b8b606b8181106121bb576121bb615855565b905060200201358c8c606b8181106121d5576121d5615855565b90506020020135099150600080516020615a458339815191528b8b606b81811061220157612201615855565b90506020020135600080516020615a45833981519152612221919061596f565b83089150600080516020615a458339815191528285601460200201510961042085015260608401516103c0850151600080516020615a458339815191529190089150600080516020615a45833981519152828c8c606b81811061228657612286615855565b90506020020135099150600080516020615a45833981519152846019602002015183099150600080516020615a458339815191526122d283600080516020615a4583398151915261596f565b6103a0860151089150600080516020615a4583398151915284600f602002015183096103a08501526103e08401516101c0850151600080516020615a458339815191529190096103c0850152600080516020615a458339815191528b8b606e81811061234057612340615855565b90506020020135600080516020615a45833981519152612360919061596f565b8c8c606d81811061237357612373615855565b90506020020135089150600080516020615a458339815191528285601f6020020151099150600080516020615a4583398151915284600f602002015183096103e08501526060840151600080516020615a45833981519152908c8c60728181106123df576123df615855565b90506020020135089150600080516020615a45833981519152828c8c607181811061240c5761240c615855565b90506020020135096104408501526080840151600080516020615a45833981519152908c8c607481811061244257612442615855565b90506020020135089150600080516020615a458339815191528285602260200201510961044085015261249b8b8b605281811061248157612481615855565b905060200201358c8c60458181106120b0576120b0615855565b610460850152600080516020615a458339815191528b8b60748181106124c3576124c3615855565b90506020020135600080516020615a458339815191526124e3919061596f565b8c8c60728181106124f6576124f6615855565b9050602002013508610480850152600080516020615a458339815191528b8b607081811061252657612526615855565b90506020020135600080516020615a45833981519152612546919061596f565b6001089150600080516020615a458339815191528285600e6020020151096104a0850152600080516020615a458339815191528b8b607081811061258c5761258c615855565b905060200201358c8c60708181106125a6576125a6615855565b90506020020135099150600080516020615a458339815191528b8b60708181106125d2576125d2615855565b90506020020135600080516020615a458339815191526125f2919061596f565b83089150600080516020615a45833981519152828560146020020151096104c08501526060840151610460850151600080516020615a458339815191529190089150600080516020615a45833981519152828c8c607081811061265757612657615855565b90506020020135099150600080516020615a45833981519152846019602002015183099150600080516020615a458339815191526126a383600080516020615a4583398151915261596f565b610440860151089150600080516020615a4583398151915284600f602002015183096104408501526104808401516101c0850151600080516020615a45833981519152919009610460850152600080516020615a458339815191528b8b607381811061271157612711615855565b90506020020135600080516020615a45833981519152612731919061596f565b8c8c607281811061274457612744615855565b90506020020135089150600080516020615a45833981519152828560246020020151099150600080516020615a4583398151915284600f602002015183096104808501526060840151600080516020615a45833981519152908c8c60778181106127b0576127b0615855565b90506020020135089150600080516020615a45833981519152828c8c60768181106127dd576127dd615855565b90506020020135096104e08501526080840151600080516020615a45833981519152908c8c607981811061281357612813615855565b90506020020135089150600080516020615a45833981519152828560276020020151096104e085015261286c8b8b605281811061285257612852615855565b905060200201358c8c60468181106120b0576120b0615855565b610500850152600080516020615a458339815191528b8b607981811061289457612894615855565b90506020020135600080516020615a458339815191526128b4919061596f565b8c8c60778181106128c7576128c7615855565b9050602002013508610520850152600080516020615a458339815191528b8b60758181106128f7576128f7615855565b90506020020135600080516020615a45833981519152612917919061596f565b6001089150600080516020615a458339815191528285600e602002015109610540850152600080516020615a458339815191528b8b607581811061295d5761295d615855565b905060200201358c8c607581811061297757612977615855565b90506020020135099150600080516020615a458339815191528b8b60758181106129a3576129a3615855565b90506020020135600080516020615a458339815191526129c3919061596f565b83089150600080516020615a45833981519152828560146020020151096105608501526060840151610500850151600080516020615a458339815191529190089150600080516020615a45833981519152828c8c6075818110612a2857612a28615855565b90506020020135099150600080516020615a45833981519152846019602002015183099150600080516020615a45833981519152612a7483600080516020615a4583398151915261596f565b6104e0860151089150600080516020615a4583398151915284600f602002015183096103208501526105208401516101c0850151600080516020615a458339815191529190096104e0850152600080516020615a458339815191528b8b6078818110612ae257612ae2615855565b90506020020135600080516020615a45833981519152612b02919061596f565b8c8c6077818110612b1557612b15615855565b90506020020135089150600080516020615a45833981519152828560296020020151099150600080516020615a4583398151915284600f602002015183096105008501526060840151600080516020615a45833981519152908c8c607c818110612b8157612b81615855565b90506020020135089150600080516020615a45833981519152828c8c607b818110612bae57612bae615855565b90506020020135096105208501526080840151600080516020615a45833981519152908c8c607e818110612be457612be4615855565b90506020020135089150600080516020615a4583398151915282856029602002015109610520850152612c3d8b8b6054818110612c2357612c23615855565b905060200201358c8c60438181106120b0576120b0615855565b610580850152600080516020615a458339815191528b8b6055818110612c6557612c65615855565b9050602002013585600260548110612c7f57612c7f615855565b6020020151086105a0850152600080516020615a458339815191528b8b607e818110612cad57612cad615855565b90506020020135600080516020615a45833981519152612ccd919061596f565b8c8c607c818110612ce057612ce0615855565b90506020020135086105c0850152600080516020615a458339815191528b8b607a818110612d1057612d10615855565b90506020020135600080516020615a45833981519152612d30919061596f565b6001089150600080516020615a458339815191528285600e6020020151096105e0850152600080516020615a458339815191528b8b607a818110612d7657612d76615855565b905060200201358c8c607a818110612d9057612d90615855565b90506020020135099150600080516020615a458339815191528b8b607a818110612dbc57612dbc615855565b90506020020135600080516020615a45833981519152612ddc919061596f565b83089150600080516020615a45833981519152828560146020020151096106008501526060840151610580850151600080516020615a458339815191529190089150600080516020615a45833981519152828c8c607a818110612e4157612e41615855565b905060200201350961058085015260808401516105a0850151600080516020615a458339815191529190089150600080516020615a458339815191528285602c6020020151099150600080516020615a45833981519152612eb083600080516020615a4583398151915261596f565b610520860151089150600080516020615a4583398151915284600f602002015183096105208501526105c08401516101c0850151600080516020615a45833981519152919009610580850152600080516020615a458339815191528b8b607d818110612f1e57612f1e615855565b90506020020135600080516020615a45833981519152612f3e919061596f565b8c8c607c818110612f5157612f51615855565b90506020020135089150600080516020615a458339815191528285602e6020020151099150600080516020615a4583398151915284600f602002015183096105a08501526060840151600080516020615a45833981519152908c8c6081818110612fbd57612fbd615855565b90506020020135089150600080516020615a45833981519152828c8c6080818110612fea57612fea615855565b90506020020135096105c08501526080840151600080516020615a45833981519152908c8c608381811061302057613020615855565b90506020020135089150600080516020615a458339815191528285602e6020020151096105c085015261305f8b8b6056818110612c2357612c23615855565b610620850152600080516020615a458339815191528b8b605781811061308757613087615855565b90506020020135856002605481106130a1576130a1615855565b602002015108610640850152600080516020615a458339815191528b8b60838181106130cf576130cf615855565b90506020020135600080516020615a458339815191526130ef919061596f565b8c8c608181811061310257613102615855565b9050602002013508610660850152600080516020615a458339815191528b8b607f81811061313257613132615855565b90506020020135600080516020615a45833981519152613152919061596f565b6001089150600080516020615a458339815191528285600e602002015109610680850152600080516020615a458339815191528b8b607f81811061319857613198615855565b905060200201358c8c607f8181106131b2576131b2615855565b90506020020135099150600080516020615a458339815191528b8b607f8181106131de576131de615855565b90506020020135600080516020615a458339815191526131fe919061596f565b83089150600080516020615a45833981519152828560146020020151096106a08501526060840151610620850151600080516020615a458339815191529190089150600080516020615a45833981519152828c8c607f81811061326357613263615855565b90506020020135096106208501526080840151610640850151600080516020615a458339815191529190089150600080516020615a45833981519152828560316020020151099150600080516020615a458339815191526132d283600080516020615a4583398151915261596f565b6105c0860151089150600080516020615a4583398151915284600f602002015183096105c08501526106608401516101c0850151600080516020615a45833981519152919009610620850152600080516020615a458339815191528b8b608281811061334057613340615855565b90506020020135600080516020615a45833981519152613360919061596f565b8c8c608181811061337357613373615855565b90506020020135089150600080516020615a45833981519152828560336020020151099150600080516020615a4583398151915284600f602002015183096106408501526060840151600080516020615a45833981519152908c8c60868181106133df576133df615855565b90506020020135089150600080516020615a45833981519152828c8c608581811061340c5761340c615855565b90506020020135096106608501526080840151600080516020615a45833981519152908c8c608881811061344257613442615855565b90506020020135089150600080516020615a45833981519152828560336020020151096106608501526134818b8b6058818110612c2357612c23615855565b6106c0850152600080516020615a458339815191528b8b60598181106134a9576134a9615855565b90506020020135856002605481106134c3576134c3615855565b6020020151086040850152600080516020615a458339815191528b8b60888181106134f0576134f0615855565b90506020020135600080516020615a45833981519152613510919061596f565b8c8c608681811061352357613523615855565b90506020020135086106e0850152600080516020615a458339815191528b8b608481811061355357613553615855565b90506020020135600080516020615a45833981519152613573919061596f565b6001089150600080516020615a458339815191528285600e602002015109610700850152600080516020615a458339815191528b8b60848181106135b9576135b9615855565b905060200201358c8c60848181106135d3576135d3615855565b90506020020135099150600080516020615a458339815191528b8b60848181106135ff576135ff615855565b90506020020135600080516020615a4583398151915261361f919061596f565b83089150600080516020615a458339815191528285601460200201510961028085015260608401516106c0850151600080516020615a458339815191529190089150600080516020615a45833981519152828c8c608481811061368457613684615855565b9050602002013509606085015260808401516040850151600080516020615a458339815191529190089150600080516020615a45833981519152828560036020020151099150600080516020615a458339815191526136f183600080516020615a4583398151915261596f565b610660860151089150600080516020615a4583398151915284600f6020020151830960408501526106e08401516101c0850151600080516020615a458339815191529190096060850152600080516020615a458339815191528b8b608781811061375d5761375d615855565b90506020020135600080516020615a4583398151915261377d919061596f565b8c8c608681811061379057613790615855565b90506020020135089150600080516020615a45833981519152828560376020020151099150600080516020615a4583398151915284600f60200201518309608085015260a08401516137e69060008660106111c0565b915061381b8480600560200201517f35342d2c29302f2827192b2a24232226251f1e1d21201a18171c1b15161312118561511c565b915061383984806005602002015168ff040302143832312e8561511c565b915061384c8285600d60200201516150bf565b6040850152610100840151600080516020615a4583398151915290800960608501819052610100850151600080516020615a45833981519152910960808501526138d68b8b608f8181106138a2576138a2615855565b905060200201358c8c60908181106138bc576138bc615855565b905060200201358660046054811061055c5761055c615855565b90925090506138ef848c8c65ffff088b038d868661519f565b909250905061393282828d8d608981811061390c5761390c615855565b905060200201358e8e608a81811061392657613926615855565b905060200201356152a7565b6101e08601526101c08501526101608401516080850151600080516020615a4583398151915291900960a085015260e08401516080850151600080516020615a45833981519152919009610160850181905260e0850151600080516020615a4583398151915291096101a0850181905260e0850151600080516020615a458339815191529109610200850181905260e0850151600080516020615a458339815191529109610220850181905260e0850151600080516020615a458339815191529109610240850181905260e0850151600080516020615a458339815191529109610260850152600080516020615a458339815191528b8b6087818110613a3a57613a3a615855565b9050602002013585601360548110613a5457613a54615855565b6020020151099150613a75848c8c6bffff0b6e0d731078117d128286615315565b9150613ab28b8b6069818110613a8d57613a8d615855565b9050602002013585600460548110613aa757613aa7615855565b6020020151846150ef565b6102808501526101408401516060850151600080516020615a45833981519152919009610140850152613b188b8b6063818110613af157613af1615855565b9050602002013585600360548110613b0b57613b0b615855565b60200201518660146111c0565b610280850152610120840151610100850151600080516020615a4583398151915291900961012085015260e0840151610100850151600080516020615a458339815191529190096102a0850152600091505b6008821015613c1957600080516020615a4583398151915284613b8e8460006158fa565b613b999060076158b3565b60548110613ba957613ba9615855565b602002015185613bba8560016158fa565b613bc59060156158b3565b60548110613bd557613bd5615855565b60200201510984613be78460016158fa565b613bf29060166158b3565b60548110613c0257613c02615855565b602002015281613c1181615937565b925050613b6a565b600080516020615a458339815191528b8b6085818110613c3b57613c3b615855565b9050602002013585601d60548110613c5557613c55615855565b6020020151099150613c7e848c8c73ffff0848156216651767186c19711a761b7b1c8086615315565b9150600080516020615a45833981519152828560146020020151086102808501526102a08401516060850151600080516020615a45833981519152919008606085015260e0840151600080516020615a458339815191529080096102a0850181905260e0850151600080516020615a4583398151915291096103c0850152600091505b6032821015613db057600080516020615a4583398151915284613d258460006158fa565b613d309060076158b3565b60548110613d4057613d40615855565b602002015185613d518560016158fa565b613d5c90601e6158b3565b60548110613d6c57613d6c615855565b60200201510984613d7e8460016158fa565b613d8990601f6158b3565b60548110613d9957613d99615855565b602002015281613da881615937565b925050613d01565b600080516020615a458339815191528b8b605a818110613dd257613dd2615855565b9050602002013585605060548110613dec57613dec615855565b602002015109610a208501526101808401516109e0850151600080516020615a45833981519152919009610a408501819052610180850151600080516020615a458339815191529109610a608501819052610180850151600080516020615a4583398151915291096101808501526109e08401516040850151613e7291908660516111c0565b9150613ea1848c8c7f3f50405141524253435444554556465747584859495b4a5c4b5d4c5e4d5f4e6086615315565b9150613ed0848c8c7f2f7a307c317e327f338134833584368637883849394a3a4b3b4c3c4d3d4e3e4f86615315565b9150613eff848c8c7f1f4620472161226423662468256a266b276d286f29702a722b742c752d772e7986615315565b9150613f16848c8c67ffff074315441e4586615315565b9150600080516020615a458339815191528b8b6042818110613f3a57613f3a615855565b9050602002013583089150600080516020615a458339815191528285601460200201510860408501526106c0840151610260850151600080516020615a458339815191529190086102608501526106a08401516103a0850151600080516020615a45833981519152919008610280850152610660840151610240850151600080516020615a45833981519152919008610240850152610640840151610380850151600080516020615a45833981519152919008610380850152610600840151610220850151600080516020615a458339815191529190086102208501526105e0840151610360850151600080516020615a458339815191529190086103608501526105a0840151610200850151600080516020615a45833981519152919008610200850152610580840151610340850151600080516020615a458339815191529190086103408501526105408401516101a0850151600080516020615a458339815191529190086101a0850152610520840151610320850151600080516020615a458339815191529190086103208501526104e0840151610160850151600080516020615a458339815191529190086101608501526104c0840151610300850151600080516020615a458339815191529190086103008501526104808401516080850151600080516020615a4583398151915291900860808501526104608401516102e0850151600080516020615a458339815191529190086102e08501526104408401516102c0850151600080516020615a458339815191529190086102c08501526104208401516060850151600080516020615a458339815191529190086060850152610400840151610100850151600080516020615a4583398151915291900861010085015261420d8b8b608f8181106141d9576141d9615855565b905060200201358c8c60908181106141f3576141f3615855565b905060200201358660056054811061055c5761055c615855565b9092509050614240848c8c7f182c192e1a301b321c341436098b03260a8d040a0b0e0d121016111a121e1322868661519f565b9092509050614267848c8c73ffff4f3a523c533e0c405038068908081628172a868661519f565b90925090506142b87e664f6a89a34d248445c568185b3df0822d3396dea9f9d2e9d43529a58ae3487f132fecdbd8477c405599f1c88897f0f4ddccc95895696530cc6446ac4137e42286604e6105b4565b909250905061430a7f1b40cd837026dfdbb6df3c4744da63e9e5a8d1660e225f816f2977c86b95a31b7f18f95e0be87b1fe22795f46b29c594ae559e0690d85822571acacf389576ecd486604d6105b4565b909250905061435c7f2f84599888b7bb19759153b8952e3450330b6ab6d14e927458e66d92759c27067f08d13eced574c8d09def1eab8d2c5d587b682c8fbd0cdda6f6a867f08faf9c1f86604c6105b4565b90925090506143ae7f13d1720ddb4933bfffffd6293776f43cc0e52d41749be8f32ce46530ae2477cd7f2aedb069508ff896c46d0895bec9977ec3f8880efe1d988f4895e4e71776486e86604b6105b4565b90925090506144007f0f77117979785d9d8dc4679d4db9a477b40cf4eeaf778708e82a1c734b4c00bb7f0a3f79406f6643a8345a64b0b98fbb7ddfdb35daf3ef78f49f245b5b2cd1bbe486604a6105b4565b90925090506144527f14fa5fb073ccc98551b6f0498b978d50f8b22761be87dffd89f9b342d17f10f87f283324c8f5bdeb0e7521421fe4af6172d9ece0181897f269368ae604e6b9efdc8660496105b4565b90925090506144a47f2bf75d9dd944249cd720ee71585980774cb83905b860feb5af3da42ca043b1157f07b4ff44a8e4250bf3ce16c06e8430b585a7a1e85243febe565a7929db37cc9f8660486105b4565b90925090506144f67f11f73e29244b44d54c1f2a6c9ee8c97294e6f9ca20108f5e3df9644e05d73af27f0d9bc372f4207ee05211e34d4c14eb5bb513151fff97b69fd0270dd3ac6e69f98660476105b4565b90925090506145487f25d344a083be7e69cb907b8705b3bab3417d4a23f06d43ca7b287028a88ec5837f2c03f591ec6858cdff27cadaac1a67a1dc9ab7877f898686efe7033e7fd02a168660466105b4565b909250905061459a7f2ad6d333c4ce75298934d4213ed43f37e3b58efdaf011ca21dfe28f30adafece7f1786d4c0a17ef0498d00e0ba0d6d062930a3833c940d0ec44381a841c6b7f73f8660456105b4565b90925090506145ec7f2bf75d9dd944249cd720ee71585980774cb83905b860feb5af3da42ca043b1157f07b4ff44a8e4250bf3ce16c06e8430b585a7a1e85243febe565a7929db37cc9f8660446105b4565b909250905061463e7f27cd85ecea3494f04879593ae873031d93dc7719449505fe793a7d88fff4d19e7f22a643b787a9ba74ec30e9c19362c00a29360a95f617d6fef549c62021e4cbcb8660436105b4565b90925090506146907f2fd08ae291ca0c95ada3f562b9f9be896737fd57493c4cefa087979abda4d2d67f04a6506069e2d39e944abcc54e70e881ccdd429ed4c1017fbe1099efeb70465f8660426105b4565b90925090506146e27f267eef8f848858b7d24eafe2f8631f1d041135de8e4bdb6522c2775357afc6467f0d12b24f7a7dc55ffa02c09f8ecd9a8aac8c044d9671855436faee0722a423948660416105b4565b90925090506147347f2eed9b77afb6dd8bbb2cf5d7793dd5a3225c8f590ef9070fc6111d69f19bc4507f29fa825da796671c1abca00af2c315317b19e67e1410dada6a2fc34f1d402f408660406105b4565b90925090506147867f0bfeb30042200560ff6218d6dc1060fe5aa5086bef6c82ae86a3355e830e07fd7f1614eb3d1c218c6da1c77d02cffc147a8c64b41a0e377155cde9a6d2bb4627cd86603f6105b4565b90925090506147d87f0cf6886df1426404f912fb52edf579c1077bf573006dbca87d6a181935e234ff7f211b654670c8567a5d6fa5739e3e8e29d8288592ea47e5cd5bf8b23a6e843dd786603e6105b4565b909250905061482a7f272a3415b7e303bf0bb85aa5c0ff3609501e5b2464aebb93fec39e2fb413a1ac7f21ee830e0b21d16673fe14b97fc4d3bedebc721661ea6563e93a3c22c2d83fd186603d6105b4565b909250905061487c7f1394472a7573940ae385caa13cff2d775d9b4401b316dd2ee1dd3a4cb53eb05f7f0c585ec5a80cc04ad0a91ec2fbea54dae78a4269db22da099cfdb8289f81373d86603c6105b4565b90925090506148ce7f0b790ee6c5b25cded870dc285ce2dac4f306be5cd112bc16283b8f770bdf161a7f2c3c609710493ba0578607c093e93e31c9bdacea8ad2314c2bcf171b17c5f81386603b6105b4565b90925090506149207f2d67fbd36c5f1a5e22a39db5dc97894591edc23b1d6b9774e3264cae237bb2c37f04a8a2ecb7f6e0b8d22187a5b8343d81f1771e5f11571579c19636cfa39c1e2286603a6105b4565b90925090506149727f212914adf2f7bde74e593d6c9954f3ca5f0971f4234c71a817f324c5cab470d87f2e934dc5970b910a6f2959d9d67dd0d60cf50e93e4d51a053a961a91cad410248660396105b4565b90925090506149c47f2f871fa2350511069a310ad1cca63540b8e582771cc35dfe6f335f19833963127f00c578b532be0a2a2373ed0b7fd640eb604d67738c6f4732696f310e521af7c28660386105b4565b90925090506149ef848c8c77ffff070015021e041f06250c28102b142e18311c34203724868661519f565b85516020870151929450909250614a0991849184916152a7565b60208601528452614a1e60016002868161055c565b85516020870151929450909250614a369184846153b7565b602086018190528186526101c08601516101e090960151959d959c50909a509850929650505050505050565b614a6a615629565b80517f186282957db913abd99f91db59fe69922e95040603ef44c0bd7aa3adeef8f5ac905280517f17944351223333f260ddc3b4af45191b856689eda9eab5cbcddbbe570ce860d2602091820152810180517f298adc7396bd3865cbf6d6df91bae406694e6d2215baa893bdeadb63052895f49052517f297772d34bc9aa8ae56162486363ffe417b02dc7e8c207fc2cc20203e67a02ad9060015b602002015290565b614b15615629565b80517f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2905280517f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed602091820152810180517f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec9052517f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d906001614b05565b60008083516006614bc591906158fa565b905060008167ffffffffffffffff811115614be257614be26158cb565b604051908082528060200260200182016040528015614c0b578160200160208202803683370190505b509050614c1661568c565b60008551875114614c2657600080fd5b60005b8751811015614e5f57878181518110614c4457614c44615855565b60200260200101516000015184826006614c5e91906158fa565b614c699060006158b3565b81518110614c7957614c79615855565b602002602001018181525050878181518110614c9757614c97615855565b60200260200101516020015184826006614cb191906158fa565b614cbc9060016158b3565b81518110614ccc57614ccc615855565b602002602001018181525050868181518110614cea57614cea615855565b6020908102919091010151515184614d038360066158fa565b614d0e9060026158b3565b81518110614d1e57614d1e615855565b602002602001018181525050868181518110614d3c57614d3c615855565b60209081029190910181015151015184614d578360066158fa565b614d629060036158b3565b81518110614d7257614d72615855565b602002602001018181525050868181518110614d9057614d90615855565b602002602001015160200151600060028110614dae57614dae615855565b602002015184614dbf8360066158fa565b614dca9060046158b3565b81518110614dda57614dda615855565b602002602001018181525050868181518110614df857614df8615855565b602002602001015160200151600160028110614e1657614e16615855565b602002015184614e278360066158fa565b614e329060056158b3565b81518110614e4257614e42615855565b602090810291909101015280614e5781615937565b915050614c29565b50602082602086026020860160085afa905080614e7b57600080fd5b5051151595945050505050565b600080614e936156aa565b6000614eb2604051806040016040528060008152602001600081525090565b8783526020830187905260408084018790528160608560075afa915081614ed857600080fd5b8051602090910151909890975095505050505050565b600080614ef96156c8565b87815260208101879052604081018690526060810185905260808101849052614f21816153fc565b6060810151608090910151909890975095505050505050565b60028282614f4781615937565b935060908110614f5957614f59615855565b6020020152828282614f6a81615937565b935060908110614f7c57614f7c615855565b6020020152505050565b60018282614f9381615937565b935060908110614fa557614fa5615855565b6020020152838282614fb681615937565b935060908110614fc857614fc8615855565b6020020152828282614fd981615937565b935060908110614feb57614feb615855565b602002015250505050565b600080838363ffffffff166090811061501157615011615855565b60200201818152505060006150438484602061502d9190615986565b6150389060016159b2565b63ffffffff16615437565b51905061504f8161546d565b93525090919050565b600061506261560b565b61506a61568c565b6020808352828101819052604083018190526060830186905260808301859052600080516020615a4583398151915260a08401526000908260c08560055afa9050806150b557600080fd5b5051949350505050565b6000816000036150ce57600080fd5b600080516020615a458339815191526150e6836155e1565b84099392505050565b6000600080516020615a4583398151915282600080516020615a4583398151915285870908949350505050565b6000805b60208110156151955760ff80851690811461517c5760089490941c93600080516020615a4583398151915287826054811061515d5761515d615855565b6020020151600080516020615a45833981519152868909089350615182565b50615195565b5061518e6001826158b3565b9050615120565b5090949350505050565b6000806151aa6156c8565b606081018590526080810184905260005b602081101561528c5760ff80881690811461527357601088901c9760081c60ff168a8a838181106151ee576151ee615855565b905060200201358460006005811061520857615208615855565b60200201528a8a61521a8460016158b3565b81811061522957615229615855565b905060200201358460016005811061524357615243615855565b60200201528b816054811061525a5761525a615855565b6020020151604085015261526d846153fc565b50615279565b5061528c565b506152856002826158b3565b90506151bb565b50606081015160809091015190999098509650505050505050565b60008060006152c9604051806040016040528060008152602001600081525090565b6152d16156e6565b888152602081018890526040808201889052606082018790528260808360065afa9250826152fe57600080fd5b508051602090910151909890975095505050505050565b6000805b60208110156153ac5760ff80851690811461539357601085901c9460081c60ff16600080516020615a4583398151915285600080516020615a458339815191528b846054811061536b5761536b615855565b60200201518b8b8781811061538257615382615855565b905060200201350908945050615399565b506153ac565b506153a56002826158b3565b9050615319565b509095945050505050565b6000806153ef8686866153ea877f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4761596f565b6152a7565b9150915094509492505050565b600060406020830160608460075afa90508061541757600080fd5b60406060830160806020850160065afa90508061543357600080fd5b5050565b61543f61568c565b6000602082848660026107d05a03fa9050808061545857fe5b5080615466576154666159da565b5092915050565b6000816155c08160008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b6008827fff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0016901c1790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b6010827fffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff000016901c1790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b6020827fffffffff00000000ffffffff00000000ffffffff00000000ffffffff0000000016901c17905060408177ffffffffffffffff0000000000000000ffffffffffffffff16901b6040827fffffffffffffffff0000000000000000ffffffffffffffff000000000000000016901c179050608081901b608082901c179050919050565b90506155da600080516020615a4583398151915282615a09565b9392505050565b6000615605826156006002600080516020615a4583398151915261596f565b615058565b92915050565b6040518060c001604052806006906020820280368337509192915050565b604051806040016040528061563c615704565b8152602001615649615704565b905290565b60405180610a8001604052806054906020820280368337509192915050565b6040518061120001604052806090906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b60405180606001604052806003906020820280368337509192915050565b6040518060a001604052806005906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b60008083601f84011261573457600080fd5b50813567ffffffffffffffff81111561574c57600080fd5b6020830191508360208260051b850101111561576757600080fd5b9250929050565b60008060008060006060868803121561578657600080fd5b853567ffffffffffffffff8082111561579e57600080fd5b6157aa89838a01615722565b909750955060208801359150808211156157c357600080fd5b506157d088828901615722565b96999598509660400135949350505050565b600060208083528351808285015260005b8181101561580f578581018301518582016040015282016157f3565b81811115615821576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156158c6576158c6615884565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561593257615932615884565b500290565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361596857615968615884565b5060010190565b60008282101561598157615981615884565b500390565b600063ffffffff808316818516818304811182151516156159a9576159a9615884565b02949350505050565b600063ffffffff8083168185168083038211156159d1576159d1615884565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082615a3f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50069056fe30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a164736f6c634300080f000a", - "key": "0x3dbf99296c1be8e244c0325b4861825343f8b995a643099d43c4d0bb066f6089" - }, "0xe7f1725e7734ce288f8367e1bb143e90bb3f0512": { "balance": "0", "nonce": 1, - "root": "0x8b38b254a09fd3281cd9834f3fed870d38e9c60b49ba23e08a4df52eb999080c", + "root": "0xc7149db1c8201df1156bca20167d25250e7236968f8788b87d2f748d30f66efc", "codeHash": "0x1f958654ab06a152993e7a0ae7b6dbb0d4b19265cc9337b8789fe1353bd9dc35", "code": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a", "storage": { @@ -534,18 +568,37 @@ "0x0000000000000000000000000000000000000000000000000000000000000068": "01c9c380", "0x0000000000000000000000000000000000000000000000000000000000000069": "ffffffffffffffffffffffffffffffff000f42403b9aca00080a01312d00", "0x000000000000000000000000000000000000000000000000000000000000006a": "1388", - "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "851356ae760d987e095750cceb3bc6014560891c", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "f5059a5d33d5853360d16c683c16e67980206f36", "0x65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08": "9965507d1a55bcc2695c58ba16fb37d819b0a4dc", "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "5fbdb2315678afecb367f032d93f642f64180aa3" }, "key": "0x798c6047767c10f653ca157a7f66a592a1d6ca550cae352912be0b0745336afd" }, "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266": { - "balance": "831774178418903039", - "nonce": 51, + "balance": "798018456049133529", + "nonce": 58, "root": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", "codeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", "key": "0xe9707d0e6171f728f7473c24cc0432a9b07eaaf1efed6a137a4a8c12c79552d9" + }, + "0xf5059a5d33d5853360d16c683c16e67980206f36": { + "balance": "0", + "nonce": 1, + "root": "0x1f6d4a6bd29feba7ce7b0aeb56e30f5d7718d9230959d0621e846e72f6d850c9", + "codeHash": "0xf088100162a48771cf9ad3b57490a878312e56f8afcf21e4fee9675799e494f2", + "code": "0x608060405234801561001057600080fd5b50600436106101775760003560e01c8063c71973f6116100d8578063ed579ad31161008c578063f68016b711610066578063f68016b71461046d578063fc7ffea714610481578063ffa1ad741461049457600080fd5b8063ed579ad314610448578063f2fde38b14610451578063f45e65d81461046457600080fd5b8063cc731b02116100bd578063cc731b02146102f8578063e81b2c6d1461042c578063ecdd939d1461043557600080fd5b8063c71973f6146102d2578063c9b26f61146102e557600080fd5b806354fd4d501161012f5780638da5cb5b116101145780638da5cb5b1461028e578063935f029e146102ac578063b40a817c146102bf57600080fd5b806354fd4d501461023d578063715018a61461028657600080fd5b80631fd19ee1116101605780631fd19ee1146101ad5780634add321d146101f55780634f16540b1461021657600080fd5b80630c18c1621461017c57806318d1391814610198575b600080fd5b61018560655481565b6040519081526020015b60405180910390f35b6101ab6101a6366004611139565b61049c565b005b7f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08545b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161018f565b6101fd610560565b60405167ffffffffffffffff909116815260200161018f565b6101857f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0881565b6102796040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b60405161018f91906111c6565b6101ab61058b565b60335473ffffffffffffffffffffffffffffffffffffffff166101d0565b6101ab6102ba3660046111d9565b61059f565b6101ab6102cd366004611213565b610638565b6101ab6102e036600461133c565b610709565b6101ab6102f3366004611358565b61071d565b6103bc6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c08101825260695463ffffffff8082168352640100000000820460ff9081166020850152650100000000008304169383019390935266010000000000008104831660608301526a0100000000000000000000810490921660808201526e0100000000000000000000000000009091046fffffffffffffffffffffffffffffffff1660a082015290565b60405161018f9190600060c08201905063ffffffff80845116835260ff602085015116602084015260ff6040850151166040840152806060850151166060840152806080850151166080840152506fffffffffffffffffffffffffffffffff60a08401511660a083015292915050565b61018560675481565b6101ab610443366004611358565b61074d565b610185606a5481565b6101ab61045f366004611139565b61081b565b61018560665481565b6068546101fd9067ffffffffffffffff1681565b6101ab61048f366004611371565b6108b5565b610185600081565b6104a4610b3a565b6104cc817f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c0855565b6040805173ffffffffffffffffffffffffffffffffffffffff8316602082015260009101604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060035b60007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be8360405161055491906111c6565b60405180910390a35050565b6069546000906105869063ffffffff6a010000000000000000000082048116911661141d565b905090565b610593610b3a565b61059d6000610ba1565b565b6105a7610b3a565b606582905560668190556040805160208101849052908101829052600090606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529050600160007f1d2b0bda21d56b8bd12d4f94ebacffdfb35f5e226f84b461103bb8beab6353be8360405161062b91906111c6565b60405180910390a3505050565b610640610b3a565b610648610560565b67ffffffffffffffff168167ffffffffffffffff1610156106b05760405162461bcd60e51b815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f770060448201526064015b60405180910390fd5b606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83169081179091556040805160208082019390935281518082039093018352810190526002610523565b610711610b3a565b61071a81610c18565b50565b610725610b3a565b6067819055604080516020808201849052825180830390910181529082019091526000610523565b610755610b3a565b6127108111156107f35760405162461bcd60e51b815260206004820152604860248201527f53797374656d436f6e6669673a20746865206d61782076616c7565206f66207660448201527f616c696461746f7220726577617264207363616c617220686173206265656e2060648201527f6578636565646564000000000000000000000000000000000000000000000000608482015260a4016106a7565b606a819055604080516020808201849052825180830390910181529082019091526004610523565b610823610b3a565b73ffffffffffffffffffffffffffffffffffffffff81166108ac5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016106a7565b61071a81610ba1565b600054610100900460ff16158080156108d55750600054600160ff909116105b806108ef5750303b1580156108ef575060005460ff166001145b6109615760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016106a7565b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156109bf57600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6109c761100a565b6109d08961081b565b606588905560668790556067869055606880547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff87161790557f65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08849055610a4083610c18565b610a48610560565b67ffffffffffffffff168567ffffffffffffffff161015610aab5760405162461bcd60e51b815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f770060448201526064016106a7565b606a8290558015610b1357600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff163b151590565b60335473ffffffffffffffffffffffffffffffffffffffff16331461059d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106a7565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8060a001516fffffffffffffffffffffffffffffffff16816060015163ffffffff161115610cae5760405162461bcd60e51b815260206004820152603560248201527f53797374656d436f6e6669673a206d696e206261736520666565206d7573742060448201527f6265206c657373207468616e206d61782062617365000000000000000000000060648201526084016106a7565b6001816040015160ff1611610d2b5760405162461bcd60e51b815260206004820152602f60248201527f53797374656d436f6e6669673a2064656e6f6d696e61746f72206d757374206260448201527f65206c6172676572207468616e2031000000000000000000000000000000000060648201526084016106a7565b6068546080820151825167ffffffffffffffff90921691610d4c9190611449565b63ffffffff161115610da05760405162461bcd60e51b815260206004820152601f60248201527f53797374656d436f6e6669673a20676173206c696d697420746f6f206c6f770060448201526064016106a7565b6000816020015160ff1611610e1d5760405162461bcd60e51b815260206004820152602f60248201527f53797374656d436f6e6669673a20656c6173746963697479206d756c7469706c60448201527f6965722063616e6e6f742062652030000000000000000000000000000000000060648201526084016106a7565b8051602082015163ffffffff82169160ff90911690610e3d908290611468565b610e4791906114b2565b63ffffffff1614610ec05760405162461bcd60e51b815260206004820152603760248201527f53797374656d436f6e6669673a20707265636973696f6e206c6f73732077697460448201527f6820746172676574207265736f75726365206c696d697400000000000000000060648201526084016106a7565b805160698054602084015160408501516060860151608087015160a09097015163ffffffff9687167fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009095169490941764010000000060ff94851602177fffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffffff166501000000000093909216929092027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff1617660100000000000091851691909102177fffff0000000000000000000000000000000000000000ffffffffffffffffffff166a010000000000000000000093909416929092027fffff00000000000000000000000000000000ffffffffffffffffffffffffffff16929092176e0100000000000000000000000000006fffffffffffffffffffffffffffffffff90921691909102179055565b600054610100900460ff166110875760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106a7565b61059d600054610100900460ff166111075760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106a7565b61059d33610ba1565b803573ffffffffffffffffffffffffffffffffffffffff8116811461113457600080fd5b919050565b60006020828403121561114b57600080fd5b61115482611110565b9392505050565b6000815180845260005b8181101561118157602081850181015186830182015201611165565b81811115611193576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611154602083018461115b565b600080604083850312156111ec57600080fd5b50508035926020909101359150565b803567ffffffffffffffff8116811461113457600080fd5b60006020828403121561122557600080fd5b611154826111fb565b803563ffffffff8116811461113457600080fd5b803560ff8116811461113457600080fd5b80356fffffffffffffffffffffffffffffffff8116811461113457600080fd5b600060c0828403121561128557600080fd5b60405160c0810181811067ffffffffffffffff821117156112cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040529050806112de8361122e565b81526112ec60208401611242565b60208201526112fd60408401611242565b604082015261130e6060840161122e565b606082015261131f6080840161122e565b608082015261133060a08401611253565b60a08201525092915050565b600060c0828403121561134e57600080fd5b6111548383611273565b60006020828403121561136a57600080fd5b5035919050565b6000806000806000806000806101a0898b03121561138e57600080fd5b61139789611110565b97506020890135965060408901359550606089013594506113ba60808a016111fb565b93506113c860a08a01611110565b92506113d78a60c08b01611273565b915061018089013590509295985092959890939650565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600067ffffffffffffffff808316818516808303821115611440576114406113ee565b01949350505050565b600063ffffffff808316818516808303821115611440576114406113ee565b600063ffffffff808416806114a6577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b600063ffffffff808316818516818304811182151516156114d5576114d56113ee565b0294935050505056fea164736f6c634300080f000a", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000000": "01", + "0x0000000000000000000000000000000000000000000000000000000000000033": "0dcd1bf9a1b36ce34237eeafef220932846bcd82", + "0x0000000000000000000000000000000000000000000000000000000000000065": "0834", + "0x0000000000000000000000000000000000000000000000000000000000000066": "0f4240", + "0x0000000000000000000000000000000000000000000000000000000000000067": "3c44cdddb6a900fa2b585dd299e03d12fa4293bc", + "0x0000000000000000000000000000000000000000000000000000000000000068": "01c9c380", + "0x0000000000000000000000000000000000000000000000000000000000000069": "ffffffffffffffffffffffffffffffff000f42403b9aca00080a01312d00", + "0x000000000000000000000000000000000000000000000000000000000000006a": "1388", + "0x65a7ed542fb37fe237fdfbdd70b31598523fe5b32879e307bae27a0bd9581c08": "9965507d1a55bcc2695c58ba16fb37d819b0a4dc" + }, + "key": "0x4e64a3fa2e772a9bdbceaca76b8ed475afcab9e7be1b46f004a5be4ed3f6db95" } } } diff --git a/kroma-chain-ops/genesis/testdata/deploy.json b/kroma-chain-ops/genesis/testdata/deploy.json index ece452aed8..9e8102b662 100644 --- a/kroma-chain-ops/genesis/testdata/deploy.json +++ b/kroma-chain-ops/genesis/testdata/deploy.json @@ -1,35 +1,40 @@ { - "Colosseum": "0x84eA74d481Ee0A5332c457a4d796187F6Ba67fEB", + "AssetManager": "0x82e01223d51Eb87e16A03E24687EDF0F294da6f1", + "AssetManagerProxy": "0x0B306BF915C4d645ff596e518fAf3F9669b97016", + "Colosseum": "0x9E545E3C0baAB3E08CdfD552C960A1050f373042", "ColosseumProxy": "0x610178dA211FEF7D417bC0e6FeD39F05609AD788", - "KromaMintableERC20Factory": "0xa85233C63b9Ee964Add6F2cffe00Fd84eb32338f", + "KromaMintableERC20Factory": "0x4A679253410272dd5232B3Ff7cF5dbB88f295319", "KromaMintableERC20FactoryProxy": "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6", - "KromaPortal": "0xa82fF9aFd8f496c3d6ac40E2a0F282E47488CFc9", + "KromaPortal": "0x1613beB3B2C4f22Ee086B2b38C1476A3cE7f78E8", "KromaPortalProxy": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", - "L1CrossDomainMessenger": "0x68B1D87F95878fE05B998F19b66F4baba5De1aed", + "L1CrossDomainMessenger": "0x3Aa5ebB10DC797CAC828524e59A333d0A371443c", "L1CrossDomainMessengerProxy": "0x5FC8d32690cc91D4c39d9d3abcBD16989F875707", - "L1ERC721Bridge": "0x4ed7c70F96B99c776995fB64377f0d4aB3B0e1C1", + "L1ERC721Bridge": "0x322813Fd9A801c5507c9de605d63CEA4f2CE6c44", "L1ERC721BridgeProxy": "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853", - "L1GovernanceToken": "0x4c5859f0F772848b2D91F1D83E2Fe57935348029", - "L1GovernanceTokenProxy": "0x0B306BF915C4d645ff596e518fAf3F9669b97016", - "L1StandardBridge": "0xc6e7DF5E7b4f2A278906862b61205850344D4e7d", + "L1GovernanceToken": "0x5f3f1dBD7B74C6B46e8c44f98792A1dAf8d69154", + "L1GovernanceTokenProxy": "0x4c5859f0F772848b2D91F1D83E2Fe57935348029", + "L1MintManager": "0x1291Be112d480055DaFd8a610b7d1e203891C274", + "L1StandardBridge": "0x59b670e9fA9D0A427751Af201D676719a970857b", "L1StandardBridgeProxy": "0x0165878A594ca255338adfa4d48449f69242Eb8F", - "L2OutputOracle": "0xc5a5C42992dECbae36851359345FE25997F5C42d", + "L2OutputOracle": "0x67d269191c92Caf3cD7723F116c85e6E9bf55933", "L2OutputOracleProxy": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9", - "Poseidon2": "0x959922bE3CAee4b8Cd9a407cc3ac1C251C2007B1", + "Poseidon2": "0x9A9f2CCfdE556A7E9Ff0848998Aa4a0CFD8863AE", "ProxyAdmin": "0x5FbDB2315678afecb367f032d93F642f64180aa3", "SecurityCouncil": "0x36C02dA8a0983159322a80FFE9F24b1acfF8B570", "SecurityCouncilProxy": "0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e", - "SecurityCouncilToken": "0x95401dc811bb5740090279Ba06cfA8fcF6113778", + "SecurityCouncilToken": "0x998abeb3E57409262aE5b751f60747921B33613E", "SecurityCouncilTokenProxy": "0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0", - "SystemConfig": "0x851356ae760d987E095750cCeb3bC6014560891C", + "SystemConfig": "0xf5059a5D33d5853360D16C683c16e67980206f36", "SystemConfigProxy": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", "TimeLock": "0x0E801D84Fa97b50751Dbf25036d067dCf18858bF", "TimeLockProxy": "0x0DCd1Bf9A1b36cE34237eEaFef220932846BCD82", "UpgradeGovernor": "0x9d4454B023096f34B160D6B654540c56A1F81688", "UpgradeGovernorProxy": "0x9A676e781A523b5d0C0e43731313A708CB607508", - "ValidatorPool": "0x7a2088a1bFc9d81c55368AE168C2C02570cB814F", + "ValidatorManager": "0x7969c5eD335650692Bc04293B07F5BF2e7A673C0", + "ValidatorManagerProxy": "0x959922bE3CAee4b8Cd9a407cc3ac1C251C2007B1", + "ValidatorPool": "0x09635F643e140090A9A8Dcd712eD6285858ceBef", "ValidatorPoolProxy": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", - "ZKMerkleTrie": "0x9A9f2CCfdE556A7E9Ff0848998Aa4a0CFD8863AE", - "ZKVerifier": "0xE6E340D132b5f46d1e472DebcD681B2aBc16e57E", + "ZKMerkleTrie": "0x68B1D87F95878fE05B998F19b66F4baba5De1aed", + "ZKVerifier": "0xc3e53F4d16Ae77Db1c982e75a937B9f60FE63690", "ZKVerifierProxy": "0x8A791620dd6260079BF849Dc5567aDC3F2FdC318" } diff --git a/kroma-chain-ops/genesis/testdata/l1-deployments.json b/kroma-chain-ops/genesis/testdata/l1-deployments.json index ece452aed8..9e8102b662 100644 --- a/kroma-chain-ops/genesis/testdata/l1-deployments.json +++ b/kroma-chain-ops/genesis/testdata/l1-deployments.json @@ -1,35 +1,40 @@ { - "Colosseum": "0x84eA74d481Ee0A5332c457a4d796187F6Ba67fEB", + "AssetManager": "0x82e01223d51Eb87e16A03E24687EDF0F294da6f1", + "AssetManagerProxy": "0x0B306BF915C4d645ff596e518fAf3F9669b97016", + "Colosseum": "0x9E545E3C0baAB3E08CdfD552C960A1050f373042", "ColosseumProxy": "0x610178dA211FEF7D417bC0e6FeD39F05609AD788", - "KromaMintableERC20Factory": "0xa85233C63b9Ee964Add6F2cffe00Fd84eb32338f", + "KromaMintableERC20Factory": "0x4A679253410272dd5232B3Ff7cF5dbB88f295319", "KromaMintableERC20FactoryProxy": "0x2279B7A0a67DB372996a5FaB50D91eAA73d2eBe6", - "KromaPortal": "0xa82fF9aFd8f496c3d6ac40E2a0F282E47488CFc9", + "KromaPortal": "0x1613beB3B2C4f22Ee086B2b38C1476A3cE7f78E8", "KromaPortalProxy": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", - "L1CrossDomainMessenger": "0x68B1D87F95878fE05B998F19b66F4baba5De1aed", + "L1CrossDomainMessenger": "0x3Aa5ebB10DC797CAC828524e59A333d0A371443c", "L1CrossDomainMessengerProxy": "0x5FC8d32690cc91D4c39d9d3abcBD16989F875707", - "L1ERC721Bridge": "0x4ed7c70F96B99c776995fB64377f0d4aB3B0e1C1", + "L1ERC721Bridge": "0x322813Fd9A801c5507c9de605d63CEA4f2CE6c44", "L1ERC721BridgeProxy": "0xa513E6E4b8f2a923D98304ec87F64353C4D5C853", - "L1GovernanceToken": "0x4c5859f0F772848b2D91F1D83E2Fe57935348029", - "L1GovernanceTokenProxy": "0x0B306BF915C4d645ff596e518fAf3F9669b97016", - "L1StandardBridge": "0xc6e7DF5E7b4f2A278906862b61205850344D4e7d", + "L1GovernanceToken": "0x5f3f1dBD7B74C6B46e8c44f98792A1dAf8d69154", + "L1GovernanceTokenProxy": "0x4c5859f0F772848b2D91F1D83E2Fe57935348029", + "L1MintManager": "0x1291Be112d480055DaFd8a610b7d1e203891C274", + "L1StandardBridge": "0x59b670e9fA9D0A427751Af201D676719a970857b", "L1StandardBridgeProxy": "0x0165878A594ca255338adfa4d48449f69242Eb8F", - "L2OutputOracle": "0xc5a5C42992dECbae36851359345FE25997F5C42d", + "L2OutputOracle": "0x67d269191c92Caf3cD7723F116c85e6E9bf55933", "L2OutputOracleProxy": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9", - "Poseidon2": "0x959922bE3CAee4b8Cd9a407cc3ac1C251C2007B1", + "Poseidon2": "0x9A9f2CCfdE556A7E9Ff0848998Aa4a0CFD8863AE", "ProxyAdmin": "0x5FbDB2315678afecb367f032d93F642f64180aa3", "SecurityCouncil": "0x36C02dA8a0983159322a80FFE9F24b1acfF8B570", "SecurityCouncilProxy": "0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e", - "SecurityCouncilToken": "0x95401dc811bb5740090279Ba06cfA8fcF6113778", + "SecurityCouncilToken": "0x998abeb3E57409262aE5b751f60747921B33613E", "SecurityCouncilTokenProxy": "0xA51c1fc2f0D1a1b8494Ed1FE312d7C3a78Ed91C0", - "SystemConfig": "0x851356ae760d987E095750cCeb3bC6014560891C", + "SystemConfig": "0xf5059a5D33d5853360D16C683c16e67980206f36", "SystemConfigProxy": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512", "TimeLock": "0x0E801D84Fa97b50751Dbf25036d067dCf18858bF", "TimeLockProxy": "0x0DCd1Bf9A1b36cE34237eEaFef220932846BCD82", "UpgradeGovernor": "0x9d4454B023096f34B160D6B654540c56A1F81688", "UpgradeGovernorProxy": "0x9A676e781A523b5d0C0e43731313A708CB607508", - "ValidatorPool": "0x7a2088a1bFc9d81c55368AE168C2C02570cB814F", + "ValidatorManager": "0x7969c5eD335650692Bc04293B07F5BF2e7A673C0", + "ValidatorManagerProxy": "0x959922bE3CAee4b8Cd9a407cc3ac1C251C2007B1", + "ValidatorPool": "0x09635F643e140090A9A8Dcd712eD6285858ceBef", "ValidatorPoolProxy": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", - "ZKMerkleTrie": "0x9A9f2CCfdE556A7E9Ff0848998Aa4a0CFD8863AE", - "ZKVerifier": "0xE6E340D132b5f46d1e472DebcD681B2aBc16e57E", + "ZKMerkleTrie": "0x68B1D87F95878fE05B998F19b66F4baba5De1aed", + "ZKVerifier": "0xc3e53F4d16Ae77Db1c982e75a937B9f60FE63690", "ZKVerifierProxy": "0x8A791620dd6260079BF849Dc5567aDC3F2FdC318" } diff --git a/kroma-chain-ops/genesis/testdata/test-deploy-config-devnet-l1.json b/kroma-chain-ops/genesis/testdata/test-deploy-config-devnet-l1.json index 7e5007370d..1d3abe9f4f 100644 --- a/kroma-chain-ops/genesis/testdata/test-deploy-config-devnet-l1.json +++ b/kroma-chain-ops/genesis/testdata/test-deploy-config-devnet-l1.json @@ -28,9 +28,6 @@ "fundDevAccounts": true, "enableGovernance": true, - "governanceTokenSymbol": "KRO", - "governanceTokenName": "Kroma", - "governanceTokenOwner": "0x0000000000000000000000000000000000000333", "l2GenesisRegolithTimeOffset": "0x0", "l2GenesisCanyonTimeOffset": "0x0", diff --git a/kroma-chain-ops/genesis/testdata/test-deploy-config-full.json b/kroma-chain-ops/genesis/testdata/test-deploy-config-full.json index 314b58c460..ecb6fd3712 100644 --- a/kroma-chain-ops/genesis/testdata/test-deploy-config-full.json +++ b/kroma-chain-ops/genesis/testdata/test-deploy-config-full.json @@ -46,9 +46,6 @@ "gasPriceOracleOverhead": 2100, "gasPriceOracleScalar": 1000000, "enableGovernance": true, - "governanceTokenSymbol": "KRO", - "governanceTokenName": "Kroma", - "governanceTokenOwner": "0x0000000000000000000000000000000000000333", "deploymentWaitConfirmations": 1, "eip1559Denominator": 8, "eip1559DenominatorCanyon": 12, @@ -62,6 +59,21 @@ "validatorPoolRequiredBondAmount": "0x1", "validatorPoolMaxUnbond": 10, "validatorPoolRoundDuration": 4, + "validatorPoolTerminateOutputIndex": "0x0", + "validatorManagerTrustedValidator": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", + "validatorManagerMinRegisterAmount": "0x1", + "validatorManagerMinActivateAmount": "0x2", + "validatorManagerCommissionChangeDelaySeconds": 2, + "validatorManagerRoundDurationSeconds": 4, + "validatorManagerSoftJailPeriodSeconds": 1, + "validatorManagerHardJailPeriodSeconds": 2, + "validatorManagerJailThreshold": 2, + "validatorManagerMaxFinalizations": 10, + "validatorManagerBaseReward": "0x1", + "assetManagerKgh": "0xff000000000000000000000000000000000000ff", + "assetManagerVault": "0x14dc79964da2c08b23698b3d3cc7ca32193d9955", + "assetManagerMinDelegationPeriod": 2, + "assetManagerBondAmount": "0xa", "securityCouncilOwners": [ "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", "0x71be63f3384f5fb98995898a86b02fb2426c5788", @@ -83,7 +95,35 @@ "zkVerifierHashScalar": "0xb54142d3712f03ff5c15914a3dce82c0d8a8d537e165e2342048adf14e34aa", "zkVerifierM56Px": "0x175a2d1aaf07ee184a955e35f3deac123ef1088b68c38bace37056dcfc9d304d", "zkVerifierM56Py": "0x150856c3d1750c2578b823cb3c7d74ed3e94c1cfece7e1bfdaaff36eea788fb9", - "l1GovernanceTokenProxy": "0x4200000000000000000000000000000000000064" + "governanceTokenNotUseCreate2": true, + "governanceTokenProxySalt": "0x0000000000000000000000000000000000000000000000000000004b726f6d61", + "mintManagerOwner": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "l1MintManagerRecipients": [ + "0x14dc79964da2c08b23698b3d3cc7ca32193d9955", + "0xa0ee7a142d267c1f36714e4a8f75612f20a79720" + ], + "l1MintManagerShares": [ + 2000, + 3000 + ], + "l2MintManagerRecipients": [ + "0x15d34aaf54267db7d7c367839aaf71a00a2c6a65", + "0x23618e81e3f5cdf7f54c3d65f7fbc0abf5b21e8f", + "0x2546bcd3c84621e976d8185a91a922ae77ecec30", + "0x8626f6940e2eb28930efb4cef49b2d1f2c9c1199", + "0x90f79bf6eb2c4f870365e785982e1f101e93b906", + "0x976ea74026e726554db657fa54763abd0c3a0aa9", + "0xbcd4042de499d14e55001ccbb24a551f3b954096" + ], + "l2MintManagerShares": [ + 2000, + 16000, + 7000, + 13000, + 25000, + 15000, + 17000 + ] } diff --git a/kroma-chain-ops/immutables/immutables.go b/kroma-chain-ops/immutables/immutables.go index 779f58e04e..8d026c6f07 100644 --- a/kroma-chain-ops/immutables/immutables.go +++ b/kroma-chain-ops/immutables/immutables.go @@ -46,16 +46,11 @@ type PredeploysImmutableConfig struct { KromaMintableERC20Factory struct { Bridge common.Address } - L1BlockNumber struct{} - GasPriceOracle struct{} - L1Block struct{} - GovernanceToken struct { - // [Kroma: START] - Bridge common.Address - RemoteToken common.Address - // [Kroma: END] - } + L1BlockNumber struct{} + GasPriceOracle struct{} + L1Block struct{} /* [Kroma: START] + GovernanceToken struct{} LegacyMessagePasser struct{} [Kroma: END] */ L2ERC721Bridge struct { @@ -295,18 +290,6 @@ func l2ImmutableDeployer(backend *backends.SimulatedBackend, opts *bind.Transact case "EAS": _, tx, _, err = bindings.DeployEAS(opts, backend) [Kroma: END] */ - // [Kroma: START] - case "GovernanceToken": - bridge, ok := deployment.Args[0].(common.Address) - if !ok { - return nil, fmt.Errorf("invalid type for bridge") - } - remoteToken, ok := deployment.Args[1].(common.Address) - if !ok { - return nil, fmt.Errorf("invalid type for remoteToken") - } - _, tx, _, err = bindings.DeployGovernanceToken(opts, backend, bridge, remoteToken) - // [Kroma: END] default: return tx, fmt.Errorf("unknown contract: %s", deployment.Name) } diff --git a/kroma-chain-ops/immutables/immutables_test.go b/kroma-chain-ops/immutables/immutables_test.go index d6b4d609f0..45bb244c0e 100644 --- a/kroma-chain-ops/immutables/immutables_test.go +++ b/kroma-chain-ops/immutables/immutables_test.go @@ -40,13 +40,7 @@ func TestBuildKroma(t *testing.T) { L1BlockNumber: struct{}{}, GasPriceOracle: struct{}{}, L1Block: struct{}{}, - GovernanceToken: struct { - Bridge common.Address - RemoteToken common.Address - }{ - Bridge: predeploys.L2StandardBridgeAddr, - RemoteToken: common.HexToAddress("0x1234567890123456789012345678901234567890"), - }, + // GovernanceToken: struct{}{}, // LegacyMessagePasser: struct{}{}, L2ERC721Bridge: struct { OtherBridge common.Address diff --git a/kroma-devnet/devnet/__init__.py b/kroma-devnet/devnet/__init__.py index dd868e3297..cc8ee2d57a 100644 --- a/kroma-devnet/devnet/__init__.py +++ b/kroma-devnet/devnet/__init__.py @@ -153,7 +153,7 @@ def deploy_contracts(paths): ], env={}, cwd=paths.contracts_bedrock_dir) run_command([ - 'npx', 'hardhat', 'deploy', '--network', 'devnetL1' + 'npx', 'hardhat', 'deploy', '--network', 'devnetL1', '--tags', 'setup' ], env={}, cwd=paths.contracts_bedrock_dir) run_command([ @@ -272,6 +272,10 @@ def devnet_deploy(paths): log.info(f'Using Colosseum {colosseum}') validator_pool = addresses['ValidatorPoolProxy'] log.info(f'Using ValidatorPool {validator_pool}') + validator_manager = addresses['ValidatorManagerProxy'] + log.info(f'Using ValidatorManager {validator_manager}') + asset_manager = addresses['AssetManagerProxy'] + log.info(f'Using AssetManager {asset_manager}') log.info('Bringing up `kroma-node`, `kroma-batcher` and `kroma-validator`.') run_command(['docker', 'compose', 'up', '-d', 'kroma-node', 'kroma-batcher', 'kroma-validator'], cwd=paths.ops_bedrock_dir, env={ @@ -279,12 +283,33 @@ def devnet_deploy(paths): 'L2OO_ADDRESS': l2_output_oracle, 'COLOSSEUM_ADDRESS': colosseum, 'VALPOOL_ADDRESS': validator_pool, + 'VALMGR_ADDRESS': validator_manager, + 'ASSETMANAGER_ADDRESS': asset_manager, 'SEQUENCER_BATCH_INBOX_ADDRESS': batch_inbox_address }) log.info("Deposit ETH into ValidatorPool contract to be a validator...") run_command(['docker', 'compose', 'exec', 'kroma-validator', 'kroma-validator', 'deposit', '--amount', '1000000000'], cwd=paths.ops_bedrock_dir) + + log.info("Register to ValidatorManager contract to be a validator...") + run_command( + [ + 'docker', + 'compose', + 'exec', + 'kroma-validator', + 'kroma-validator', + 'register', + '--amount', + '100', + '--commission-rate', + '5', + '--withdraw-account', + '0x70997970C51812dc3A010C7d01b50e0d17dc79C8', + ], + cwd=paths.ops_bedrock_dir, + ) # [Kroma: END] log.info('Bringing up `artifact-server`') diff --git a/kroma-validator/abi_test.go b/kroma-validator/abi_test.go index d4c8e7def7..b9e10b66bb 100644 --- a/kroma-validator/abi_test.go +++ b/kroma-validator/abi_test.go @@ -33,6 +33,7 @@ func setupL2OutputOracle() (common.Address, *bind.TransactOpts, *backends.Simula opts, backend, common.Address{0xdd}, + common.Address{0xcc}, common.Address{0xee}, big.NewInt(10), big.NewInt(2), diff --git a/kroma-validator/challenge/status.go b/kroma-validator/challenge/status.go index f2cd53ea5d..37f85cde1f 100644 --- a/kroma-validator/challenge/status.go +++ b/kroma-validator/challenge/status.go @@ -1,8 +1,8 @@ package challenge const ( - // StatusNone is regarded as a challenge is not in progress. - // The other status are regarded as a challenge is in progress. + // StatusNone is regarded as a challenge that is not in progress. + // The others are regarded as a challenge in progress. StatusNone uint8 = iota StatusChallengerTurn StatusAsserterTurn diff --git a/kroma-validator/challenger.go b/kroma-validator/challenger.go index 3b4dd5b9ff..6a404ef758 100644 --- a/kroma-validator/challenger.go +++ b/kroma-validator/challenger.go @@ -10,6 +10,9 @@ import ( "sync" "time" + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/optsutils" + "github.com/ethereum-optimism/optimism/op-service/watcher" "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" @@ -19,9 +22,6 @@ import ( "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/log" - "github.com/ethereum-optimism/optimism/op-service/eth" - "github.com/ethereum-optimism/optimism/op-service/optsutils" - "github.com/ethereum-optimism/optimism/op-service/watcher" "github.com/kroma-network/kroma/kroma-bindings/bindings" chal "github.com/kroma-network/kroma/kroma-validator/challenge" "github.com/kroma-network/kroma/kroma-validator/metrics" @@ -43,17 +43,21 @@ type Challenger struct { l1Client *ethclient.Client l2Client *ethclient.Client - l2ooContract *bindings.L2OutputOracle - l2ooABI *abi.ABI + l2OOContract *bindings.L2OutputOracle + l2OOABI *abi.ABI colosseumContract *bindings.Colosseum colosseumABI *abi.ABI - valpoolContract *bindings.ValidatorPoolCaller + valPoolContract *bindings.ValidatorPoolCaller + valMgrContract *bindings.ValidatorManagerCaller + assetMgrContract *bindings.AssetManagerCaller submissionInterval *big.Int finalizationPeriodSeconds *big.Int l2BlockTime *big.Int checkpoint *big.Int - requiredBondAmount *big.Int + requiredBondAmountV1 *big.Int + requiredBondAmountV2 *big.Int + valPoolTerminationIndex *big.Int l2OutputSubmittedSub ethereum.Subscription challengeCreatedSub ethereum.Subscription @@ -75,17 +79,27 @@ func NewChallenger(cfg Config, l log.Logger, m metrics.Metricer) (*Challenger, e return nil, err } - l2ooContract, err := bindings.NewL2OutputOracle(cfg.L2OutputOracleAddr, cfg.L1Client) + l2OOContract, err := bindings.NewL2OutputOracle(cfg.L2OutputOracleAddr, cfg.L1Client) + if err != nil { + return nil, err + } + + l2OOABI, err := bindings.L2OutputOracleMetaData.GetAbi() + if err != nil { + return nil, err + } + + valPoolContract, err := bindings.NewValidatorPoolCaller(cfg.ValidatorPoolAddr, cfg.L1Client) if err != nil { return nil, err } - l2ooABI, err := bindings.L2OutputOracleMetaData.GetAbi() + valMgrContract, err := bindings.NewValidatorManagerCaller(cfg.ValidatorManagerAddr, cfg.L1Client) if err != nil { return nil, err } - valpoolContract, err := bindings.NewValidatorPoolCaller(cfg.ValidatorPoolAddr, cfg.L1Client) + assetMgrContract, err := bindings.NewAssetManagerCaller(cfg.AssetManagerAddr, cfg.L1Client) if err != nil { return nil, err } @@ -98,11 +112,13 @@ func NewChallenger(cfg Config, l log.Logger, m metrics.Metricer) (*Challenger, e l1Client: cfg.L1Client, l2Client: cfg.L2Client, - l2ooContract: l2ooContract, - l2ooABI: l2ooABI, + l2OOContract: l2OOContract, + l2OOABI: l2OOABI, colosseumContract: colosseumContract, colosseumABI: colosseumABI, - valpoolContract: valpoolContract, + valPoolContract: valPoolContract, + valMgrContract: valMgrContract, + assetMgrContract: assetMgrContract, }, nil } @@ -112,7 +128,7 @@ func (c *Challenger) InitConfig(ctx context.Context) error { err := contractWatcher.WatchUpgraded(c.cfg.L2OutputOracleAddr, func() error { cCtx, cCancel := context.WithTimeout(ctx, c.cfg.NetworkTimeout) defer cCancel() - submissionInterval, err := c.l2ooContract.SUBMISSIONINTERVAL(optsutils.NewSimpleCallOpts(cCtx)) + submissionInterval, err := c.l2OOContract.SUBMISSIONINTERVAL(optsutils.NewSimpleCallOpts(cCtx)) if err != nil { return fmt.Errorf("failed to get submission interval: %w", err) } @@ -120,7 +136,7 @@ func (c *Challenger) InitConfig(ctx context.Context) error { cCtx, cCancel = context.WithTimeout(ctx, c.cfg.NetworkTimeout) defer cCancel() - l2BlockTime, err := c.l2ooContract.L2BLOCKTIME(optsutils.NewSimpleCallOpts(cCtx)) + l2BlockTime, err := c.l2OOContract.L2BLOCKTIME(optsutils.NewSimpleCallOpts(cCtx)) if err != nil { return fmt.Errorf("failed to get l2 block time: %w", err) } @@ -128,7 +144,7 @@ func (c *Challenger) InitConfig(ctx context.Context) error { cCtx, cCancel = context.WithTimeout(ctx, c.cfg.NetworkTimeout) defer cCancel() - finalizationPeriodSeconds, err := c.l2ooContract.FINALIZATIONPERIODSECONDS(optsutils.NewSimpleCallOpts(cCtx)) + finalizationPeriodSeconds, err := c.l2OOContract.FINALIZATIONPERIODSECONDS(optsutils.NewSimpleCallOpts(cCtx)) if err != nil { return fmt.Errorf("failed to get finalization period seconds: %w", err) } @@ -137,22 +153,45 @@ func (c *Challenger) InitConfig(ctx context.Context) error { return nil }) if err != nil { - return fmt.Errorf("failed to initiate l2oo config: %w", err) + return fmt.Errorf("failed to initiate l2OO config: %w", err) } err = contractWatcher.WatchUpgraded(c.cfg.ValidatorPoolAddr, func() error { cCtx, cCancel := context.WithTimeout(ctx, c.cfg.NetworkTimeout) defer cCancel() - requiredBondAmount, err := c.valpoolContract.REQUIREDBONDAMOUNT(optsutils.NewSimpleCallOpts(cCtx)) + requiredBondAmountV1, err := c.valPoolContract.REQUIREDBONDAMOUNT(optsutils.NewSimpleCallOpts(cCtx)) if err != nil { return fmt.Errorf("failed to get submission interval: %w", err) } - c.requiredBondAmount = requiredBondAmount + c.requiredBondAmountV1 = requiredBondAmountV1 + + cCtx, cCancel = context.WithTimeout(ctx, c.cfg.NetworkTimeout) + defer cCancel() + valPoolTerminationIndex, err := c.valPoolContract.TERMINATEOUTPUTINDEX(optsutils.NewSimpleCallOpts(cCtx)) + if err != nil { + return fmt.Errorf("failed to get valPool termination index: %w", err) + } + c.valPoolTerminationIndex = valPoolTerminationIndex return nil }) if err != nil { - return fmt.Errorf("failed to initiate valpool config: %w", err) + return fmt.Errorf("failed to initiate valPool config: %w", err) + } + + err = contractWatcher.WatchUpgraded(c.cfg.AssetManagerAddr, func() error { + cCtx, cCancel := context.WithTimeout(ctx, c.cfg.NetworkTimeout) + defer cCancel() + requiredBondAmountV2, err := c.assetMgrContract.BONDAMOUNT(optsutils.NewSimpleCallOpts(cCtx)) + if err != nil { + return fmt.Errorf("failed to get required bond amount of assetMgr: %w", err) + } + c.requiredBondAmountV2 = requiredBondAmountV2 + + return nil + }) + if err != nil { + return fmt.Errorf("failed to initiate assetMgr config: %w", err) } return nil @@ -168,7 +207,7 @@ func (c *Challenger) initSub() { if err != nil { c.log.Warn("resubscribing after failed OutputSubmitted event", "err", err) } - return c.l2ooContract.WatchOutputSubmitted(opts, c.l2OutputSubmittedEventChan, nil, nil, nil) + return c.l2OOContract.WatchOutputSubmitted(opts, c.l2OutputSubmittedEventChan, nil, nil, nil) }) } @@ -255,7 +294,7 @@ func (c *Challenger) loop() { func (c *Challenger) updateCheckpoint() error { cCtx, cCancel := context.WithTimeout(c.ctx, c.cfg.NetworkTimeout) defer cCancel() - nextOutputIndex, err := c.l2ooContract.NextOutputIndex(optsutils.NewSimpleCallOpts(cCtx)) + nextOutputIndex, err := c.l2OOContract.NextOutputIndex(optsutils.NewSimpleCallOpts(cCtx)) if err != nil { return fmt.Errorf("failed to get the latest output index: %w", err) } @@ -279,13 +318,13 @@ func (c *Challenger) scanPrevOutputs() error { return fmt.Errorf("failed to get sync status: %w", err) } - toBlock := new(big.Int).SetUint64(status.CurrentL1.Number) + toBlock := new(big.Int).SetUint64(status.HeadL1.Number) // TODO(0xHansLee): add L1BlockTime to rollup config and change to use it finalizationStartL1Block := new(big.Int).Sub(toBlock, new(big.Int).Div(c.finalizationPeriodSeconds, big.NewInt(12))) // The fromBlock is the maximum value of either genesis block(1) or the first block of the finalization window fromBlock := math.BigMax(common.Big1, finalizationStartL1Block) - outputSubmittedEvent := c.l2ooABI.Events[KeyEventOutputSubmitted] + outputSubmittedEvent := c.l2OOABI.Events[KeyEventOutputSubmitted] challengeCreatedEvent := c.colosseumABI.Events[KeyEventChallengeCreated] addresses := []common.Address{c.cfg.ColosseumAddr} @@ -313,13 +352,21 @@ func (c *Challenger) scanPrevOutputs() error { switch vLog.Address { // for OutputSubmitted event case c.cfg.L2OutputOracleAddr: - ev := NewOutputSubmittedEvent(vLog) + ev, err := NewOutputSubmittedEvent(vLog) + if err != nil { + c.log.Error("failed to parse output submitted event", "err", err) + continue + } // handle output c.wg.Add(1) - go c.handleOutput(ev.OutputIndex) + go c.handleOutput(ev.L2OutputIndex) // for ChallengeCreated event case c.cfg.ColosseumAddr: - ev := NewChallengeCreatedEvent(vLog) + ev, err := NewChallengeCreatedEvent(vLog) + if err != nil { + c.log.Error("failed to parse challenge created event", "err", err) + continue + } if ev.OutputIndex.Sign() == 1 && c.isRelatedChallenge(ev.Asserter, ev.Challenger) { c.wg.Add(1) go c.handleChallenge(ev.OutputIndex, ev.Asserter, ev.Challenger) @@ -438,12 +485,12 @@ func (c *Challenger) handleOutput(outputIndex *big.Int) { return } - hasEnoughDeposit, err := c.HasEnoughDeposit(c.ctx) + canCreateChallenge, err := c.CanCreateChallenge(c.ctx, outputIndex) if err != nil { c.log.Error(err.Error()) continue } - if !hasEnoughDeposit { + if !canCreateChallenge { continue } @@ -530,7 +577,7 @@ func (c *Challenger) handleChallenge(outputIndex *big.Int, asserter common.Addre continue } case chal.StatusChallengerTimeout: - // call challenger timeout to increase bond from pending bond + // call challenger timeout to take challenger's bond away tx, err := c.ChallengerTimeout(c.ctx, outputIndex, challenger) if err != nil { c.log.Error("failed to create challenger timeout tx", "err", err, "outputIndex", outputIndex, "challenger", challenger) @@ -545,7 +592,7 @@ func (c *Challenger) handleChallenge(outputIndex *big.Int, asserter common.Addre // if challenger if isChallenger && c.cfg.ChallengerEnabled { - // if output has been already deleted, cancel challenge to refund pending bond + // if output has been already deleted, cancel challenge to refund challenger's bond if isOutputDeleted && status != chal.StatusChallengerTimeout { tx, err := c.CancelChallenge(c.ctx, outputIndex) if err != nil { @@ -598,25 +645,80 @@ func (c *Challenger) submitChallengeTx(tx *types.Transaction) error { return c.cfg.TxManager.SendTransaction(c.ctx, tx).Err } -// HasEnoughDeposit checks if challenger has enough deposit to bond when creating challenge. -func (c *Challenger) HasEnoughDeposit(ctx context.Context) (bool, error) { +// CanCreateChallenge checks if challenger is in the status that can create challenge. +func (c *Challenger) CanCreateChallenge(ctx context.Context, outputIndex *big.Int) (bool, error) { cCtx, cCancel := context.WithTimeout(ctx, c.cfg.NetworkTimeout) defer cCancel() - balance, err := c.valpoolContract.BalanceOf(optsutils.NewSimpleCallOpts(cCtx), c.cfg.TxManager.From()) - if err != nil { - return false, fmt.Errorf("failed to fetch deposit amount: %w", err) + from := c.cfg.TxManager.From() + + var balance, requiredBondAmount *big.Int + if c.IsValPoolTerminated(outputIndex) { + if isInJail, err := c.isInJail(ctx); err != nil { + return false, err + } else if isInJail { + c.log.Warn("validator is in jail") + return false, nil + } + + validatorStatus, err := c.valMgrContract.GetStatus(optsutils.NewSimpleCallOpts(cCtx), from) + if err != nil { + return false, fmt.Errorf("failed to fetch the validator status: %w", err) + } + c.metr.RecordValidatorStatus(validatorStatus) + + if validatorStatus != StatusActive { + c.log.Warn("validator is not in the status that can create a challenge", "status", validatorStatus) + return false, nil + } + + balance, err = c.assetMgrContract.TotalValidatorKroNotBonded(optsutils.NewSimpleCallOpts(cCtx), from) + if err != nil { + return false, fmt.Errorf("failed to fetch balance: %w", err) + } + requiredBondAmount = c.requiredBondAmountV2 + } else { + var err error + balance, err = c.valPoolContract.BalanceOf(optsutils.NewSimpleCallOpts(cCtx), from) + if err != nil { + return false, fmt.Errorf("failed to fetch deposit amount: %w", err) + } + requiredBondAmount = c.requiredBondAmountV1 } - c.metr.RecordDepositAmount(balance) - if balance.Cmp(c.requiredBondAmount) == -1 { - c.log.Warn("deposit is less than bond amount", "required", c.requiredBondAmount, "deposit", balance) + c.metr.RecordUnbondedDepositAmount(balance) + + // Check if the unbonded deposit amount is less than the required bond amount + if balance.Cmp(requiredBondAmount) == -1 { + c.log.Warn( + "unbonded deposit is less than bond attempt amount", + "requiredBondAmount", requiredBondAmount, + "unbonded_deposit", balance, + ) return false, nil } - c.log.Info("deposit amount and bond amount", "deposit", balance, "bond", c.requiredBondAmount) + + c.log.Info("unbonded deposit amount and required bond amount", + "unbonded_deposit", balance, "required_bond", requiredBondAmount) return true, nil } +func (c *Challenger) IsValPoolTerminated(outputIndex *big.Int) bool { + return c.valPoolTerminationIndex.Cmp(outputIndex) < 0 +} + +func (c *Challenger) isInJail(ctx context.Context) (bool, error) { + cCtx, cCancel := context.WithTimeout(ctx, c.cfg.NetworkTimeout) + defer cCancel() + from := c.cfg.TxManager.From() + isInJail, err := c.valMgrContract.InJail(optsutils.NewSimpleCallOpts(cCtx), from) + if err != nil { + return false, fmt.Errorf("failed to fetch the jail status: %w", err) + } + + return isInJail, nil +} + func (c *Challenger) IsInChallengeCreationPeriod(ctx context.Context, outputIndex *big.Int) (bool, error) { cCtx, cCancel := context.WithTimeout(ctx, c.cfg.NetworkTimeout) defer cCancel() @@ -626,13 +728,32 @@ func (c *Challenger) IsInChallengeCreationPeriod(ctx context.Context, outputInde func (c *Challenger) IsOutputFinalized(ctx context.Context, outputIndex *big.Int) (bool, error) { cCtx, cCancel := context.WithTimeout(ctx, c.cfg.NetworkTimeout) defer cCancel() - return c.l2ooContract.IsFinalized(optsutils.NewSimpleCallOpts(cCtx), outputIndex) + return c.l2OOContract.IsFinalized(optsutils.NewSimpleCallOpts(cCtx), outputIndex) } func (c *Challenger) GetChallenge(ctx context.Context, outputIndex *big.Int, challenger common.Address) (bindings.TypesChallenge, error) { cCtx, cCancel := context.WithTimeout(ctx, c.cfg.NetworkTimeout) defer cCancel() - return c.colosseumContract.GetChallenge(optsutils.NewSimpleCallOpts(cCtx), outputIndex, challenger) + + challenge, err := c.colosseumContract.Challenges(optsutils.NewSimpleCallOpts(cCtx), outputIndex, challenger) + if err != nil { + return bindings.TypesChallenge{}, fmt.Errorf("failed to fetch challenge data: %w", err) + } + + segments, err := c.colosseumContract.GetSegments(optsutils.NewSimpleCallOpts(cCtx), outputIndex, challenger) + if err != nil { + return bindings.TypesChallenge{}, fmt.Errorf("failed to fetch challenge segments data: %w", err) + } + + return bindings.TypesChallenge{ + Turn: challenge.Turn, + TimeoutAt: challenge.TimeoutAt, + Asserter: challenge.Asserter, + Challenger: challenge.Challenger, + Segments: segments, + SegSize: challenge.SegSize, + SegStart: challenge.SegStart, + }, nil } func (c *Challenger) OutputAtBlockSafe(ctx context.Context, blockNumber uint64) (*eth.OutputResponse, error) { @@ -698,7 +819,7 @@ type Outputs struct { func (c *Challenger) OutputsAtIndex(ctx context.Context, outputIndex *big.Int) (*Outputs, error) { cCtx, cCancel := context.WithTimeout(ctx, c.cfg.NetworkTimeout) defer cCancel() - RemoteOutput, err := c.l2ooContract.GetL2Output(optsutils.NewSimpleCallOpts(cCtx), outputIndex) + RemoteOutput, err := c.l2OOContract.GetL2Output(optsutils.NewSimpleCallOpts(cCtx), outputIndex) if err != nil { return nil, err } @@ -761,7 +882,8 @@ func (c *Challenger) GetChallengeStatus(ctx context.Context, outputIndex *big.In func (c *Challenger) BuildSegments(ctx context.Context, turn uint8, segStart, segSize uint64) (*chal.Segments, error) { cCtx, cCancel := context.WithTimeout(ctx, c.cfg.NetworkTimeout) defer cCancel() - sections, err := c.colosseumContract.GetSegmentsLength(optsutils.NewSimpleCallOpts(cCtx), turn) + + sections, err := c.colosseumContract.SegmentsLengths(optsutils.NewSimpleCallOpts(cCtx), big.NewInt(int64(turn-1))) if err != nil { return nil, fmt.Errorf("unable to get segments length of turn %d: %w", turn, err) } diff --git a/kroma-validator/cmd/README.md b/kroma-validator/cmd/README.md new file mode 100644 index 0000000000..969a5cc4d4 --- /dev/null +++ b/kroma-validator/cmd/README.md @@ -0,0 +1,105 @@ +# kroma-validator subcommands + +This file contains the subcommands for the `kroma-validator` command line tool. It includes +the whole commands used to interact with the validator system. Especially, the commands for +the new validator system with the asset token are included. + +## Usage + +You can use these subcommands in the running kroma-validator docker container. + +```bash +kroma-validator [command] +``` + +The descriptions of whole or particular commands can be checked by running the following command: + +```bash +kroma-validator --help +kroma-validator [command] --help +``` + +## Commands + +### Commands for Validator System V2 + +The following commands are available in Validator System V2: + +- `register` - Register as new validator to `ValidatorManager`. + - `--amount [value]` - _(Required)_ The amount of tokens to deposit initially (in Wei). + - `--commission-rate [value]` - _(Required)_ The initial commission rate of the validator (in %). + - `--withdraw-account [value]` - _(Required)_ The address to withdraw deposited asset token. + + ```bash + kroma-validator register --amount 100000000 --commission-rate 5 --withdraw-account 0x0000000000000000000000000000000000000001 + ``` + +- `activate` - Activate the validator in `ValidatorManager` to be eligible to submit output roots and create challenges. + + ```bash + kroma-validator activate + ``` + +- `unjail` - Unjail the validator in `ValidatorManager`. + + ```bash + kroma-validator unjail + ``` + +- `changeCommission init` - Initiate the commission rate change of the validator in `ValidatorManager`. + - `--commission-rate [value]` - _(Required)_ The new commission rate of the validator (in %). + + ```bash + kroma-validator changeCommission init --commission-rate 5 + ``` + +- `changeCommission finalize` - Finalize the commission rate change of the validator in `ValidatorManager`. + + ```bash + kroma-validator changeCommission finalize + ``` + +- `depositKro` - Deposit asset tokens to the `AssetManager`. + - `--amount [value]` - _(Required)_ The amount of tokens to deposit (in Wei). + + ```bash + kroma-validator depositKro --amount 100000000 + ``` + +Note that withdraw of the deposited asset and reward must be done with the withdraw account that was set during the +registration. Please make sure that you must keep the private key of the withdraw account safe, since it cannot be +modified after the registration. + +### Commands for Validator System V1 (_DEPRECATED_) + +The following commands are available in Validator System V1. Note that these commands are **deprecated** and +will be removed since the new validator system is introduced. You can still use `withdraw` and `unbond` to withdraw +and unbond your ETH from the old `ValidatorPool`. + +- `deposit` - Deposit ETH to `ValidatorPool`. + - `--amount [value]` - _(Required)_ The amount of ETH to deposit (in Wei). + + ```bash + kroma-validator deposit --amount 100000000 + ``` + +- `withdraw` - Withdraw ETH from `ValidatorPool`. + - `--amount [value]` - _(Required)_ The amount of ETH to withdraw (in Wei). + + ```bash + kroma-validator withdraw --amount 100000000 + ``` + +- `withdrawTo` - Withdraw ETH from `ValidatorPool` to specific address. + - `--address` - _(Required)_ The address to receive withdrawn ETH. + - `--amount [value]` - _(Required)_ The amount of ETH to withdraw (in Wei). + + ```bash + kroma-validator withdrawTo --address 0x0000000000000000000000000000000000000001 --amount 100000000 + ``` + +- `unbond` - Manually unbond the bonded ETH from `ValidatorPool` (including reward distribution). + + ```bash + kroma-validator unbond + ``` diff --git a/kroma-validator/cmd/balance/cmd.go b/kroma-validator/cmd/balance/cmd.go deleted file mode 100644 index 2edad65d23..0000000000 --- a/kroma-validator/cmd/balance/cmd.go +++ /dev/null @@ -1,112 +0,0 @@ -package balance - -import ( - "context" - "errors" - "fmt" - "math/big" - - "github.com/ethereum/go-ethereum/log" - "github.com/urfave/cli/v2" - - opservice "github.com/ethereum-optimism/optimism/op-service" - "github.com/ethereum-optimism/optimism/op-service/txmgr" - "github.com/ethereum-optimism/optimism/op-service/txmgr/metrics" - "github.com/kroma-network/kroma/kroma-bindings/bindings" - "github.com/kroma-network/kroma/kroma-validator/flags" -) - -func Deposit(ctx *cli.Context) error { - amount := ctx.String("amount") - - valpoolABI, err := bindings.ValidatorPoolMetaData.GetAbi() - if err != nil { - return fmt.Errorf("failed to get ValidatorPool ABI: %w", err) - } - - txData, err := valpoolABI.Pack("deposit") - if err != nil { - return fmt.Errorf("failed to create deposit transaction data: %w", err) - } - - if err = sendTransaction(ctx, txData, amount); err != nil { - return err - } - - return nil -} - -func Withdraw(ctx *cli.Context) error { - amount := ctx.String("amount") - - withdrawAmount, success := new(big.Int).SetString(amount, 10) - if !success { - return errors.New("failed to parse withdraw amount") - } - - valpoolABI, err := bindings.ValidatorPoolMetaData.GetAbi() - if err != nil { - return fmt.Errorf("failed to get ValidatorPool ABI: %w", err) - } - - txData, err := valpoolABI.Pack("withdraw", withdrawAmount) - if err != nil { - return fmt.Errorf("failed to create withdraw transaction data: %w", err) - } - - if err = sendTransaction(ctx, txData, "0"); err != nil { - return err - } - - return nil -} - -func Unbond(ctx *cli.Context) error { - valpoolABI, err := bindings.ValidatorPoolMetaData.GetAbi() - if err != nil { - return fmt.Errorf("failed to get ValidatorPool ABI: %w", err) - } - - txData, err := valpoolABI.Pack("unbond") - if err != nil { - return fmt.Errorf("failed to create unbond transaction data: %w", err) - } - - if err = sendTransaction(ctx, txData, "0"); err != nil { - return err - } - - return nil -} - -func sendTransaction(ctx *cli.Context, txData []byte, txValue string) error { - txMgrConfig := txmgr.ReadCLIConfig(ctx) - txManager, err := txmgr.NewSimpleTxManager("validator-balance", log.New(), &metrics.NoopTxMetrics{}, txMgrConfig) - if err != nil { - return fmt.Errorf("failed to create tx manager: %w", err) - } - - valpoolAddr, err := opservice.ParseAddress(ctx.String(flags.ValPoolAddressFlag.Name)) - if err != nil { - return fmt.Errorf("failed to parse ValidatorPool address: %w", err) - } - - value, success := new(big.Int).SetString(txValue, 10) - if !success { - return errors.New("failed to parse tx value") - } - - txCandidate := txmgr.TxCandidate{ - TxData: txData, - To: &valpoolAddr, - GasLimit: 0, - Value: value, - } - - _, err = txManager.Send(context.Background(), txCandidate) - if err != nil { - return fmt.Errorf("failed to send transaction: %w", err) - } - - return nil -} diff --git a/kroma-validator/cmd/main.go b/kroma-validator/cmd/main.go index 16519df2eb..1428892a47 100644 --- a/kroma-validator/cmd/main.go +++ b/kroma-validator/cmd/main.go @@ -4,13 +4,13 @@ import ( "fmt" "os" + "github.com/ethereum-optimism/optimism/op-service/cliapp" + oplog "github.com/ethereum-optimism/optimism/op-service/log" "github.com/ethereum/go-ethereum/log" "github.com/urfave/cli/v2" - "github.com/ethereum-optimism/optimism/op-service/cliapp" - oplog "github.com/ethereum-optimism/optimism/op-service/log" "github.com/kroma-network/kroma/kroma-validator" - "github.com/kroma-network/kroma/kroma-validator/cmd/balance" + cmd "github.com/kroma-network/kroma/kroma-validator/cmd/validator" "github.com/kroma-network/kroma/kroma-validator/flags" ) @@ -31,33 +31,74 @@ func main() { app.Action = curryMain(Version) app.Commands = cli.Commands{ { - Name: "deposit", - Usage: "Deposit ETH into ValidatorPool to be used as bond", + Name: "register", + Usage: "Register as new validator to ValidatorManager", Flags: []cli.Flag{ - &cli.StringFlag{ - Name: "amount", - Usage: "Amount to deposit into ValidatorPool (in wei)", - Required: true, - }, + cmd.TokenAmountFlag, + cmd.CommissionRateFlag, + cmd.WithdrawAccountFlag, }, - Action: balance.Deposit, + Action: cmd.Register, }, { - Name: "withdraw", - Usage: "Withdraw ETH from ValidatorPool", - Flags: []cli.Flag{ - &cli.StringFlag{ - Name: "amount", - Usage: "Amount to withdraw from ValidatorPool (in wei)", - Required: true, + Name: "activate", + Usage: "Activate the validator in ValidatorManager", + Action: cmd.Activate, + }, + { + Name: "unjail", + Usage: "Attempt to unjail the validator in ValidatorManager", + Action: cmd.Unjail, + }, + { + Name: "changeCommission", + Usage: "Change the commission rate of the validator in ValidatorManager", + Subcommands: []*cli.Command{ + { + Name: "init", + Usage: "Initiate the commission rate change", + Flags: []cli.Flag{cmd.CommissionRateFlag}, + Action: cmd.InitCommissionChange, + }, + { + Name: "finalize", + Usage: "Finalize the commission rate change", + Action: cmd.FinalizeCommissionChange, }, }, - Action: balance.Withdraw, }, { - Name: "unbond", - Usage: "Attempt to unbond in ValidatorPool", - Action: balance.Unbond, + Name: "depositKro", + Usage: "Attempt to deposit asset tokens to AssetManager to be used as bond", + Flags: []cli.Flag{cmd.TokenAmountFlag}, + Action: cmd.DepositKro, + }, + { + Name: "deposit", + Usage: "(DEPRECATED) Deposit ETH into ValidatorPool to be used as bond", + Description: "This command is deprecated since the release of validator system V2. Please use the 'register' command to register as a validator.", + Flags: []cli.Flag{cmd.EthAmountFlag}, + Action: cmd.Deposit, + }, + { + Name: "withdraw", + Usage: "(DEPRECATED) Withdraw ETH from ValidatorPool", + Description: "This command is deprecated since the release of validator system V2. You can still use this command to withdraw your asset from the ValidatorPool.", + Flags: []cli.Flag{cmd.EthAmountFlag}, + Action: cmd.Withdraw, + }, + { + Name: "withdrawTo", + Usage: "(DEPRECATED) Withdraw ETH from ValidatorPool to specific address", + Description: "This command is deprecated since the release of validator system V2. You can still use this command to withdraw your asset from the ValidatorPool to specific address.", + Flags: []cli.Flag{cmd.AddressFlag, cmd.EthAmountFlag}, + Action: cmd.WithdrawTo, + }, + { + Name: "unbond", + Usage: "(DEPRECATED) Attempt to unbond in ValidatorPool", + Description: "This command is deprecated since the release of validator system V2. You can still use this command to unbond your asset from the ValidatorPool.", + Action: cmd.Unbond, }, } diff --git a/kroma-validator/cmd/validator/cmd.go b/kroma-validator/cmd/validator/cmd.go new file mode 100644 index 0000000000..470fe3590a --- /dev/null +++ b/kroma-validator/cmd/validator/cmd.go @@ -0,0 +1,411 @@ +package validator + +import ( + "context" + "errors" + "fmt" + "math/big" + + opservice "github.com/ethereum-optimism/optimism/op-service" + "github.com/ethereum-optimism/optimism/op-service/optsutils" + "github.com/ethereum-optimism/optimism/op-service/txmgr" + "github.com/ethereum-optimism/optimism/op-service/txmgr/metrics" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/log" + "github.com/urfave/cli/v2" + + "github.com/kroma-network/kroma/kroma-bindings/bindings" + "github.com/kroma-network/kroma/kroma-validator/flags" +) + +func Register(ctx *cli.Context) error { + amount := ctx.String("amount") + + assets, success := new(big.Int).SetString(amount, 10) + if !success { + return fmt.Errorf("failed to parse amount: %s", amount) + } + + txManager, err := newTxManager(ctx) + if err != nil { + return err + } + + assetManagerAddr, err := opservice.ParseAddress(ctx.String(flags.AssetManagerAddressFlag.Name)) + if err != nil { + return fmt.Errorf("failed to parse AssetManager address: %w", err) + } + + if err = approve(ctx, assets, txManager, assetManagerAddr); err != nil { + return fmt.Errorf("failed to approve assets: %w", err) + } + + commissionRate := uint8(ctx.Uint64("commission-rate")) + withdrawAccount, err := opservice.ParseAddress(ctx.String(WithdrawAccountFlag.Name)) + if err != nil { + return fmt.Errorf("failed to parse withdraw address: %w", err) + } + + valMgrAbi, err := bindings.ValidatorManagerMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ValidatorManager ABI: %w", err) + } + + txData, err := valMgrAbi.Pack("registerValidator", assets, commissionRate, withdrawAccount) + if err != nil { + return fmt.Errorf("failed to create register validator transaction data: %w", err) + } + + valMgrAddr, err := opservice.ParseAddress(ctx.String(flags.ValMgrAddressFlag.Name)) + if err != nil { + return fmt.Errorf("failed to parse ValidatorManager address: %w", err) + } + + if err = sendTransaction(txManager, valMgrAddr, txData, "0"); err != nil { + return err + } + + return nil +} + +func Activate(ctx *cli.Context) error { + valMgrAbi, err := bindings.ValidatorManagerMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ValidatorManager ABI: %w", err) + } + + txData, err := valMgrAbi.Pack("activateValidator") + if err != nil { + return fmt.Errorf("failed to create activate transaction data: %w", err) + } + + valMgrAddr, err := opservice.ParseAddress(ctx.String(flags.ValMgrAddressFlag.Name)) + if err != nil { + return fmt.Errorf("failed to parse ValidatorManager address: %w", err) + } + + txManager, err := newTxManager(ctx) + if err != nil { + return err + } + + if err = sendTransaction(txManager, valMgrAddr, txData, "0"); err != nil { + return err + } + + return nil +} + +func Unjail(ctx *cli.Context) error { + valMgrAbi, err := bindings.ValidatorManagerMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ValidatorManager ABI: %w", err) + } + + txManager, err := newTxManager(ctx) + if err != nil { + return err + } + + txData, err := valMgrAbi.Pack("tryUnjail") + if err != nil { + return fmt.Errorf("failed to create try unjail transaction data: %w", err) + } + + valMgrAddr, err := opservice.ParseAddress(ctx.String(flags.ValMgrAddressFlag.Name)) + if err != nil { + return fmt.Errorf("failed to parse ValidatorManager address: %w", err) + } + + if err = sendTransaction(txManager, valMgrAddr, txData, "0"); err != nil { + return err + } + + return nil +} + +func InitCommissionChange(ctx *cli.Context) error { + commissionRate := uint8(ctx.Uint64("commission-rate")) + + txManager, err := newTxManager(ctx) + if err != nil { + return err + } + + valMgrAbi, err := bindings.ValidatorManagerMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ValidatorManager ABI: %w", err) + } + + txData, err := valMgrAbi.Pack("initCommissionChange", commissionRate) + if err != nil { + return fmt.Errorf("failed to create init commission change transaction data: %w", err) + } + + valMgrAddr, err := opservice.ParseAddress(ctx.String(flags.ValMgrAddressFlag.Name)) + if err != nil { + return fmt.Errorf("failed to parse ValidatorManager address: %w", err) + } + + if err = sendTransaction(txManager, valMgrAddr, txData, "0"); err != nil { + return err + } + + return nil +} + +func FinalizeCommissionChange(ctx *cli.Context) error { + txManager, err := newTxManager(ctx) + if err != nil { + return err + } + + valMgrAbi, err := bindings.ValidatorManagerMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ValidatorManager ABI: %w", err) + } + + txData, err := valMgrAbi.Pack("finalizeCommissionChange") + if err != nil { + return fmt.Errorf("failed to create finalize commission change transaction data: %w", err) + } + + valMgrAddr, err := opservice.ParseAddress(ctx.String(flags.ValMgrAddressFlag.Name)) + if err != nil { + return fmt.Errorf("failed to parse ValidatorManager address: %w", err) + } + + if err = sendTransaction(txManager, valMgrAddr, txData, "0"); err != nil { + return err + } + + return nil +} + +func DepositKro(ctx *cli.Context) error { + amount := ctx.String("amount") + + depositAmount, success := new(big.Int).SetString(amount, 10) + if !success { + return fmt.Errorf("failed to parse deposit amount: %s", amount) + } + + txManager, err := newTxManager(ctx) + if err != nil { + return err + } + + assetManagerAddr, err := opservice.ParseAddress(ctx.String(flags.AssetManagerAddressFlag.Name)) + if err != nil { + return fmt.Errorf("failed to parse AssetManager address: %w", err) + } + + if err = approve(ctx, depositAmount, txManager, assetManagerAddr); err != nil { + return fmt.Errorf("failed to approve assets: %w", err) + } + + assetManagerAbi, err := bindings.AssetManagerMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get AssetManager ABI: %w", err) + } + + txData, err := assetManagerAbi.Pack("deposit", depositAmount) + if err != nil { + return fmt.Errorf("failed to create deposit transaction data: %w", err) + } + + if err = sendTransaction(txManager, assetManagerAddr, txData, "0"); err != nil { + return err + } + + return nil +} + +func Deposit(ctx *cli.Context) error { + amount := ctx.String("amount") + + valpoolABI, err := bindings.ValidatorPoolMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ValidatorPool ABI: %w", err) + } + + txData, err := valpoolABI.Pack("deposit") + if err != nil { + return fmt.Errorf("failed to create deposit transaction data: %w", err) + } + + valpoolAddr, err := opservice.ParseAddress(ctx.String(flags.ValPoolAddressFlag.Name)) + if err != nil { + return fmt.Errorf("failed to parse ValidatorPool address: %w", err) + } + + txManager, err := newTxManager(ctx) + if err != nil { + return err + } + + if err = sendTransaction(txManager, valpoolAddr, txData, amount); err != nil { + return err + } + + return nil +} + +func Withdraw(ctx *cli.Context) error { + amount := ctx.String("amount") + + withdrawAmount, success := new(big.Int).SetString(amount, 10) + if !success { + return errors.New("failed to parse withdraw amount") + } + + valpoolABI, err := bindings.ValidatorPoolMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ValidatorPool ABI: %w", err) + } + + txData, err := valpoolABI.Pack("withdraw", withdrawAmount) + if err != nil { + return fmt.Errorf("failed to create withdraw transaction data: %w", err) + } + + valpoolAddr, err := opservice.ParseAddress(ctx.String(flags.ValPoolAddressFlag.Name)) + if err != nil { + return fmt.Errorf("failed to parse ValidatorPool address: %w", err) + } + + txManager, err := newTxManager(ctx) + if err != nil { + return err + } + + if err = sendTransaction(txManager, valpoolAddr, txData, "0"); err != nil { + return err + } + + return nil +} + +func WithdrawTo(ctx *cli.Context) error { + address := ctx.String("address") + toAddr := common.HexToAddress(address) + + amount := ctx.String("amount") + withdrawAmount, success := new(big.Int).SetString(amount, 10) + if !success { + return errors.New("failed to parse withdraw amount") + } + + valpoolABI, err := bindings.ValidatorPoolMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ValidatorPool ABI: %w", err) + } + + txData, err := valpoolABI.Pack("withdrawTo", toAddr, withdrawAmount) + if err != nil { + return fmt.Errorf("failed to create withdrawTo transaction data: %w", err) + } + + valpoolAddr, err := opservice.ParseAddress(ctx.String(flags.ValPoolAddressFlag.Name)) + if err != nil { + return fmt.Errorf("failed to parse ValidatorPool address: %w", err) + } + + txManager, err := newTxManager(ctx) + if err != nil { + return err + } + + if err = sendTransaction(txManager, valpoolAddr, txData, "0"); err != nil { + return err + } + + return nil +} + +func Unbond(ctx *cli.Context) error { + valpoolABI, err := bindings.ValidatorPoolMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ValidatorPool ABI: %w", err) + } + + txData, err := valpoolABI.Pack("unbond") + if err != nil { + return fmt.Errorf("failed to create unbond transaction data: %w", err) + } + + valpoolAddr, err := opservice.ParseAddress(ctx.String(flags.ValPoolAddressFlag.Name)) + if err != nil { + return fmt.Errorf("failed to parse ValidatorPool address: %w", err) + } + + txManager, err := newTxManager(ctx) + if err != nil { + return err + } + + if err = sendTransaction(txManager, valpoolAddr, txData, "0"); err != nil { + return err + } + + return nil +} + +func approve(ctx *cli.Context, amount *big.Int, txManager *txmgr.SimpleTxManager, assetManagerAddr common.Address) error { + erc20Abi, err := bindings.ERC20MetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ERC20 ABI: %w", err) + } + + txData, err := erc20Abi.Pack("approve", assetManagerAddr, amount) + if err != nil { + return fmt.Errorf("failed to create approve transaction data: %w", err) + } + + assetManagerContract, err := bindings.NewAssetManagerCaller(assetManagerAddr, txManager.Backend.(*ethclient.Client)) + if err != nil { + return fmt.Errorf("failed to fetch AssetManager contract: %w", err) + } + + assetTokenAddr, err := assetManagerContract.ASSETTOKEN(optsutils.NewSimpleCallOpts(ctx.Context)) + if err != nil { + return fmt.Errorf("failed to fetch asset token address: %w", err) + } + + if err = sendTransaction(txManager, assetTokenAddr, txData, "0"); err != nil { + return err + } + + return nil +} + +func sendTransaction(txManager *txmgr.SimpleTxManager, txTo common.Address, txData []byte, txValue string) error { + value, success := new(big.Int).SetString(txValue, 10) + if !success { + return errors.New("failed to parse tx value") + } + + txCandidate := txmgr.TxCandidate{ + TxData: txData, + To: &txTo, + GasLimit: 0, + Value: value, + } + + _, err := txManager.Send(context.Background(), txCandidate) + if err != nil { + return fmt.Errorf("failed to send transaction: %w", err) + } + + return nil +} + +func newTxManager(ctx *cli.Context) (*txmgr.SimpleTxManager, error) { + txMgrConfig := txmgr.ReadCLIConfig(ctx) + txManager, err := txmgr.NewSimpleTxManager("validator-cmd", log.New(), &metrics.NoopTxMetrics{}, txMgrConfig) + if err != nil { + return nil, fmt.Errorf("failed to create tx manager: %w", err) + } + return txManager, nil +} diff --git a/kroma-validator/cmd/validator/flags.go b/kroma-validator/cmd/validator/flags.go new file mode 100644 index 0000000000..44a47d0ecd --- /dev/null +++ b/kroma-validator/cmd/validator/flags.go @@ -0,0 +1,35 @@ +package validator + +import ( + "github.com/urfave/cli/v2" +) + +var TokenAmountFlag = &cli.StringFlag{ + Name: "amount", + Usage: "Amount of asset token (in wei)", + Required: true, +} + +var EthAmountFlag = &cli.StringFlag{ + Name: "amount", + Usage: "Amount of ETH (in wei)", + Required: true, +} + +var AddressFlag = &cli.StringFlag{ + Name: "address", + Usage: "Address to receive ETH", + Required: true, +} + +var CommissionRateFlag = &cli.Uint64Flag{ + Name: "commission-rate", + Usage: "The commission rate earned by the validator (in percentage). Maximum 100.", + Required: true, +} + +var WithdrawAccountFlag = &cli.StringFlag{ + Name: "withdraw-account", + Usage: "Address to withdraw deposited asset token", + Required: true, +} diff --git a/kroma-validator/config.go b/kroma-validator/config.go index 1b47cacf27..0ec6b79710 100644 --- a/kroma-validator/config.go +++ b/kroma-validator/config.go @@ -5,11 +5,6 @@ import ( "errors" "time" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" - "github.com/ethereum/go-ethereum/log" - "github.com/urfave/cli/v2" - "github.com/ethereum-optimism/optimism/op-node/rollup" opservice "github.com/ethereum-optimism/optimism/op-service" "github.com/ethereum-optimism/optimism/op-service/dial" @@ -19,6 +14,11 @@ import ( oprpc "github.com/ethereum-optimism/optimism/op-service/rpc" "github.com/ethereum-optimism/optimism/op-service/sources" "github.com/ethereum-optimism/optimism/op-service/txmgr" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/log" + "github.com/urfave/cli/v2" + chal "github.com/kroma-network/kroma/kroma-validator/challenge" "github.com/kroma-network/kroma/kroma-validator/flags" "github.com/kroma-network/kroma/kroma-validator/metrics" @@ -31,6 +31,8 @@ type Config struct { ColosseumAddr common.Address SecurityCouncilAddr common.Address ValidatorPoolAddr common.Address + ValidatorManagerAddr common.Address + AssetManagerAddr common.Address ChallengerPollInterval time.Duration NetworkTimeout time.Duration TxManager *txmgr.BufferedTxManager @@ -45,6 +47,7 @@ type Config struct { OutputSubmitterRoundBuffer uint64 ChallengerEnabled bool GuardianEnabled bool + GuardianPollInterval time.Duration ProofFetcher ProofFetcher } @@ -81,6 +84,12 @@ type CLIConfig struct { // ValPoolAddress is the ValidatorPool contract address. ValPoolAddress string + // ValMgrAddress is the ValidatorManager contract address. + ValMgrAddress string + + // AssetManagerAddress is the AssetManager contract address. + AssetManagerAddress string + // ChallengerPollInterval is how frequently to poll L2 for new finalized outputs. ChallengerPollInterval time.Duration @@ -105,6 +114,9 @@ type CLIConfig struct { GuardianEnabled bool + // GuardianPollInterval is how frequently to poll L1 for inspection. + GuardianPollInterval time.Duration + FetchingProofTimeout time.Duration TxMgrConfig txmgr.CLIConfig @@ -146,6 +158,8 @@ func NewConfig(ctx *cli.Context) CLIConfig { L2OOAddress: ctx.String(flags.L2OOAddressFlag.Name), ColosseumAddress: ctx.String(flags.ColosseumAddressFlag.Name), ValPoolAddress: ctx.String(flags.ValPoolAddressFlag.Name), + ValMgrAddress: ctx.String(flags.ValMgrAddressFlag.Name), + AssetManagerAddress: ctx.String(flags.AssetManagerAddressFlag.Name), OutputSubmitterEnabled: ctx.Bool(flags.OutputSubmitterEnabledFlag.Name), ChallengerEnabled: ctx.Bool(flags.ChallengerEnabledFlag.Name), ChallengerPollInterval: ctx.Duration(flags.ChallengerPollIntervalFlag.Name), @@ -159,6 +173,7 @@ func NewConfig(ctx *cli.Context) CLIConfig { SecurityCouncilAddress: ctx.String(flags.SecurityCouncilAddressFlag.Name), ProverRPC: ctx.String(flags.ProverRPCFlag.Name), GuardianEnabled: ctx.Bool(flags.GuardianEnabledFlag.Name), + GuardianPollInterval: ctx.Duration(flags.GuardianPollIntervalFlag.Name), FetchingProofTimeout: ctx.Duration(flags.FetchingProofTimeoutFlag.Name), RPCConfig: oprpc.ReadCLIConfig(ctx), LogConfig: oplog.ReadCLIConfig(ctx), @@ -169,7 +184,7 @@ func NewConfig(ctx *cli.Context) CLIConfig { // NewValidatorConfig creates a validator config with given the CLIConfig func NewValidatorConfig(cfg CLIConfig, l log.Logger, m metrics.Metricer) (*Config, error) { - l2ooAddress, err := opservice.ParseAddress(cfg.L2OOAddress) + l2OOAddress, err := opservice.ParseAddress(cfg.L2OOAddress) if err != nil { return nil, err } @@ -192,6 +207,16 @@ func NewValidatorConfig(cfg CLIConfig, l log.Logger, m metrics.Metricer) (*Confi return nil, err } + valMgrAddress, err := opservice.ParseAddress(cfg.ValMgrAddress) + if err != nil { + return nil, err + } + + assetManagerAddress, err := opservice.ParseAddress(cfg.AssetManagerAddress) + if err != nil { + return nil, err + } + txManager, err := txmgr.NewBufferedTxManager("validator", l, m, cfg.TxMgrConfig) if err != nil { return nil, err @@ -232,11 +257,14 @@ func NewValidatorConfig(cfg CLIConfig, l log.Logger, m metrics.Metricer) (*Confi } return &Config{ - L2OutputOracleAddr: l2ooAddress, + L2OutputOracleAddr: l2OOAddress, ColosseumAddr: colosseumAddress, SecurityCouncilAddr: securityCouncilAddress, ValidatorPoolAddr: valPoolAddress, + ValidatorManagerAddr: valMgrAddress, + AssetManagerAddr: assetManagerAddress, ChallengerPollInterval: cfg.ChallengerPollInterval, + GuardianPollInterval: cfg.GuardianPollInterval, NetworkTimeout: cfg.TxMgrConfig.NetworkTimeout, TxManager: txManager, L1Client: l1Client, diff --git a/kroma-validator/event.go b/kroma-validator/event.go index c8bb050cab..760f72dde5 100644 --- a/kroma-validator/event.go +++ b/kroma-validator/event.go @@ -1,10 +1,13 @@ package validator import ( + "fmt" "math/big" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" + + "github.com/kroma-network/kroma/kroma-bindings/bindings" ) const ( @@ -13,30 +16,29 @@ const ( KeyEventReadyToProve = "ReadyToProve" ) -type ChallengeCreatedEvent struct { - OutputIndex *big.Int - Asserter common.Address - Challenger common.Address -} +func NewChallengeCreatedEvent(log types.Log) (*bindings.ColosseumChallengeCreated, error) { + if len(log.Topics) != 4 { + return nil, fmt.Errorf("invalid number of log topics") + } -func NewChallengeCreatedEvent(log types.Log) ChallengeCreatedEvent { - return ChallengeCreatedEvent{ + return &bindings.ColosseumChallengeCreated{ OutputIndex: new(big.Int).SetBytes(log.Topics[1][:]), Asserter: common.BytesToAddress(log.Topics[2][:]), Challenger: common.BytesToAddress(log.Topics[3][:]), - } + }, nil } -type OutputSubmittedEvent struct { - ExpectedOutputRoot string - OutputIndex *big.Int - L2BlockNumber *big.Int -} - -func NewOutputSubmittedEvent(log types.Log) OutputSubmittedEvent { - return OutputSubmittedEvent{ - ExpectedOutputRoot: log.Topics[1].Hex(), - OutputIndex: new(big.Int).SetBytes(log.Topics[2][:]), - L2BlockNumber: new(big.Int).SetBytes(log.Topics[3][:]), +func NewOutputSubmittedEvent(log types.Log) (*bindings.L2OutputOracleOutputSubmitted, error) { + if len(log.Topics) != 4 { + return nil, fmt.Errorf("invalid number of log topics") } + + var outputRoot [32]byte + copy(outputRoot[:], log.Topics[1][:]) + + return &bindings.L2OutputOracleOutputSubmitted{ + OutputRoot: outputRoot, + L2OutputIndex: new(big.Int).SetBytes(log.Topics[2][:]), + L2BlockNumber: new(big.Int).SetBytes(log.Topics[3][:]), + }, nil } diff --git a/kroma-validator/flags/flags.go b/kroma-validator/flags/flags.go index c0e4457f75..7948dc1af3 100644 --- a/kroma-validator/flags/flags.go +++ b/kroma-validator/flags/flags.go @@ -4,14 +4,13 @@ import ( "fmt" "time" - "github.com/urfave/cli/v2" - opservice "github.com/ethereum-optimism/optimism/op-service" oplog "github.com/ethereum-optimism/optimism/op-service/log" opmetrics "github.com/ethereum-optimism/optimism/op-service/metrics" oppprof "github.com/ethereum-optimism/optimism/op-service/oppprof" oprpc "github.com/ethereum-optimism/optimism/op-service/rpc" "github.com/ethereum-optimism/optimism/op-service/txmgr" + "github.com/urfave/cli/v2" ) const EnvVarPrefix = "VALIDATOR" @@ -59,6 +58,18 @@ var ( Required: true, EnvVars: prefixEnvVars("VALPOOL_ADDRESS"), } + ValMgrAddressFlag = &cli.StringFlag{ + Name: "valmgr-address", + Usage: "Address of the ValidatorManager contract", + Required: true, + EnvVars: prefixEnvVars("VALMGR_ADDRESS"), + } + AssetManagerAddressFlag = &cli.StringFlag{ + Name: "assetmanager-address", + Usage: "Address of the AssetManager contract", + Required: true, + EnvVars: prefixEnvVars("ASSETMANAGER_ADDRESS"), + } OutputSubmitterEnabledFlag = &cli.BoolFlag{ Name: "output-submitter.enabled", Usage: "Enable l2 output submitter", @@ -117,6 +128,12 @@ var ( Usage: "Enable guardian", EnvVars: prefixEnvVars("GUARDIAN_ENABLED"), } + GuardianPollIntervalFlag = &cli.DurationFlag{ + Name: "guardian.poll-interval", + Usage: "Poll interval for guardian inspection", + EnvVars: prefixEnvVars("GUARDIAN_POLL_INTERVAL"), + Value: time.Minute, + } FetchingProofTimeoutFlag = &cli.DurationFlag{ Name: "fetching-proof-timeout", Usage: "Duration we will wait to fetching proof", @@ -132,6 +149,8 @@ var requiredFlags = []cli.Flag{ L2OOAddressFlag, ColosseumAddressFlag, ValPoolAddressFlag, + ValMgrAddressFlag, + AssetManagerAddressFlag, OutputSubmitterEnabledFlag, ChallengerEnabledFlag, ChallengerPollIntervalFlag, @@ -145,6 +164,7 @@ var optionalFlags = []cli.Flag{ ProverRPCFlag, SecurityCouncilAddressFlag, GuardianEnabledFlag, + GuardianPollIntervalFlag, FetchingProofTimeoutFlag, } diff --git a/kroma-validator/guardian.go b/kroma-validator/guardian.go index fae63a10c2..d8ea2c6659 100644 --- a/kroma-validator/guardian.go +++ b/kroma-validator/guardian.go @@ -9,6 +9,9 @@ import ( "sync" "time" + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/optsutils" + "github.com/ethereum-optimism/optimism/op-service/watcher" "github.com/ethereum/go-ethereum" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/common" @@ -17,10 +20,8 @@ import ( "github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/log" - "github.com/ethereum-optimism/optimism/op-service/eth" - "github.com/ethereum-optimism/optimism/op-service/optsutils" - "github.com/ethereum-optimism/optimism/op-service/watcher" "github.com/kroma-network/kroma/kroma-bindings/bindings" + "github.com/kroma-network/kroma/kroma-validator/challenge" ) // Guardian is responsible for validating outputs. @@ -43,9 +44,11 @@ type Guardian struct { validationRequestedSub ethereum.Subscription deletionRequestedSub ethereum.Subscription + challengeCreatedSub ethereum.Subscription validationRequestedChan chan *bindings.SecurityCouncilValidationRequested deletionRequestedChan chan *bindings.SecurityCouncilDeletionRequested + challengeCreatedChan chan *bindings.ColosseumChallengeCreated checkpoint *big.Int } @@ -136,7 +139,10 @@ func (g *Guardian) Start(ctx context.Context) error { g.initSub() g.wg.Add(1) - go g.confirmationLoop() + go g.scanPrevChallenges() + + g.wg.Add(1) + go g.subscriptionLoop() g.wg.Add(1) go g.inspectorLoop() @@ -145,19 +151,16 @@ func (g *Guardian) Start(ctx context.Context) error { } func (g *Guardian) Stop() error { - if g.validationRequestedSub != nil { - g.validationRequestedSub.Unsubscribe() - } - - if g.deletionRequestedSub != nil { - g.deletionRequestedSub.Unsubscribe() - } + g.validationRequestedSub.Unsubscribe() + g.deletionRequestedSub.Unsubscribe() + g.challengeCreatedSub.Unsubscribe() g.cancel() g.wg.Wait() close(g.validationRequestedChan) close(g.deletionRequestedChan) + close(g.challengeCreatedChan) return nil } @@ -180,6 +183,71 @@ func (g *Guardian) initSub() { } return g.securityCouncilContract.WatchDeletionRequested(opts, g.deletionRequestedChan, nil, nil) }) + + g.challengeCreatedChan = make(chan *bindings.ColosseumChallengeCreated) + g.challengeCreatedSub = event.ResubscribeErr(time.Second*10, func(ctx context.Context, err error) (event.Subscription, error) { + if err != nil { + g.log.Warn("resubscribing after failed ChallengeCreated event", "err", err) + } + return g.colosseumContract.WatchChallengeCreated(opts, g.challengeCreatedChan, nil, nil, nil) + }) +} + +// scanPrevChallenges scans all the previous challenges before current L1 head within the finalization window to handle challenger timeout. +func (g *Guardian) scanPrevChallenges() { + ticker := time.NewTicker(g.cfg.GuardianPollInterval) + defer func() { + ticker.Stop() + g.wg.Done() + }() + + for ; ; <-ticker.C { + select { + case <-g.ctx.Done(): + return + default: + status, err := g.cfg.RollupClient.SyncStatus(g.ctx) + if err != nil { + g.log.Error("failed to get sync status", "err", err) + continue + } + + toBlock := new(big.Int).SetUint64(status.HeadL1.Number) + finalizationStartL1Block := new(big.Int).Sub(toBlock, new(big.Int).Div(g.finalizationPeriodSeconds, g.l1BlockTime)) + // The fromBlock is the maximum value of either genesis block(1) or the first block of the finalization window + fromBlock := math.BigMax(common.Big1, finalizationStartL1Block) + + challengeCreatedEvent := g.colosseumABI.Events[KeyEventChallengeCreated] + + addresses := []common.Address{g.cfg.ColosseumAddr} + topics := []common.Hash{challengeCreatedEvent.ID} + + query := ethereum.FilterQuery{ + FromBlock: fromBlock, + ToBlock: toBlock, + Addresses: addresses, + Topics: [][]common.Hash{topics}, + } + + logs, err := g.cfg.L1Client.FilterLogs(g.ctx, query) + if err != nil { + g.log.Error("failed to get event logs related to challenge creation", "err", err) + continue + } + + for _, vLog := range logs { + ev, err := NewChallengeCreatedEvent(vLog) + if err != nil { + g.log.Error("failed to parse challenge created event", "err", err) + continue + } + g.wg.Add(1) + go g.processChallengerTimeout(ev) + } + + return + } + } } // inspectorLoop finds and deletes outputs whose zk fault proving has failed due to an undeniable bug @@ -187,7 +255,7 @@ func (g *Guardian) initSub() { func (g *Guardian) inspectorLoop() { defer g.wg.Done() - ticker := time.NewTicker(time.Minute) + ticker := time.NewTicker(g.cfg.GuardianPollInterval) defer ticker.Stop() for ; ; <-ticker.C { @@ -208,14 +276,14 @@ func (g *Guardian) inspectorLoop() { currentL2 = new(big.Int).SetUint64(status.FinalizedL2.Number) } - // currentL1 and finalizedL1 are used for searching events of ReadyToProve in L1 blocks - currentL1 := new(big.Int).SetUint64(status.CurrentL1.Number) - finalizedL1 := new(big.Int).Sub(currentL1, new(big.Int).Div(g.finalizationPeriodSeconds, g.l1BlockTime)) + // headL1 and finalizedL1 are used for searching events of ReadyToProve in L1 blocks + headL1 := new(big.Int).SetUint64(status.HeadL1.Number) + finalizedL1 := new(big.Int).Sub(headL1, new(big.Int).Div(g.finalizationPeriodSeconds, g.l1BlockTime)) finalizedL1 = math.BigMax(common.Big1, finalizedL1) creationPeriodL2 := new(big.Int).Div(g.creationPeriodSeconds, g.l2BlockTime) if currentL2.Cmp(creationPeriodL2) != 1 { - g.log.Warn("there is no output when the creation period is over yet", "currentL1", currentL1, "currentL2", currentL2, "creationPeriodL2", creationPeriodL2) + g.log.Warn("there is no output when the creation period is over yet", "headL1", headL1, "currentL2", currentL2, "creationPeriodL2", creationPeriodL2) continue } @@ -245,7 +313,7 @@ func (g *Guardian) inspectorLoop() { for i := startOutputIndex; i.Cmp(endOutputIndex) < 0; i.Add(i, common.Big1) { g.wg.Add(1) - go g.inspectOutput(new(big.Int).Set(i), new(big.Int).Set(finalizedL1), new(big.Int).Set(currentL1)) + go g.inspectOutput(new(big.Int).Set(i), new(big.Int).Set(finalizedL1), new(big.Int).Set(headL1)) } g.checkpoint = endOutputIndex.Sub(endOutputIndex, common.Big1) @@ -262,7 +330,7 @@ func (g *Guardian) inspectorLoop() { for i := new(big.Int).Add(g.checkpoint, common.Big1); i.Cmp(outputIndex) < 0; i.Add(i, common.Big1) { g.wg.Add(1) - go g.inspectOutput(new(big.Int).Set(i), new(big.Int).Set(finalizedL1), new(big.Int).Set(currentL1)) + go g.inspectOutput(new(big.Int).Set(i), new(big.Int).Set(finalizedL1), new(big.Int).Set(headL1)) } g.checkpoint = outputIndex.Sub(outputIndex, common.Big1) @@ -277,7 +345,7 @@ func (g *Guardian) inspectOutput(outputIndex, fromBlock, toBlock *big.Int) { g.log.Info("inspect output if there is an undeniable bug", "outputIndex", outputIndex) defer g.wg.Done() - ticker := time.NewTicker(time.Minute) + ticker := time.NewTicker(g.cfg.GuardianPollInterval) defer ticker.Stop() for ; ; <-ticker.C { @@ -285,67 +353,47 @@ func (g *Guardian) inspectOutput(outputIndex, fromBlock, toBlock *big.Int) { case <-g.ctx.Done(): return default: - retry := func() bool { - isFinalized, err := g.isOutputFinalized(g.ctx, outputIndex) - if err != nil { - g.log.Error("unable to check if the output is finalized or not", "err", err, "outputIndex", outputIndex) - return true - } - - // outputs that have been finalized are not target. - if isFinalized { - g.log.Info("the output is finalized", "outputIndex", outputIndex, "isFinalized", isFinalized) - return false - } - - cCtx, cCancel := context.WithTimeout(g.ctx, g.cfg.NetworkTimeout) - defer cCancel() - isInCreationPeriod, err := g.colosseumContract.IsInCreationPeriod(optsutils.NewSimpleCallOpts(cCtx), outputIndex) - if err != nil { - g.log.Error("unable to check if the output is in challenge creation period or not", "err", err, "outputIndex", outputIndex) - return true - } - - if isInCreationPeriod { - g.log.Info("the creation period of output is not passed. try again", "outputIndex", outputIndex, "isInCreationPeriod", isInCreationPeriod) - return true - } - - shouldBeDeleted, err := g.shouldBeDeleted(outputIndex, fromBlock, toBlock) - if err != nil { - g.log.Error("unable to inspect the output for force deletion", "err", err, "outputIndex", outputIndex) - return true - } - - if !shouldBeDeleted { - g.log.Info("no need to delete output forcefully", "outputIndex", outputIndex) - return false - } - - tx, err := g.RequestDeletion(g.ctx, outputIndex) - if err != nil { - g.log.Error("failed to create tx for output deletion", "err", err, "outputIndex", outputIndex) - return true + inGuardianPeriod, retry, err := g.isInGuardianPeriod(outputIndex) + if err != nil { + g.log.Error("unable to fetch if output is in guardian period", "err", err, "outputIndex", outputIndex) + continue + } + if !inGuardianPeriod { + if retry { + continue + } else { + return } + } - if txResponse := g.cfg.TxManager.SendTransaction(g.ctx, tx); txResponse.Err != nil { - g.log.Error("failed to send deletion request tx", "err", txResponse.Err, "outputIndex", outputIndex) - return true - } + shouldBeDeleted, err := g.shouldBeDeleted(outputIndex, fromBlock, toBlock) + if err != nil { + g.log.Error("unable to inspect the output for force deletion", "err", err, "outputIndex", outputIndex) + continue + } + if !shouldBeDeleted { + g.log.Info("no need to delete output forcefully", "outputIndex", outputIndex) + return + } - return false - }() + tx, err := g.RequestDeletion(g.ctx, outputIndex) + if err != nil { + g.log.Error("failed to create tx for output deletion", "err", err, "outputIndex", outputIndex) + continue + } - if retry { + if txResponse := g.cfg.TxManager.SendTransaction(g.ctx, tx); txResponse.Err != nil { + g.log.Error("failed to send deletion request tx", "err", txResponse.Err, "outputIndex", outputIndex) continue } + return } } } -// confirmationLoop validates and sends confirm txs when multi sig tx that requires confirmation is created. -func (g *Guardian) confirmationLoop() { +// subscriptionLoop handles event subscriptions. +func (g *Guardian) subscriptionLoop() { defer g.wg.Done() for { @@ -356,12 +404,16 @@ func (g *Guardian) confirmationLoop() { case ev := <-g.deletionRequestedChan: g.wg.Add(1) go g.processOutputDeletion(ev) + case ev := <-g.challengeCreatedChan: + g.wg.Add(1) + go g.processChallengerTimeout(ev) case <-g.ctx.Done(): return } } } +// processOutputValidation validates the deleted output and sends confirm tx when multi sig tx that requires confirmation is created. func (g *Guardian) processOutputValidation(event *bindings.SecurityCouncilValidationRequested) { g.log.Info("processing validation of the deleted output", "l2BlockNumber", event.L2BlockNumber, "outputRoot", event.OutputRoot, "transactionId", event.TransactionId) @@ -385,6 +437,7 @@ func (g *Guardian) processOutputValidation(event *bindings.SecurityCouncilValida } } +// processOutputDeletion validates the requested output deletion and sends confirm tx when multi sig tx that requires confirmation is created. func (g *Guardian) processOutputDeletion(event *bindings.SecurityCouncilDeletionRequested) { g.log.Info("processing validation of the output to be deleted", "outputIndex", event.OutputIndex, "transactionId", event.TransactionId) @@ -408,6 +461,49 @@ func (g *Guardian) processOutputDeletion(event *bindings.SecurityCouncilDeletion } } +// processChallengerTimeout tracks created challenges and sends challenger timeout txs when challenger timed out. +func (g *Guardian) processChallengerTimeout(event *bindings.ColosseumChallengeCreated) { + outputIndex, challenger := event.OutputIndex, event.Challenger + g.log.Info("processing challenge to call challenger timeout", "outputIndex", outputIndex, "asserter", event.Asserter, "challenger", challenger) + + ticker := time.NewTicker(10 * time.Second) + defer func() { + ticker.Stop() + g.wg.Done() + }() + + for ; ; <-ticker.C { + select { + case <-g.ctx.Done(): + return + default: + inGuardianPeriod, retry, err := g.isInGuardianPeriod(outputIndex) + if err != nil { + g.log.Error("unable to fetch if output in guardian period", "err", err, "outputIndex", outputIndex) + continue + } + if !inGuardianPeriod { + if retry { + continue + } else { + return + } + } + + retry, err = g.tryChallengerTimeoutTx(outputIndex, challenger) + if err != nil { + g.log.Error("failed to try challenge timeout tx", "err", err, "outputIndex", outputIndex, "challenger", challenger) + continue + } + if retry { + continue + } else { + return + } + } + } +} + func (g *Guardian) tryConfirmRequestValidationTx(event *bindings.SecurityCouncilValidationRequested) error { outputIndex, err := g.getL2OutputIndexAfter(event.L2BlockNumber) if err != nil { @@ -517,6 +613,58 @@ func (g *Guardian) CheckConfirmCondition(ctx context.Context, transactionId *big return true, nil } +func (g *Guardian) isInGuardianPeriod(outputIndex *big.Int) (inGuardianPeriod bool, retry bool, err error) { + isFinalized, err := g.isOutputFinalized(g.ctx, outputIndex) + if err != nil { + return false, true, fmt.Errorf("unable to check if the output is finalized or not: %w", err) + } + // outputs that have been finalized are not target + if isFinalized { + g.log.Info("the output is finalized, no need to handle", "outputIndex", outputIndex) + return false, false, nil + } + + cCtx, cCancel := context.WithTimeout(g.ctx, g.cfg.NetworkTimeout) + defer cCancel() + isInCreationPeriod, err := g.colosseumContract.IsInCreationPeriod(optsutils.NewSimpleCallOpts(cCtx), outputIndex) + if err != nil { + return false, true, fmt.Errorf("unable to check if the output is in challenge creation period or not: %w", err) + } + if isInCreationPeriod { + g.log.Info("the creation period of output is not passed. try again", "outputIndex", outputIndex) + return false, true, nil + } + + return true, false, nil +} + +func (g *Guardian) tryChallengerTimeoutTx(outputIndex *big.Int, challenger common.Address) (retry bool, err error) { + status, err := g.getChallengeStatus(outputIndex, challenger) + if err != nil { + return true, fmt.Errorf("unable to fetch challenge status: %w", err) + } + + if status == challenge.StatusNone { + g.log.Info("challenge status is None, no need to call challenger timeout", "outputIndex", outputIndex, "challenger", challenger) + return false, nil + } else if status == challenge.StatusChallengerTimeout { + g.log.Info("challenge status is ChallengerTimout, call challenger timeout", "outputIndex", outputIndex, "challenger", challenger) + + tx, err := g.challengerTimeout(g.ctx, outputIndex, challenger) + if err != nil { + return true, fmt.Errorf("failed to create challenger timeout tx: %w", err) + } + + if txResponse := g.cfg.TxManager.SendTransaction(g.ctx, tx); txResponse.Err != nil { + return true, fmt.Errorf("failed to send challenger timeout tx: %w", txResponse.Err) + } + + return false, nil + } else { + return true, nil + } +} + // shouldBeDeleted checks the output should have been deleted or not. // It finds the output of the challenge that triggered the ReadyToProve event // and compares it to the local output of the guardian. @@ -584,6 +732,12 @@ func (g *Guardian) RequestDeletion(ctx context.Context, outputIndex *big.Int) (* return g.securityCouncilContract.RequestDeletion(txOpts, outputIndex, false) } +func (g *Guardian) challengerTimeout(ctx context.Context, outputIndex *big.Int, challenger common.Address) (*types.Transaction, error) { + g.log.Info("crafting challenger timeout tx", "outputIndex", outputIndex, "challenger", challenger) + txOpts := optsutils.NewSimpleTxOpts(ctx, g.cfg.TxManager.From(), g.cfg.TxManager.Signer) + return g.colosseumContract.ChallengerTimeout(txOpts, outputIndex, challenger) +} + func (g *Guardian) OutputRootAtBlock(ctx context.Context, l2BlockNumber uint64) (eth.Bytes32, error) { cCtx, cCancel := context.WithTimeout(ctx, g.cfg.NetworkTimeout) defer cCancel() @@ -611,3 +765,9 @@ func (g *Guardian) isTransactionConfirmed(ctx context.Context, transactionId *bi defer cCancel() return g.securityCouncilContract.IsConfirmed(optsutils.NewSimpleCallOpts(cCtx), transactionId) } + +func (g *Guardian) getChallengeStatus(outputIndex *big.Int, challenger common.Address) (uint8, error) { + cCtx, cCancel := context.WithTimeout(g.ctx, g.cfg.NetworkTimeout) + defer cCancel() + return g.colosseumContract.GetStatus(optsutils.NewSimpleCallOpts(cCtx), outputIndex, challenger) +} diff --git a/kroma-validator/l2_output_submitter.go b/kroma-validator/l2_output_submitter.go index 6b02604db8..e0747611cc 100644 --- a/kroma-validator/l2_output_submitter.go +++ b/kroma-validator/l2_output_submitter.go @@ -40,13 +40,17 @@ type L2OutputSubmitter struct { log log.Logger metr metrics.Metricer - l2ooContract *bindings.L2OutputOracleCaller - l2ooABI *abi.ABI - valpoolContract *bindings.ValidatorPoolCaller - - singleRoundInterval *big.Int - l2BlockTime *big.Int - requiredBondAmount *big.Int + l2OOContract *bindings.L2OutputOracleCaller + l2OOABI *abi.ABI + valPoolContract *bindings.ValidatorPoolCaller + valMgrContract *bindings.ValidatorManagerCaller + assetMgrContract *bindings.AssetManagerCaller + + singleRoundInterval *big.Int + l2BlockTime *big.Int + requiredBondAmountV1 *big.Int + requiredBondAmountV2 *big.Int + valPoolTerminationIndex *big.Int submitChan chan struct{} @@ -55,28 +59,40 @@ type L2OutputSubmitter struct { // NewL2OutputSubmitter creates a new L2OutputSubmitter. func NewL2OutputSubmitter(cfg Config, l log.Logger, m metrics.Metricer) (*L2OutputSubmitter, error) { - l2ooContract, err := bindings.NewL2OutputOracleCaller(cfg.L2OutputOracleAddr, cfg.L1Client) + l2OOContract, err := bindings.NewL2OutputOracleCaller(cfg.L2OutputOracleAddr, cfg.L1Client) + if err != nil { + return nil, err + } + + parsedL2OOAbi, err := bindings.L2OutputOracleMetaData.GetAbi() if err != nil { return nil, err } - parsed, err := bindings.L2OutputOracleMetaData.GetAbi() + valPoolContract, err := bindings.NewValidatorPoolCaller(cfg.ValidatorPoolAddr, cfg.L1Client) if err != nil { return nil, err } - valpoolContract, err := bindings.NewValidatorPoolCaller(cfg.ValidatorPoolAddr, cfg.L1Client) + valMgrContract, err := bindings.NewValidatorManagerCaller(cfg.ValidatorManagerAddr, cfg.L1Client) + if err != nil { + return nil, err + } + + assetMgrContract, err := bindings.NewAssetManagerCaller(cfg.AssetManagerAddr, cfg.L1Client) if err != nil { return nil, err } return &L2OutputSubmitter{ - cfg: cfg, - log: l.New("service", "submitter"), - metr: m, - l2ooContract: l2ooContract, - l2ooABI: parsed, - valpoolContract: valpoolContract, + cfg: cfg, + log: l.New("service", "submitter"), + metr: m, + l2OOContract: l2OOContract, + l2OOABI: parsedL2OOAbi, + valPoolContract: valPoolContract, + valMgrContract: valMgrContract, + assetMgrContract: assetMgrContract, }, nil } @@ -86,7 +102,7 @@ func (l *L2OutputSubmitter) InitConfig(ctx context.Context) error { err := contractWatcher.WatchUpgraded(l.cfg.L2OutputOracleAddr, func() error { cCtx, cCancel := context.WithTimeout(ctx, l.cfg.NetworkTimeout) defer cCancel() - l2BlockTime, err := l.l2ooContract.L2BLOCKTIME(optsutils.NewSimpleCallOpts(cCtx)) + l2BlockTime, err := l.l2OOContract.L2BLOCKTIME(optsutils.NewSimpleCallOpts(cCtx)) if err != nil { return fmt.Errorf("failed to get l2 block time: %w", err) } @@ -94,7 +110,7 @@ func (l *L2OutputSubmitter) InitConfig(ctx context.Context) error { cCtx, cCancel = context.WithTimeout(ctx, l.cfg.NetworkTimeout) defer cCancel() - submissionInterval, err := l.l2ooContract.SUBMISSIONINTERVAL(optsutils.NewSimpleCallOpts(cCtx)) + submissionInterval, err := l.l2OOContract.SUBMISSIONINTERVAL(optsutils.NewSimpleCallOpts(cCtx)) if err != nil { return fmt.Errorf("failed to get submission interval: %w", err) } @@ -104,22 +120,45 @@ func (l *L2OutputSubmitter) InitConfig(ctx context.Context) error { return nil }) if err != nil { - return fmt.Errorf("failed to initiate l2oo config: %w", err) + return fmt.Errorf("failed to initiate l2OO config: %w", err) } err = contractWatcher.WatchUpgraded(l.cfg.ValidatorPoolAddr, func() error { cCtx, cCancel := context.WithTimeout(ctx, l.cfg.NetworkTimeout) defer cCancel() - requiredBondAmount, err := l.valpoolContract.REQUIREDBONDAMOUNT(optsutils.NewSimpleCallOpts(cCtx)) + requiredBondAmountV1, err := l.valPoolContract.REQUIREDBONDAMOUNT(optsutils.NewSimpleCallOpts(cCtx)) if err != nil { return fmt.Errorf("failed to get required bond amount: %w", err) } - l.requiredBondAmount = requiredBondAmount + l.requiredBondAmountV1 = requiredBondAmountV1 + + cCtx, cCancel = context.WithTimeout(ctx, l.cfg.NetworkTimeout) + defer cCancel() + valPoolTerminationIndex, err := l.valPoolContract.TERMINATEOUTPUTINDEX(optsutils.NewSimpleCallOpts(cCtx)) + if err != nil { + return fmt.Errorf("failed to get valPool termination index: %w", err) + } + l.valPoolTerminationIndex = valPoolTerminationIndex + + return nil + }) + if err != nil { + return fmt.Errorf("failed to initiate valPool config: %w", err) + } + + err = contractWatcher.WatchUpgraded(l.cfg.AssetManagerAddr, func() error { + cCtx, cCancel := context.WithTimeout(ctx, l.cfg.NetworkTimeout) + defer cCancel() + requiredBondAmountV2, err := l.assetMgrContract.BONDAMOUNT(optsutils.NewSimpleCallOpts(cCtx)) + if err != nil { + return fmt.Errorf("failed to get required bond amount of assetMgr: %w", err) + } + l.requiredBondAmountV2 = requiredBondAmountV2 return nil }) if err != nil { - return fmt.Errorf("failed to initiate valpool config: %w", err) + return fmt.Errorf("failed to initiate assetMgr config: %w", err) } return nil @@ -142,6 +181,7 @@ func (l *L2OutputSubmitter) Start(ctx context.Context) error { func (l *L2OutputSubmitter) Stop() error { l.cancel() l.wg.Wait() + close(l.submitChan) return nil @@ -181,18 +221,30 @@ func (l *L2OutputSubmitter) repeatSubmitL2Output(ctx context.Context) { // If it needs to wait, it will calculate how long the validator should wait and // try again after the delay. func (l *L2OutputSubmitter) trySubmitL2Output(ctx context.Context) (time.Duration, error) { + defaultWaitTime := l.cfg.OutputSubmitterRetryInterval + nextBlockNumber, err := l.FetchNextBlockNumber(ctx) if err != nil { - return l.cfg.OutputSubmitterRetryInterval, err + return defaultWaitTime, err } - calculatedWaitTime := l.CalculateWaitTime(ctx, nextBlockNumber) + outputIndex, err := l.FetchNextOutputIndex(ctx) + if err != nil { + return defaultWaitTime, err + } + + calculatedWaitTime := l.CalculateWaitTime(ctx, nextBlockNumber, outputIndex) if calculatedWaitTime > 0 { return calculatedWaitTime, nil } - if err = l.doSubmitL2Output(ctx, nextBlockNumber); err != nil { - return l.cfg.OutputSubmitterRetryInterval, err + canSubmitOutput, err := l.CanSubmitOutput(ctx, outputIndex) + if err != nil || !canSubmitOutput { + return defaultWaitTime, err + } + + if err = l.doSubmitL2Output(ctx, nextBlockNumber, outputIndex); err != nil { + return defaultWaitTime, err } // successfully submitted. start next loop immediately. @@ -200,18 +252,18 @@ func (l *L2OutputSubmitter) trySubmitL2Output(ctx context.Context) (time.Duratio } // doSubmitL2Output submits l2 Output submission transaction. -func (l *L2OutputSubmitter) doSubmitL2Output(ctx context.Context, nextBlockNumber *big.Int) error { +func (l *L2OutputSubmitter) doSubmitL2Output(ctx context.Context, nextBlockNumber *big.Int, outputIndex *big.Int) error { output, err := l.FetchOutput(ctx, nextBlockNumber) if err != nil { return err } - data, err := SubmitL2OutputTxData(l.l2ooABI, output) + data, err := SubmitL2OutputTxData(l.l2OOABI, output) if err != nil { return fmt.Errorf("failed to create submit l2 output transaction data: %w", err) } - if txResponse := l.submitL2OutputTx(data); txResponse.Err != nil { + if txResponse := l.submitL2OutputTx(data, outputIndex); txResponse.Err != nil { return txResponse.Err } @@ -224,7 +276,7 @@ func (l *L2OutputSubmitter) doSubmitL2Output(ctx context.Context, nextBlockNumbe // CalculateWaitTime checks the conditions for submitting L2Output and calculates the required latency. // Returns time 0 if the conditions are such that submission is possible immediately. -func (l *L2OutputSubmitter) CalculateWaitTime(ctx context.Context, nextBlockNumber *big.Int) time.Duration { +func (l *L2OutputSubmitter) CalculateWaitTime(ctx context.Context, nextBlockNumber *big.Int, outputIndex *big.Int) time.Duration { defaultWaitTime := l.cfg.OutputSubmitterRetryInterval currentBlockNumber, err := l.FetchCurrentBlockNumber(ctx) @@ -232,8 +284,8 @@ func (l *L2OutputSubmitter) CalculateWaitTime(ctx context.Context, nextBlockNumb return defaultWaitTime } - err = l.assertEnoughDeposit(ctx) - if err != nil { + if _, err = l.CanSubmitOutput(ctx, outputIndex); err != nil { + l.log.Error("failed to check the validator can submit output", "err", err) return defaultWaitTime } @@ -245,11 +297,12 @@ func (l *L2OutputSubmitter) CalculateWaitTime(ctx context.Context, nextBlockNumb roundBuffer := new(big.Int).SetUint64(l.cfg.OutputSubmitterRoundBuffer) if currentBlockNumber.Cmp(nextBlockNumberToWait) < 0 { nextBlockNumberToWait = new(big.Int).Sub(nextBlockNumber, roundBuffer) + l.log.Info("submission interval has not elapsed", "currentBlockNumber", currentBlockNumber, "nextBlockNumberToWait", nextBlockNumberToWait) return l.getLeftTimeForL2Blocks(currentBlockNumber, nextBlockNumberToWait) } // Check if it's a public round, or selected for priority validator - roundInfo, err := l.fetchCurrentRound(ctx) + roundInfo, err := l.fetchCurrentRound(ctx, outputIndex) if err != nil { return defaultWaitTime } @@ -258,6 +311,7 @@ func (l *L2OutputSubmitter) CalculateWaitTime(ctx context.Context, nextBlockNumb // wait for L2 blocks proceeding until public round when not selected for priority validator roundIntervalToWait := new(big.Int).Sub(l.singleRoundInterval, roundBuffer) nextBlockNumberToWait = new(big.Int).Add(nextBlockNumber, roundIntervalToWait) + l.log.Info("wait for next submission chance", "currentBlockNumber", currentBlockNumber, "nextBlockNumberToWait", nextBlockNumberToWait) return l.getLeftTimeForL2Blocks(currentBlockNumber, nextBlockNumberToWait) } @@ -265,34 +319,79 @@ func (l *L2OutputSubmitter) CalculateWaitTime(ctx context.Context, nextBlockNumb return 0 } -// assertEnoughDeposit asserts that validator has enough deposit to bond when trying output submission. -func (l *L2OutputSubmitter) assertEnoughDeposit(ctx context.Context) error { +// CanSubmitOutput checks that the validator satisfies the condition to submit L2Output. +func (l *L2OutputSubmitter) CanSubmitOutput(ctx context.Context, outputIndex *big.Int) (bool, error) { cCtx, cCancel := context.WithTimeout(ctx, l.cfg.NetworkTimeout) defer cCancel() from := l.cfg.TxManager.From() - balance, err := l.valpoolContract.BalanceOf(optsutils.NewSimpleCallOpts(cCtx), from) - if err != nil { - return fmt.Errorf("failed to fetch deposit amount: %w", err) + + var balance, requiredBondAmount *big.Int + if l.IsValPoolTerminated(outputIndex) { + if isInJail, err := l.IsInJail(ctx); err != nil { + return false, err + } else if isInJail { + l.log.Warn("validator is in jail") + return false, nil + } + + validatorStatus, err := l.GetValidatorStatus(ctx) + if err != nil { + return false, err + } + l.metr.RecordValidatorStatus(validatorStatus) + + if validatorStatus != StatusActive { + l.log.Warn("validator is not in the status to submit output", "currentStatus", validatorStatus) + return false, nil + } + + balance, err = l.assetMgrContract.TotalValidatorKroNotBonded(optsutils.NewSimpleCallOpts(cCtx), from) + if err != nil { + return false, fmt.Errorf("failed to fetch balance: %w", err) + } + requiredBondAmount = l.requiredBondAmountV2 + } else { + var err error + balance, err = l.valPoolContract.BalanceOf(optsutils.NewSimpleCallOpts(cCtx), from) + if err != nil { + return false, fmt.Errorf("failed to fetch deposit amount: %w", err) + } + requiredBondAmount = l.requiredBondAmountV1 } - l.metr.RecordDepositAmount(balance) + l.metr.RecordUnbondedDepositAmount(balance) - if balance.Cmp(l.requiredBondAmount) == -1 { + // Check if the unbonded deposit amount is less than the required bond amount + if balance.Cmp(requiredBondAmount) == -1 { l.log.Warn( - "deposit is less than bond attempt amount", - "requiredBondAmount", l.requiredBondAmount, - "deposit", balance, + "unbonded deposit is less than bond attempt amount", + "requiredBondAmount", requiredBondAmount, + "unbonded_deposit", balance, ) - return nil + return false, nil } - l.log.Info("deposit amount", "deposit", balance) - return nil + l.log.Info("unbonded deposit amount and required bond amount", + "unbonded_deposit", balance, "required_bond", requiredBondAmount) + + return true, nil +} + +func (l *L2OutputSubmitter) FetchNextOutputIndex(ctx context.Context) (*big.Int, error) { + cCtx, cCancel := context.WithTimeout(ctx, l.cfg.NetworkTimeout) + defer cCancel() + + outputIndex, err := l.l2OOContract.NextOutputIndex(optsutils.NewSimpleCallOpts(cCtx)) + if err != nil { + return nil, fmt.Errorf("failed to fetch next output index: %w", err) + } + + return outputIndex, nil } func (l *L2OutputSubmitter) FetchNextBlockNumber(ctx context.Context) (*big.Int, error) { cCtx, cCancel := context.WithTimeout(ctx, l.cfg.NetworkTimeout) defer cCancel() - nextBlockNumber, err := l.l2ooContract.NextBlockNumber(optsutils.NewSimpleCallOpts(cCtx)) + nextBlockNumber, err := l.l2OOContract.NextBlockNumber(optsutils.NewSimpleCallOpts(cCtx)) if err != nil { l.log.Error("unable to get next block number", "err", err) return nil, err @@ -322,8 +421,32 @@ func (l *L2OutputSubmitter) FetchCurrentBlockNumber(ctx context.Context) (*big.I return currentBlockNumber, nil } +func (l *L2OutputSubmitter) IsValPoolTerminated(outputIndex *big.Int) bool { + return l.valPoolTerminationIndex.Cmp(outputIndex) < 0 +} + +func (l *L2OutputSubmitter) GetValidatorStatus(ctx context.Context) (uint8, error) { + cCtx, cCancel := context.WithTimeout(ctx, l.cfg.NetworkTimeout) + defer cCancel() + validatorStatus, err := l.valMgrContract.GetStatus(optsutils.NewSimpleCallOpts(cCtx), l.cfg.TxManager.From()) + if err != nil { + return 0, fmt.Errorf("failed to fetch the validator status: %w", err) + } + return validatorStatus, nil +} + +func (l *L2OutputSubmitter) IsInJail(ctx context.Context) (bool, error) { + cCtx, cCancel := context.WithTimeout(ctx, l.cfg.NetworkTimeout) + defer cCancel() + isInJail, err := l.valMgrContract.InJail(optsutils.NewSimpleCallOpts(cCtx), l.cfg.TxManager.From()) + if err != nil { + return false, fmt.Errorf("failed to fetch the jail status: %w", err) + } + + return isInJail, nil +} + func (l *L2OutputSubmitter) getLeftTimeForL2Blocks(currentBlockNumber *big.Int, targetBlockNumber *big.Int) time.Duration { - l.log.Info("submission interval has not elapsed", "currentBlockNumber", currentBlockNumber, "targetBlockNumber", targetBlockNumber) waitBlockNum := new(big.Int).Sub(targetBlockNumber, currentBlockNumber) var waitDuration time.Duration @@ -349,13 +472,14 @@ func (r *roundInfo) canJoinRound() bool { return joinPriority || joinPublic } -// fetchCurrentRound fetches next validator address from ValidatorPool contract. +// fetchCurrentRound fetches next validator address from ValidatorPool or ValidatorManager contract. // It returns if current round is public round, and if selected for priority validator if it's a priority round. -func (l *L2OutputSubmitter) fetchCurrentRound(ctx context.Context) (roundInfo, error) { +func (l *L2OutputSubmitter) fetchCurrentRound(ctx context.Context, outputIndex *big.Int) (roundInfo, error) { cCtx, cCancel := context.WithTimeout(ctx, l.cfg.NetworkTimeout) defer cCancel() ri := roundInfo{canJoinPublicRound: l.cfg.OutputSubmitterAllowPublicRound} - nextValidator, err := l.valpoolContract.NextValidator(optsutils.NewSimpleCallOpts(cCtx)) + + nextValidator, err := l.getNextValidatorAddress(cCtx, outputIndex) if err != nil { l.log.Error("unable to get next validator address", "err", err) ri.isPublicRound = false @@ -385,6 +509,15 @@ func (l *L2OutputSubmitter) fetchCurrentRound(ctx context.Context) (roundInfo, e return ri, nil } +// getNextValidatorAddress selects the appropriate contract and retrieves the next validator address. +func (l *L2OutputSubmitter) getNextValidatorAddress(ctx context.Context, outputIndex *big.Int) (common.Address, error) { + opts := optsutils.NewSimpleCallOpts(ctx) + if l.IsValPoolTerminated(outputIndex) { + return l.valMgrContract.NextValidator(opts) + } + return l.valPoolContract.NextValidator(opts) +} + // FetchOutput gets the output information to the corresponding block number. // It returns the output info if the output can be made, otherwise error. func (l *L2OutputSubmitter) FetchOutput(ctx context.Context, blockNumber *big.Int) (*eth.OutputResponse, error) { @@ -419,8 +552,18 @@ func SubmitL2OutputTxData(abi *abi.ABI, output *eth.OutputResponse) ([]byte, err } // submitL2OutputTx creates l2 output submit tx candidate and sends it to txCandidates channel to process validator's tx candidates in order. -func (l *L2OutputSubmitter) submitL2OutputTx(data []byte) *txmgr.TxResponse { - layout, err := bindings.GetStorageLayout("ValidatorPool") +func (l *L2OutputSubmitter) submitL2OutputTx(data []byte, outputIndex *big.Int) *txmgr.TxResponse { + var name string + var accessListAddr common.Address + if l.IsValPoolTerminated(outputIndex) { + name = "ValidatorManager" + accessListAddr = l.cfg.ValidatorManagerAddr + } else { + name = "ValidatorPool" + accessListAddr = l.cfg.ValidatorPoolAddr + } + + layout, err := bindings.GetStorageLayout(name) if err != nil { return &txmgr.TxResponse{ Receipt: nil, @@ -431,19 +574,28 @@ func (l *L2OutputSubmitter) submitL2OutputTx(data []byte) *txmgr.TxResponse { var outputIndexSlot, priorityValidatorSlot common.Hash for _, entry := range layout.Storage { switch entry.Label { + // ValidatorPool case "nextUnbondOutputIndex": outputIndexSlot = common.BigToHash(big.NewInt(int64(entry.Slot))) case "nextPriorityValidator": priorityValidatorSlot = common.BigToHash(big.NewInt(int64(entry.Slot))) + // ValidatorManager + case "_nextPriorityValidator": + priorityValidatorSlot = common.BigToHash(big.NewInt(int64(entry.Slot))) } } - storageKeys := []common.Hash{outputIndexSlot, priorityValidatorSlot} + var storageKeys []common.Hash + if l.IsValPoolTerminated(outputIndex) { + storageKeys = []common.Hash{priorityValidatorSlot} + } else { + storageKeys = []common.Hash{outputIndexSlot, priorityValidatorSlot} + } // If provide accessList that is not actually accessed, the transaction may not be executed due to exceeding the estimated gas limit accessList := types.AccessList{ types.AccessTuple{ - Address: l.cfg.ValidatorPoolAddr, + Address: accessListAddr, StorageKeys: storageKeys, }, } @@ -481,6 +633,6 @@ func (l *L2OutputSubmitter) submitL2OutputTx(data []byte) *txmgr.TxResponse { }) } -func (l *L2OutputSubmitter) L2ooAbi() *abi.ABI { - return l.l2ooABI +func (l *L2OutputSubmitter) L2OOAbi() *abi.ABI { + return l.l2OOABI } diff --git a/kroma-validator/metrics/metrics.go b/kroma-validator/metrics/metrics.go index 24bf057e69..a881537d73 100644 --- a/kroma-validator/metrics/metrics.go +++ b/kroma-validator/metrics/metrics.go @@ -4,15 +4,14 @@ import ( "context" "math/big" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/ethclient" - "github.com/ethereum/go-ethereum/log" - "github.com/prometheus/client_golang/prometheus" - "github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum-optimism/optimism/op-service/httputil" opmetrics "github.com/ethereum-optimism/optimism/op-service/metrics" txmetrics "github.com/ethereum-optimism/optimism/op-service/txmgr/metrics" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/log" + "github.com/prometheus/client_golang/prometheus" ) const ( @@ -31,7 +30,8 @@ type Metricer interface { txmetrics.TxMetricer RecordL2OutputSubmitted(l2ref eth.L2BlockRef) - RecordDepositAmount(amount *big.Int) + RecordUnbondedDepositAmount(amount *big.Int) + RecordValidatorStatus(status uint8) RecordNextValidator(address common.Address) RecordChallengeCheckpoint(outputIndex *big.Int) } @@ -45,11 +45,12 @@ type Metrics struct { txmetrics.TxMetrics opmetrics.RPCMetrics - Info prometheus.GaugeVec - Up prometheus.Gauge - DepositAmount prometheus.Gauge - NextValidator prometheus.GaugeVec - ChallengeCheckpoint prometheus.Gauge + Info prometheus.GaugeVec + Up prometheus.Gauge + UnbondedDepositAmount prometheus.Gauge + ValidatorStatus prometheus.Gauge + NextValidator prometheus.GaugeVec + ChallengeCheckpoint prometheus.Gauge } var _ Metricer = (*Metrics)(nil) @@ -84,10 +85,15 @@ func NewMetrics(procName string) *Metrics { Name: "up", Help: "1 if the kroma-validator has finished starting up", }), - DepositAmount: factory.NewGauge(prometheus.GaugeOpts{ + UnbondedDepositAmount: factory.NewGauge(prometheus.GaugeOpts{ + Namespace: ns, + Name: "unbonded_deposit_amount", + Help: "The amount of Validator balance excluding the bonded amount", + }), + ValidatorStatus: factory.NewGauge(prometheus.GaugeOpts{ Namespace: ns, - Name: "deposit_amount", - Help: "The amount deposited into the ValidatorPool contract", + Name: "validator_status", + Help: "The status of validator in the ValidatorManager contract", }), NextValidator: *factory.NewGaugeVec(prometheus.GaugeOpts{ Namespace: ns, @@ -109,7 +115,8 @@ func (m *Metrics) Start(host string, port int) (*httputil.HTTPServer, error) { } func (m *Metrics) StartBalanceMetrics(ctx context.Context, - l log.Logger, client *ethclient.Client, account common.Address) { + l log.Logger, client *ethclient.Client, account common.Address, +) { // TODO(7684): util was refactored to close, but ctx is still being used by caller for shutdown balanceMetric := opmetrics.LaunchBalanceMetrics(l, m.registry, m.ns, client, account) go func() { @@ -135,9 +142,14 @@ func (m *Metrics) RecordL2OutputSubmitted(l2ref eth.L2BlockRef) { m.RecordL2Ref(L2OutputSubmitted, l2ref) } -// RecordDepositAmount sets the amount deposited into the ValidatorPool contract. -func (m *Metrics) RecordDepositAmount(amount *big.Int) { - m.DepositAmount.Set(opmetrics.WeiToEther(amount)) +// RecordUnbondedDepositAmount sets the amount deposited into the ValidatorPool contract. +func (m *Metrics) RecordUnbondedDepositAmount(amount *big.Int) { + m.UnbondedDepositAmount.Set(opmetrics.WeiToEther(amount)) +} + +// RecordValidatorStatus sets the status of validator in the ValidatorManager contract. +func (m *Metrics) RecordValidatorStatus(status uint8) { + m.ValidatorStatus.Set(float64(status)) } // RecordNextValidator sets the address of the next validator. diff --git a/kroma-validator/metrics/noop.go b/kroma-validator/metrics/noop.go index 26d8ad49c6..684d114d2d 100644 --- a/kroma-validator/metrics/noop.go +++ b/kroma-validator/metrics/noop.go @@ -21,6 +21,7 @@ func (*noopMetrics) RecordInfo(version string) {} func (*noopMetrics) RecordUp() {} func (*noopMetrics) RecordL2OutputSubmitted(l2ref eth.L2BlockRef) {} -func (*noopMetrics) RecordDepositAmount(amount *big.Int) {} +func (*noopMetrics) RecordUnbondedDepositAmount(amount *big.Int) {} +func (*noopMetrics) RecordValidatorStatus(status uint8) {} func (*noopMetrics) RecordNextValidator(address common.Address) {} func (*noopMetrics) RecordChallengeCheckpoint(outputIndex *big.Int) {} diff --git a/kroma-validator/status.go b/kroma-validator/status.go new file mode 100644 index 0000000000..b349b89a24 --- /dev/null +++ b/kroma-validator/status.go @@ -0,0 +1,10 @@ +package validator + +const ( + StatusNone uint8 = iota + StatusExited + StatusRegistered + StatusReady + StatusInactive + StatusActive +) diff --git a/kroma-validator/validator.go b/kroma-validator/validator.go index b02f0fce07..198c748c26 100644 --- a/kroma-validator/validator.go +++ b/kroma-validator/validator.go @@ -6,15 +6,14 @@ import ( "math/big" "time" - "github.com/ethereum/go-ethereum/log" - "github.com/urfave/cli/v2" - opservice "github.com/ethereum-optimism/optimism/op-service" oplog "github.com/ethereum-optimism/optimism/op-service/log" "github.com/ethereum-optimism/optimism/op-service/monitoring" "github.com/ethereum-optimism/optimism/op-service/opio" "github.com/ethereum-optimism/optimism/op-service/optsutils" oprpc "github.com/ethereum-optimism/optimism/op-service/rpc" + "github.com/ethereum/go-ethereum/log" + "github.com/urfave/cli/v2" "github.com/kroma-network/kroma/kroma-bindings/bindings" "github.com/kroma-network/kroma/kroma-validator/flags" @@ -109,9 +108,12 @@ func NewValidator(cfg Config, l log.Logger, m metrics.Metricer) (*Validator, err } } - challenger, err := NewChallenger(cfg, l, m) - if err != nil { - return nil, err + var challenger *Challenger + if cfg.OutputSubmitterEnabled || cfg.ChallengerEnabled { + challenger, err = NewChallenger(cfg, l, m) + if err != nil { + return nil, err + } } var guardian *Guardian @@ -145,23 +147,25 @@ func (v *Validator) Start() error { // wait for kroma node to sync completed v.waitSyncCompleted() - if err := v.cfg.TxManager.Start(v.ctx); err != nil { - return fmt.Errorf("cannot start TxManager: %w", err) + if v.cfg.TxManager != nil { + if err := v.cfg.TxManager.Start(v.ctx); err != nil { + return fmt.Errorf("cannot start TxManager: %w", err) + } } - if v.cfg.OutputSubmitterEnabled { + if v.l2os != nil { if err := v.l2os.Start(v.ctx); err != nil { return fmt.Errorf("cannot start l2 output submitter: %w", err) } } - if v.cfg.OutputSubmitterEnabled || v.cfg.ChallengerEnabled { + if v.challenger != nil { if err := v.challenger.Start(v.ctx); err != nil { return fmt.Errorf("cannot start challenger: %w", err) } } - if v.cfg.GuardianEnabled { + if v.guardian != nil { if err := v.guardian.Start(v.ctx); err != nil { return fmt.Errorf("cannot start guardian: %w", err) } @@ -172,23 +176,26 @@ func (v *Validator) Start() error { func (v *Validator) Stop() error { v.l.Info("stopping Validator") - if err := v.cfg.TxManager.Stop(); err != nil { - return fmt.Errorf("failed to stop TxManager: %w", err) + + if v.cfg.TxManager != nil { + if err := v.cfg.TxManager.Stop(); err != nil { + return fmt.Errorf("failed to stop TxManager: %w", err) + } } - if v.cfg.OutputSubmitterEnabled { + if v.l2os != nil { if err := v.l2os.Stop(); err != nil { return fmt.Errorf("failed to stop l2 output submitter: %w", err) } } - if v.cfg.OutputSubmitterEnabled || v.cfg.ChallengerEnabled { + if v.challenger != nil { if err := v.challenger.Stop(); err != nil { return fmt.Errorf("failed to stop challenger: %w", err) } } - if v.cfg.GuardianEnabled { + if v.guardian != nil { if err := v.guardian.Stop(); err != nil { return fmt.Errorf("failed to stop guardian: %w", err) } diff --git a/op-e2e/actions/l1_miner.go b/op-e2e/actions/l1_miner.go index 266e1837d9..a2b7f453e4 100644 --- a/op-e2e/actions/l1_miner.go +++ b/op-e2e/actions/l1_miner.go @@ -229,17 +229,26 @@ func (s *L1Miner) ActL1EndBlock(t Testing) { } } -func (s *L1Miner) includeL1Block(t StatefulTesting, sender common.Address, timeDelta uint64) { +func (s *L1Miner) ActEmptyBlock(t Testing) { + s.ActL1StartBlock(12)(t) + s.ActL1EndBlock(t) +} + +// [Kroma: START] +func (s *L1Miner) includeL1BlockBySender(t StatefulTesting, sender common.Address, timeDelta uint64) { s.ActL1StartBlock(timeDelta)(t) s.ActL1IncludeTx(sender)(t) s.ActL1EndBlock(t) } -func (s *L1Miner) ActEmptyBlock(t Testing) { - s.ActL1StartBlock(12)(t) +func (s *L1Miner) includeL1BlockByTx(t StatefulTesting, txHash common.Hash, timeDelta uint64) { + s.ActL1StartBlock(timeDelta)(t) + s.ActL1IncludeTxByHash(txHash)(t) s.ActL1EndBlock(t) } +// [Kroma: END] + func (s *L1Miner) Close() error { return s.L1Replica.Close() } diff --git a/op-e2e/actions/l2_challenger.go b/op-e2e/actions/l2_challenger.go index 2109c1747b..cc28139ea7 100644 --- a/op-e2e/actions/l2_challenger.go +++ b/op-e2e/actions/l2_challenger.go @@ -30,9 +30,9 @@ func (v *L2Validator) ActCreateChallenge(t Testing, outputIndex *big.Int) common return status == chal.StatusNone || status == chal.StatusChallengerTimeout }, "challenge is already in progress") - hasEnoughDeposit, err := v.challenger.HasEnoughDeposit(t.Ctx()) - require.NoError(t, err, "unable to check challenger deposit") - require.True(t, hasEnoughDeposit, "challenger not enough deposit to create challenge") + canCreateChallenge, err := v.challenger.CanCreateChallenge(t.Ctx(), outputIndex) + require.NoError(t, err, "unable to check if challenger can create challenge") + require.True(t, canCreateChallenge, "challenger cannot create challenge") tx, err := v.challenger.CreateChallenge(t.Ctx(), outputRange) require.NoError(t, err, "unable to create create challenge tx") diff --git a/op-e2e/actions/l2_challenger_test.go b/op-e2e/actions/l2_challenger_test.go index 9effd27f29..5306e204bb 100644 --- a/op-e2e/actions/l2_challenger_test.go +++ b/op-e2e/actions/l2_challenger_test.go @@ -4,16 +4,69 @@ import ( "math/big" "testing" + "github.com/ethereum-optimism/optimism/op-e2e/testdata" + "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/types" "github.com/stretchr/testify/require" - "github.com/ethereum-optimism/optimism/op-e2e/testdata" val "github.com/kroma-network/kroma/kroma-validator" chal "github.com/kroma-network/kroma/kroma-validator/challenge" + valhelper "github.com/kroma-network/kroma/op-e2e/e2eutils/validator" ) -func TestChallenge(t *testing.T) { - rt := defaultRuntime(t, setupSequencerTest) +var challengerTests = []struct { + name string + f func(ft *testing.T, deltaTimeOffset *hexutil.Uint64, version uint8) +}{ + {"ChallengeBasic", ChallengeBasic}, + {"ChallengeAsserterBisectTimeout", ChallengeAsserterBisectTimeout}, + {"ChallengeChallengerBisectTimeout", ChallengeChallengerBisectTimeout}, + {"ChallengeChallengerProvingTimeout", ChallengeChallengerProvingTimeout}, + {"ChallengeInvalidProofFail", ChallengeInvalidProofFail}, + {"ChallengeForceDeleteOutputBySecurityCouncil", ChallengeForceDeleteOutputBySecurityCouncil}, + {"MultipleChallenges", MultipleChallenges}, +} + +// TestChallengerBatchType run each challenger-related test case in singular batch mode and span batch mode. +func TestChallengerBatchType(t *testing.T) { + for _, test := range challengerTests { + test := test + t.Run(test.name+"_SingularBatch", func(t *testing.T) { + test.f(t, nil, valhelper.ValidatorV1) + }) + } + + deltaTimeOffset := hexutil.Uint64(0) + for _, test := range challengerTests { + test := test + t.Run(test.name+"_SpanBatch", func(t *testing.T) { + test.f(t, &deltaTimeOffset, valhelper.ValidatorV1) + }) + } +} + +// TestValidatorSystemVersion run each challenge test case in ValidatorPool version and ValidatorManager version. +func TestValidatorSystemVersion(t *testing.T) { + for _, test := range challengerTests { + test := test + t.Run(test.name+"_ValidatorPool", func(t *testing.T) { + test.f(t, nil, valhelper.ValidatorV1) + }) + } + for _, test := range challengerTests { + test := test + t.Run(test.name+"_ValidatorManager", func(t *testing.T) { + test.f(t, nil, valhelper.ValidatorV2) + }) + } +} + +func ChallengeBasic(t *testing.T, deltaTimeOffset *hexutil.Uint64, version uint8) { + rt := defaultRuntime(t, setupSequencerTest, deltaTimeOffset) + + if version == valhelper.ValidatorV2 { + rt.assertRedeployValPoolToTerminate(defaultValPoolTerminationIndex) + } rt.setTargetInvalidBlockNumber(testdata.TargetBlockNumber) rt.setupMaliciousValidator() @@ -21,13 +74,18 @@ func TestChallenge(t *testing.T) { rt.setupHonestGuardian() // bind contracts - rt.bindChallengeContracts() + rt.bindContracts() // submit outputs - rt.setupOutputSubmitted() + rt.setupOutputSubmitted(version) // create challenge - rt.setupChallenge(rt.challenger1) + rt.setupChallenge(rt.challenger1, version) + + var beforeAsset, beforeAssetBonded *big.Int + if version == valhelper.ValidatorV2 { + _, _, beforeAsset, beforeAssetBonded, _ = rt.fetchValidatorStatus(rt.validator) + } interaction: for { @@ -38,14 +96,14 @@ interaction: case chal.StatusChallengerTurn: // call bisect by challenger rt.txHash = rt.challenger1.ActBisect(rt.t, rt.outputIndex, rt.challenger1.address, false) - rt.IncludeL1Block(rt.challenger1.address) + rt.includeL1BlockBySender(rt.challenger1.address) case chal.StatusAsserterTurn: // call bisect by validator rt.txHash = rt.validator.ActBisect(rt.t, rt.outputIndex, rt.challenger1.address, true) - rt.IncludeL1Block(rt.validator.address) + rt.includeL1BlockBySender(rt.validator.address) case chal.StatusReadyToProve: rt.txHash = rt.challenger1.ActProveFault(rt.t, rt.outputIndex, false) - rt.IncludeL1Block(rt.challenger1.address) + rt.includeL1BlockBySender(rt.challenger1.address) case chal.StatusNone: // guardian validates deleted output by challenger is invalid after challenge is proven outputBlockNum := rt.outputOnL1.L2BlockNumber.Uint64() @@ -76,14 +134,27 @@ interaction: require.NoError(rt.t, err) require.Equal(rt.t, chal.StatusNone, status) - // check bond amount doubled after challenge proven - bond, err := rt.valPoolContract.GetBond(nil, rt.outputIndex) - require.NoError(rt.t, err) - require.Equal(rt.t, big.NewInt(2*rt.dp.DeployConfig.ValidatorPoolRequiredBondAmount.ToInt().Int64()), bond.Amount) + if version == valhelper.ValidatorV1 { + // check bond amount doubled after challenge proven + bond, err := rt.valPoolContract.GetBond(nil, rt.outputIndex) + require.NoError(rt.t, err) + require.Equal(rt.t, big.NewInt(2*rt.dp.DeployConfig.ValidatorPoolRequiredBondAmount.ToInt().Int64()), bond.Amount) + } else if version == valhelper.ValidatorV2 { + // check asserter has been slashed + valStatus, inJail, afterAsset, afterAssetBonded, slashingAmount := rt.fetchValidatorStatus(rt.validator) + require.Equal(rt.t, val.StatusReady, valStatus) + require.True(rt.t, inJail) + require.Equal(rt.t, beforeAsset.Uint64()-slashingAmount.Uint64(), afterAsset.Uint64()) + require.Equal(rt.t, beforeAssetBonded.Uint64()-slashingAmount.Uint64(), afterAssetBonded.Uint64()) + } } -func TestChallengeAsserterBisectTimeout(t *testing.T) { - rt := defaultRuntime(t, setupSequencerTest) +func ChallengeAsserterBisectTimeout(t *testing.T, deltaTimeOffset *hexutil.Uint64, version uint8) { + rt := defaultRuntime(t, setupSequencerTest, deltaTimeOffset) + + if version == valhelper.ValidatorV2 { + rt.assertRedeployValPoolToTerminate(defaultValPoolTerminationIndex) + } rt.setTargetInvalidBlockNumber(testdata.TargetBlockNumber) rt.setupMaliciousValidator() @@ -91,13 +162,18 @@ func TestChallengeAsserterBisectTimeout(t *testing.T) { rt.setupHonestGuardian() // bind contracts - rt.bindChallengeContracts() + rt.bindContracts() // submit outputs - rt.setupOutputSubmitted() + rt.setupOutputSubmitted(version) // create challenge - rt.setupChallenge(rt.challenger1) + rt.setupChallenge(rt.challenger1, version) + + var beforeAsset, beforeAssetBonded *big.Int + if version == valhelper.ValidatorV2 { + _, _, beforeAsset, beforeAssetBonded, _ = rt.fetchValidatorStatus(rt.validator) + } interaction: for { @@ -110,7 +186,7 @@ interaction: rt.miner.ActEmptyBlock(rt.t) case chal.StatusAsserterTimeout: rt.txHash = rt.challenger1.ActProveFault(rt.t, rt.outputIndex, true) - rt.IncludeL1Block(rt.challenger1.address) + rt.includeL1BlockBySender(rt.challenger1.address) case chal.StatusNone: // guardian validates deleted output by challenger is invalid after challenge is proven outputBlockNum := rt.outputOnL1.L2BlockNumber.Uint64() @@ -141,27 +217,45 @@ interaction: require.NoError(rt.t, err) require.Equal(rt.t, chal.StatusNone, status) - // check bond amount doubled after challenge proven - bond, err := rt.valPoolContract.GetBond(nil, rt.outputIndex) - require.NoError(rt.t, err) - require.Equal(rt.t, big.NewInt(2*rt.dp.DeployConfig.ValidatorPoolRequiredBondAmount.ToInt().Int64()), bond.Amount) + if version == valhelper.ValidatorV1 { + // check bond amount doubled after challenge proven + bond, err := rt.valPoolContract.GetBond(nil, rt.outputIndex) + require.NoError(rt.t, err) + require.Equal(rt.t, big.NewInt(2*rt.dp.DeployConfig.ValidatorPoolRequiredBondAmount.ToInt().Int64()), bond.Amount) + } else if version == valhelper.ValidatorV2 { + // check asserter has been slashed + valStatus, inJail, afterAsset, afterAssetBonded, slashingAmount := rt.fetchValidatorStatus(rt.validator) + require.Equal(rt.t, val.StatusReady, valStatus) + require.True(rt.t, inJail) + require.Equal(rt.t, beforeAsset.Uint64()-slashingAmount.Uint64(), afterAsset.Uint64()) + require.Equal(rt.t, beforeAssetBonded.Uint64()-slashingAmount.Uint64(), afterAssetBonded.Uint64()) + } } -func TestChallengeChallengerBisectTimeout(t *testing.T) { - rt := defaultRuntime(t, setupSequencerTest) +func ChallengeChallengerBisectTimeout(t *testing.T, deltaTimeOffset *hexutil.Uint64, version uint8) { + rt := defaultRuntime(t, setupSequencerTest, deltaTimeOffset) + + if version == valhelper.ValidatorV2 { + rt.assertRedeployValPoolToTerminate(defaultValPoolTerminationIndex) + } rt.setTargetInvalidBlockNumber(testdata.TargetBlockNumber) rt.setupMaliciousValidator() rt.setupHonestChallenger1() // bind contracts - rt.bindChallengeContracts() + rt.bindContracts() // submit outputs - rt.setupOutputSubmitted() + rt.setupOutputSubmitted(version) // create challenge - rt.setupChallenge(rt.challenger1) + rt.setupChallenge(rt.challenger1, version) + + var beforeAsset, beforeAssetBonded *big.Int + if version == valhelper.ValidatorV2 { + _, _, beforeAsset, beforeAssetBonded, _ = rt.fetchValidatorStatus(rt.challenger1) + } interaction: for { @@ -175,11 +269,11 @@ interaction: case chal.StatusAsserterTurn: // call bisect by validator rt.txHash = rt.validator.ActBisect(rt.t, rt.outputIndex, rt.challenger1.address, true) - rt.IncludeL1Block(rt.validator.address) + rt.includeL1BlockBySender(rt.validator.address) case chal.StatusChallengerTimeout: // call challenger timeout by validator rt.txHash = rt.validator.ActChallengerTimeout(rt.t, rt.outputIndex, rt.challenger1.address) - rt.IncludeL1Block(rt.validator.address) + rt.includeL1BlockBySender(rt.validator.address) default: break interaction } @@ -204,27 +298,45 @@ interaction: require.NoError(rt.t, err) require.Equal(rt.t, chal.StatusNone, status) - // check bond amount doubled after challenger timed out - bond, err := rt.valPoolContract.GetBond(nil, rt.outputIndex) - require.NoError(rt.t, err) - require.Equal(rt.t, big.NewInt(2*rt.dp.DeployConfig.ValidatorPoolRequiredBondAmount.ToInt().Int64()), bond.Amount) + if version == valhelper.ValidatorV1 { + // check bond amount doubled after challenger timed out + bond, err := rt.valPoolContract.GetBond(nil, rt.outputIndex) + require.NoError(rt.t, err) + require.Equal(rt.t, big.NewInt(2*rt.dp.DeployConfig.ValidatorPoolRequiredBondAmount.ToInt().Int64()), bond.Amount) + } else if version == valhelper.ValidatorV2 { + // check challenger has been slashed + valStatus, inJail, afterAsset, afterAssetBonded, slashingAmount := rt.fetchValidatorStatus(rt.challenger1) + require.Equal(rt.t, val.StatusReady, valStatus) + require.True(rt.t, inJail) + require.Equal(rt.t, beforeAsset.Uint64()-slashingAmount.Uint64(), afterAsset.Uint64()) + require.Equal(rt.t, beforeAssetBonded.Uint64()-slashingAmount.Uint64(), afterAssetBonded.Uint64()) + } } -func TestChallengeChallengerProvingTimeout(t *testing.T) { - rt := defaultRuntime(t, setupSequencerTest) +func ChallengeChallengerProvingTimeout(t *testing.T, deltaTimeOffset *hexutil.Uint64, version uint8) { + rt := defaultRuntime(t, setupSequencerTest, deltaTimeOffset) + + if version == valhelper.ValidatorV2 { + rt.assertRedeployValPoolToTerminate(defaultValPoolTerminationIndex) + } rt.setTargetInvalidBlockNumber(testdata.TargetBlockNumber) rt.setupMaliciousValidator() rt.setupHonestChallenger1() // bind contracts - rt.bindChallengeContracts() + rt.bindContracts() // submit outputs - rt.setupOutputSubmitted() + rt.setupOutputSubmitted(version) // create challenge - rt.setupChallenge(rt.challenger1) + rt.setupChallenge(rt.challenger1, version) + + var beforeAsset, beforeAssetBonded *big.Int + if version == valhelper.ValidatorV2 { + _, _, beforeAsset, beforeAssetBonded, _ = rt.fetchValidatorStatus(rt.challenger1) + } interaction: for { @@ -235,18 +347,18 @@ interaction: case chal.StatusChallengerTurn: // call bisect by challenger rt.txHash = rt.challenger1.ActBisect(rt.t, rt.outputIndex, rt.challenger1.address, false) - rt.IncludeL1Block(rt.challenger1.address) + rt.includeL1BlockBySender(rt.challenger1.address) case chal.StatusAsserterTurn: // call bisect by validator rt.txHash = rt.validator.ActBisect(rt.t, rt.outputIndex, rt.challenger1.address, true) - rt.IncludeL1Block(rt.validator.address) + rt.includeL1BlockBySender(rt.validator.address) case chal.StatusReadyToProve: // do nothing to trigger challenger proving timeout rt.miner.ActEmptyBlock(rt.t) case chal.StatusChallengerTimeout: // call challenger timeout by validator rt.txHash = rt.validator.ActChallengerTimeout(rt.t, rt.outputIndex, rt.challenger1.address) - rt.IncludeL1Block(rt.validator.address) + rt.includeL1BlockBySender(rt.validator.address) default: break interaction } @@ -271,14 +383,27 @@ interaction: require.NoError(rt.t, err) require.Equal(rt.t, chal.StatusNone, status) - // check bond amount doubled after challenger timed out - bond, err := rt.valPoolContract.GetBond(nil, rt.outputIndex) - require.NoError(rt.t, err) - require.Equal(rt.t, big.NewInt(2*rt.dp.DeployConfig.ValidatorPoolRequiredBondAmount.ToInt().Int64()), bond.Amount) + if version == valhelper.ValidatorV1 { + // check bond amount doubled after challenger timed out + bond, err := rt.valPoolContract.GetBond(nil, rt.outputIndex) + require.NoError(rt.t, err) + require.Equal(rt.t, big.NewInt(2*rt.dp.DeployConfig.ValidatorPoolRequiredBondAmount.ToInt().Int64()), bond.Amount) + } else if version == valhelper.ValidatorV2 { + // check challenger has been slashed + valStatus, inJail, afterAsset, afterAssetBonded, slashingAmount := rt.fetchValidatorStatus(rt.challenger1) + require.Equal(rt.t, val.StatusReady, valStatus) + require.True(rt.t, inJail) + require.Equal(rt.t, beforeAsset.Uint64()-slashingAmount.Uint64(), afterAsset.Uint64()) + require.Equal(rt.t, beforeAssetBonded.Uint64()-slashingAmount.Uint64(), afterAssetBonded.Uint64()) + } } -func TestChallengeInvalidProofFail(t *testing.T) { - rt := defaultRuntime(t, setupSequencerTest) +func ChallengeInvalidProofFail(t *testing.T, deltaTimeOffset *hexutil.Uint64, version uint8) { + rt := defaultRuntime(t, setupSequencerTest, deltaTimeOffset) + + if version == valhelper.ValidatorV2 { + rt.assertRedeployValPoolToTerminate(defaultValPoolTerminationIndex) + } rt.setTargetInvalidBlockNumber(testdata.TargetBlockNumber) rt.setupMaliciousValidator() @@ -286,13 +411,19 @@ func TestChallengeInvalidProofFail(t *testing.T) { rt.setupMaliciousGuardian() // bind contracts - rt.bindChallengeContracts() + rt.bindContracts() // submit outputs - rt.setupOutputSubmitted() + rt.setupOutputSubmitted(version) // create challenge - rt.setupChallenge(rt.challenger1) + rt.setupChallenge(rt.challenger1, version) + + var beforeAssetChal, beforeAssetVal, beforeAssetBondedChal, beforeAssetBondedVal *big.Int + if version == valhelper.ValidatorV2 { + _, _, beforeAssetChal, beforeAssetBondedChal, _ = rt.fetchValidatorStatus(rt.challenger1) + _, _, beforeAssetVal, beforeAssetBondedVal, _ = rt.fetchValidatorStatus(rt.validator) + } interaction: for { @@ -303,14 +434,14 @@ interaction: case chal.StatusChallengerTurn: // call bisect by challenger rt.txHash = rt.challenger1.ActBisect(rt.t, rt.outputIndex, rt.challenger1.address, false) - rt.IncludeL1Block(rt.challenger1.address) + rt.includeL1BlockBySender(rt.challenger1.address) case chal.StatusAsserterTurn: // call bisect by validator rt.txHash = rt.validator.ActBisect(rt.t, rt.outputIndex, rt.challenger1.address, true) - rt.IncludeL1Block(rt.validator.address) + rt.includeL1BlockBySender(rt.validator.address) case chal.StatusReadyToProve: rt.txHash = rt.challenger1.ActProveFault(rt.t, rt.outputIndex, false) - rt.IncludeL1Block(rt.challenger1.address) + rt.includeL1BlockBySender(rt.challenger1.address) case chal.StatusNone: // get txId from receipt var transactionId *big.Int @@ -335,7 +466,7 @@ interaction: isEqual := rt.guardian.ActValidateL2Output(rt.t, rt.outputOnL1.OutputRoot, outputBlockNum) require.True(rt.t, isEqual, "deleted output is expected equal but actually not equal") rt.txHash = rt.guardian.ActConfirmTransaction(rt.t, transactionId) - rt.IncludeL1Block(rt.guardian.address) + rt.includeL1BlockBySender(rt.guardian.address) break interaction default: break interaction @@ -361,33 +492,55 @@ interaction: require.NoError(rt.t, err) require.Equal(rt.t, chal.StatusNone, status) - // check bond amount doubled after challenge is proven incorrectly anyway - bond, err := rt.valPoolContract.GetBond(nil, rt.outputIndex) - require.NoError(rt.t, err) - require.Equal(rt.t, big.NewInt(2*rt.dp.DeployConfig.ValidatorPoolRequiredBondAmount.ToInt().Int64()), bond.Amount) + if version == valhelper.ValidatorV1 { + // check bond amount doubled after challenge is proven incorrectly anyway + bond, err := rt.valPoolContract.GetBond(nil, rt.outputIndex) + require.NoError(rt.t, err) + require.Equal(rt.t, big.NewInt(2*rt.dp.DeployConfig.ValidatorPoolRequiredBondAmount.ToInt().Int64()), bond.Amount) + } else if version == valhelper.ValidatorV2 { + // check challenger has been slashed + valStatus, inJail, afterAsset, afterAssetBonded, slashingAmount := rt.fetchValidatorStatus(rt.challenger1) + require.Equal(rt.t, val.StatusReady, valStatus) + require.True(rt.t, inJail) + require.Equal(rt.t, beforeAssetChal.Uint64()-slashingAmount.Uint64(), afterAsset.Uint64()) + require.Equal(rt.t, beforeAssetBondedChal.Uint64()-slashingAmount.Uint64(), afterAssetBonded.Uint64()) + + // check asserter has been reverted slash by guardian + valStatus, inJail, afterAsset, afterAssetBonded, slashingAmount = rt.fetchValidatorStatus(rt.validator) + require.Equal(rt.t, val.StatusActive, valStatus) + require.False(rt.t, inJail) + require.Equal(rt.t, beforeAssetVal.Uint64(), afterAsset.Uint64()) + require.Equal(rt.t, beforeAssetBondedVal.Uint64(), afterAssetBonded.Uint64()) + } } -func TestMultipleChallenges(t *testing.T) { - rt := defaultRuntime(t, setupSequencerTest) +func ChallengeForceDeleteOutputBySecurityCouncil(t *testing.T, deltaTimeOffset *hexutil.Uint64, version uint8) { + rt := defaultRuntime(t, setupSequencerTest, deltaTimeOffset) + + if version == valhelper.ValidatorV2 { + rt.assertRedeployValPoolToTerminate(defaultValPoolTerminationIndex) + } rt.setTargetInvalidBlockNumber(testdata.TargetBlockNumber) rt.setupMaliciousValidator() rt.setupHonestChallenger1() - rt.setupHonestChallenger2() rt.setupHonestGuardian() // bind contracts - rt.bindChallengeContracts() + rt.bindContracts() // submit outputs - rt.setupOutputSubmitted() + rt.setupOutputSubmitted(version) - // create challenges - rt.setupChallenge(rt.challenger1) - rt.setupChallenge(rt.challenger2) + // create challenge + rt.setupChallenge(rt.challenger1, version) - // progress challenge by challenger 1 -interaction1: + var beforeAsset, beforeAssetBonded *big.Int + if version == valhelper.ValidatorV2 { + _, _, beforeAsset, beforeAssetBonded, _ = rt.fetchValidatorStatus(rt.validator) + } + +interaction: for { status, err := rt.colosseumContract.GetStatus(nil, rt.outputIndex, rt.challenger1.address) require.NoError(rt.t, err) @@ -396,22 +549,27 @@ interaction1: case chal.StatusChallengerTurn: // call bisect by challenger rt.txHash = rt.challenger1.ActBisect(rt.t, rt.outputIndex, rt.challenger1.address, false) - rt.IncludeL1Block(rt.challenger1.address) + rt.includeL1BlockBySender(rt.challenger1.address) case chal.StatusAsserterTurn: // call bisect by validator rt.txHash = rt.validator.ActBisect(rt.t, rt.outputIndex, rt.challenger1.address, true) - rt.IncludeL1Block(rt.validator.address) + rt.includeL1BlockBySender(rt.validator.address) + case chal.StatusChallengerTimeout: + rt.txHash = rt.validator.ActChallengerTimeout(rt.t, rt.outputIndex, rt.challenger1.address) + rt.includeL1BlockBySender(rt.validator.address) case chal.StatusReadyToProve: - rt.txHash = rt.challenger1.ActProveFault(rt.t, rt.outputIndex, false) - rt.IncludeL1Block(rt.challenger1.address) + // do nothing + rt.miner.ActEmptyBlock(rt.t) case chal.StatusNone: - // guardian validates deleted output by challenger is invalid after challenge is proven outputBlockNum := rt.outputOnL1.L2BlockNumber.Uint64() isEqual := rt.guardian.ActValidateL2Output(rt.t, rt.outputOnL1.OutputRoot, outputBlockNum) - require.False(rt.t, isEqual, "deleted output is expected not equal but actually equal") - break interaction1 + require.False(t, isEqual) + + rt.txHash = rt.guardian.ActForceDeleteOutput(rt.t, rt.outputIndex) + rt.includeL1BlockBySender(rt.guardian.address) + break interaction default: - break interaction1 + break interaction } // check whether the submission was successful @@ -420,74 +578,61 @@ interaction1: require.Equal(rt.t, types.ReceiptStatusSuccessful, rt.receipt.Status, "failed to progress interactive fault proof") } + confirmReceipt, err := rt.miner.EthClient().TransactionReceipt(rt.t.Ctx(), rt.txHash) + require.NoError(rt.t, err) + require.Equal(rt.t, types.ReceiptStatusSuccessful, confirmReceipt.Status, "failed to confirm") + // check output is deleted remoteOutput, err := rt.outputOracleContract.GetL2Output(nil, rt.outputIndex) require.NoError(rt.t, err, "unable to get l2 output") outputDeleted := val.IsOutputDeleted(remoteOutput.OutputRoot) require.True(rt.t, outputDeleted, "invalid output is not deleted") - // check output submitter is changed to challenger - require.Equal(rt.t, remoteOutput.Submitter, rt.challenger1.address) - - // check pending bond amount before challenge is canceled - balance, err := rt.valPoolContract.BalanceOf(nil, rt.challenger2.address) + // check output submitter is changed to security council + securityCouncilAddr, err := rt.colosseumContract.SECURITYCOUNCIL(nil) require.NoError(rt.t, err) - require.Equal(rt.t, balance.Int64(), defaultDepositAmount-rt.dp.DeployConfig.ValidatorPoolRequiredBondAmount.ToInt().Int64()) - - // progress challenge by challenger 2 -interaction2: - for { - status, err := rt.colosseumContract.GetStatus(nil, rt.outputIndex, rt.challenger2.address) - require.NoError(rt.t, err) - - switch status { - case chal.StatusAsserterTurn: - // do nothing because output is already deleted - rt.miner.ActEmptyBlock(rt.t) - case chal.StatusAsserterTimeout: - // call bisect by challenger - rt.txHash = rt.challenger2.ActProveFault(rt.t, rt.outputIndex, true) - rt.IncludeL1Block(rt.challenger2.address) - default: - break interaction2 - } + require.Equal(rt.t, remoteOutput.Submitter, securityCouncilAddr) - // check whether the submission was successful - rt.receipt, err = rt.miner.EthClient().TransactionReceipt(rt.t.Ctx(), rt.txHash) + if version == valhelper.ValidatorV1 { + // check bond amount doubled after output is deleted forcefully + bond, err := rt.valPoolContract.GetBond(nil, rt.outputIndex) require.NoError(rt.t, err) - require.Equal(rt.t, types.ReceiptStatusSuccessful, rt.receipt.Status, "failed to progress interactive fault proof") + require.Equal(rt.t, big.NewInt(2*rt.dp.DeployConfig.ValidatorPoolRequiredBondAmount.ToInt().Int64()), bond.Amount) + } else if version == valhelper.ValidatorV2 { + // check asserter has been slashed + valStatus, inJail, afterAsset, afterAssetBonded, slashingAmount := rt.fetchValidatorStatus(rt.validator) + require.Equal(rt.t, val.StatusReady, valStatus) + require.True(rt.t, inJail) + require.Equal(rt.t, beforeAsset.Uint64()-slashingAmount.Uint64(), afterAsset.Uint64()) + require.Equal(rt.t, beforeAssetBonded.Uint64()-slashingAmount.Uint64(), afterAssetBonded.Uint64()) } - - // check the status of challenge is StatusNone(0) - status, err := rt.colosseumContract.GetStatus(nil, rt.outputIndex, rt.challenger2.address) - require.NoError(rt.t, err) - require.Equal(rt.t, chal.StatusNone, status) - - // check pending bond amount refunded after challenge canceled - balance, err = rt.valPoolContract.BalanceOf(nil, rt.challenger2.address) - require.NoError(rt.t, err) - require.Equal(rt.t, balance.Int64(), int64(defaultDepositAmount)) } -func TestChallengeForceDeleteOutputBySecurityCouncil(t *testing.T) { - rt := defaultRuntime(t, setupSequencerTest) - rt.SetCreationPeriod(9) +func MultipleChallenges(t *testing.T, deltaTimeOffset *hexutil.Uint64, version uint8) { + rt := defaultRuntime(t, setupSequencerTest, deltaTimeOffset) + + if version == valhelper.ValidatorV2 { + rt.assertRedeployValPoolToTerminate(defaultValPoolTerminationIndex) + } rt.setTargetInvalidBlockNumber(testdata.TargetBlockNumber) rt.setupMaliciousValidator() rt.setupHonestChallenger1() + rt.setupHonestChallenger2() rt.setupHonestGuardian() // bind contracts - rt.bindChallengeContracts() + rt.bindContracts() // submit outputs - rt.setupOutputSubmitted() + rt.setupOutputSubmitted(version) - // create challenge - rt.setupChallenge(rt.challenger1) + // create challenges + rt.setupChallenge(rt.challenger1, version) + rt.setupChallenge(rt.challenger2, version) -interaction: + // progress challenge by challenger 1 +interaction1: for { status, err := rt.colosseumContract.GetStatus(nil, rt.outputIndex, rt.challenger1.address) require.NoError(rt.t, err) @@ -496,32 +641,22 @@ interaction: case chal.StatusChallengerTurn: // call bisect by challenger rt.txHash = rt.challenger1.ActBisect(rt.t, rt.outputIndex, rt.challenger1.address, false) - rt.IncludeL1Block(rt.challenger1.address) + rt.includeL1BlockBySender(rt.challenger1.address) case chal.StatusAsserterTurn: // call bisect by validator rt.txHash = rt.validator.ActBisect(rt.t, rt.outputIndex, rt.challenger1.address, true) - rt.IncludeL1Block(rt.validator.address) - case chal.StatusAsserterTimeout: - rt.txHash = rt.challenger1.ActProveFault(rt.t, rt.outputIndex, true) - rt.IncludeL1Block(rt.challenger1.address) - case chal.StatusChallengerTimeout: - rt.txHash = rt.validator.ActChallengerTimeout(rt.t, rt.outputIndex, rt.challenger1.address) - rt.IncludeL1Block(rt.validator.address) + rt.includeL1BlockBySender(rt.validator.address) case chal.StatusReadyToProve: - // do nothing - rt.miner.ActEmptyBlock(rt.t) + rt.txHash = rt.challenger1.ActProveFault(rt.t, rt.outputIndex, false) + rt.includeL1BlockBySender(rt.challenger1.address) case chal.StatusNone: - if rt.IsCreationEnded() { - outputBlockNum := rt.outputOnL1.L2BlockNumber.Uint64() - isEqual := rt.guardian.ActValidateL2Output(rt.t, rt.outputOnL1.OutputRoot, outputBlockNum) - require.False(t, isEqual) - - rt.txHash = rt.guardian.ActForceDeleteOutput(rt.t, rt.outputIndex) - rt.IncludeL1Block(rt.challenger1.address) - break interaction - } + // guardian validates deleted output by challenger is invalid after challenge is proven + outputBlockNum := rt.outputOnL1.L2BlockNumber.Uint64() + isEqual := rt.guardian.ActValidateL2Output(rt.t, rt.outputOnL1.OutputRoot, outputBlockNum) + require.False(rt.t, isEqual, "deleted output is expected not equal but actually equal") + break interaction1 default: - break interaction + break interaction1 } // check whether the submission was successful @@ -530,10 +665,6 @@ interaction: require.Equal(rt.t, types.ReceiptStatusSuccessful, rt.receipt.Status, "failed to progress interactive fault proof") } - confirmReceipt, err := rt.miner.EthClient().TransactionReceipt(rt.t.Ctx(), rt.txHash) - require.NoError(rt.t, err) - require.Equal(rt.t, types.ReceiptStatusSuccessful, confirmReceipt.Status, "failed to confirm") - // check output is deleted remoteOutput, err := rt.outputOracleContract.GetL2Output(nil, rt.outputIndex) require.NoError(rt.t, err, "unable to get l2 output") @@ -541,12 +672,56 @@ interaction: require.True(rt.t, outputDeleted, "invalid output is not deleted") // check output submitter is changed to challenger - securityCouncilAddr, err := rt.colosseumContract.SECURITYCOUNCIL(nil) - require.NoError(rt.t, err) - require.Equal(rt.t, remoteOutput.Submitter, securityCouncilAddr) + require.Equal(rt.t, remoteOutput.Submitter, rt.challenger1.address) - // check bond amount doubled after challenge proven - bond, err := rt.valPoolContract.GetBond(nil, rt.outputIndex) + if version == valhelper.ValidatorV1 { + // check pending bond amount before challenge is canceled + balance, err := rt.valPoolContract.BalanceOf(nil, rt.challenger2.address) + require.NoError(rt.t, err) + require.Equal(rt.t, balance.Int64(), defaultDepositAmount-rt.dp.DeployConfig.ValidatorPoolRequiredBondAmount.ToInt().Int64()) + } else if version == valhelper.ValidatorV2 { + // check bond amount before challenge is canceled + _, _, _, bond, slashingAmount := rt.fetchValidatorStatus(rt.challenger2) + require.Equal(t, slashingAmount.Uint64(), bond.Uint64()) + } + + // progress challenge by challenger 2 +interaction2: + for { + status, err := rt.colosseumContract.GetStatus(nil, rt.outputIndex, rt.challenger2.address) + require.NoError(rt.t, err) + + switch status { + case chal.StatusAsserterTurn: + // do nothing because output is already deleted + rt.miner.ActEmptyBlock(rt.t) + case chal.StatusAsserterTimeout: + // call cancel challenge by challenger because output is already deleted + rt.txHash = rt.challenger2.ActCancelChallenge(rt.t, rt.outputIndex) + rt.includeL1BlockBySender(rt.challenger2.address) + default: + break interaction2 + } + + // check whether the submission was successful + rt.receipt, err = rt.miner.EthClient().TransactionReceipt(rt.t.Ctx(), rt.txHash) + require.NoError(rt.t, err) + require.Equal(rt.t, types.ReceiptStatusSuccessful, rt.receipt.Status, "failed to progress interactive fault proof") + } + + // check the status of challenge is StatusNone(0) + status, err := rt.colosseumContract.GetStatus(nil, rt.outputIndex, rt.challenger2.address) require.NoError(rt.t, err) - require.Equal(rt.t, big.NewInt(2*rt.dp.DeployConfig.ValidatorPoolRequiredBondAmount.ToInt().Int64()), bond.Amount) + require.Equal(rt.t, chal.StatusNone, status) + + if version == valhelper.ValidatorV1 { + // check pending bond amount refunded after challenge canceled + balance, err := rt.valPoolContract.BalanceOf(nil, rt.challenger2.address) + require.NoError(rt.t, err) + require.Equal(rt.t, balance.Int64(), int64(defaultDepositAmount)) + } else if version == valhelper.ValidatorV2 { + // check bond amount released after challenge canceled + _, _, _, bond, _ := rt.fetchValidatorStatus(rt.challenger2) + require.Equal(t, uint64(0), bond.Uint64()) + } } diff --git a/op-e2e/actions/l2_runtime.go b/op-e2e/actions/l2_runtime.go index 907475e7d9..389f1f9181 100644 --- a/op-e2e/actions/l2_runtime.go +++ b/op-e2e/actions/l2_runtime.go @@ -5,22 +5,26 @@ import ( "math/big" "testing" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/sources" + "github.com/ethereum-optimism/optimism/op-service/testlog" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" "github.com/stretchr/testify/require" - e2e "github.com/ethereum-optimism/optimism/op-e2e" - "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" - "github.com/ethereum-optimism/optimism/op-service/eth" - "github.com/ethereum-optimism/optimism/op-service/sources" - "github.com/ethereum-optimism/optimism/op-service/testlog" "github.com/kroma-network/kroma/kroma-bindings/bindings" + val "github.com/kroma-network/kroma/kroma-validator" + valhelper "github.com/kroma-network/kroma/op-e2e/e2eutils/validator" ) const defaultDepositAmount = 1_000 -// [Kroma: START] +var defaultValPoolTerminationIndex = common.Big2 + +// These definitions are moved from l1_replica_test.go file. var defaultRollupTestParams = &e2eutils.TestParams{ MaxSequencerDrift: 40, SequencerWindowSize: 120, @@ -30,8 +34,6 @@ var defaultRollupTestParams = &e2eutils.TestParams{ var defaultAlloc = &e2eutils.AllocParams{PrefundTestUsers: true} -// [Kroma: END] - type Runtime struct { t StatefulTesting l log.Logger @@ -49,6 +51,9 @@ type Runtime struct { colosseumContract *bindings.Colosseum securityCouncilContract *bindings.SecurityCouncil valPoolContract *bindings.ValidatorPoolCaller + valMgrContract *bindings.ValidatorManagerCaller + assetMgrContract *bindings.AssetManagerCaller + assetTokenContract *bindings.GovernanceTokenCaller targetInvalidBlockNumber uint64 outputIndex *big.Int outputOnL1 bindings.TypesCheckpointOutput @@ -59,11 +64,11 @@ type Runtime struct { type SetupSequencerTestFunc = func(t Testing, sd *e2eutils.SetupData, log log.Logger) (*L1Miner, *L2Engine, *L2Sequencer) -// defaultRuntime is currently only used for l2_challenger_test -func defaultRuntime(gt *testing.T, setupSequencerTest SetupSequencerTestFunc) Runtime { +// defaultRuntime is currently only used for l2_challenger_test. +func defaultRuntime(gt *testing.T, setupSequencerTest SetupSequencerTestFunc, deltaTimeOffset *hexutil.Uint64) Runtime { t := NewDefaultTesting(gt) dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - dp.DeployConfig.ColosseumDummyHash = common.HexToHash(e2e.DummyHashDev) + dp.DeployConfig.L2GenesisDeltaTimeOffset = deltaTimeOffset sd := e2eutils.Setup(t, dp, defaultAlloc) l := testlog.Logger(t, log.LvlDebug) rt := Runtime{ @@ -91,71 +96,67 @@ func (rt *Runtime) setTargetInvalidBlockNumber(targetInvalidBlockNumber uint64) rt.targetInvalidBlockNumber = targetInvalidBlockNumber } -func (rt *Runtime) setupHonestValidator() { - rt.validator = rt.honestValidator(rt.dp.Secrets.TrustedValidator) +func (rt *Runtime) setupHonestValidator(setInvalidBlockNumber bool) { + rt.validator = rt.setupValidator(rt.dp.Secrets.TrustedValidator, setInvalidBlockNumber, false) } func (rt *Runtime) setupMaliciousValidator() { - rt.validator = rt.maliciousValidator(rt.dp.Secrets.TrustedValidator) + rt.validator = rt.setupValidator(rt.dp.Secrets.TrustedValidator, true, true) } func (rt *Runtime) setupHonestChallenger1() { - rt.challenger1 = rt.honestValidator(rt.dp.Secrets.Challenger1) + rt.challenger1 = rt.setupValidator(rt.dp.Secrets.Challenger1, true, false) } func (rt *Runtime) setupHonestChallenger2() { - rt.challenger2 = rt.honestValidator(rt.dp.Secrets.Challenger2) + rt.challenger2 = rt.setupValidator(rt.dp.Secrets.Challenger2, true, false) } func (rt *Runtime) setupMaliciousChallenger1() { - rt.challenger1 = rt.maliciousValidator(rt.dp.Secrets.Challenger1) + rt.challenger1 = rt.setupValidator(rt.dp.Secrets.Challenger1, true, true) } func (rt *Runtime) setupMaliciousChallenger2() { - rt.challenger2 = rt.maliciousValidator(rt.dp.Secrets.Challenger2) + rt.challenger2 = rt.setupValidator(rt.dp.Secrets.Challenger2, true, true) } func (rt *Runtime) setupHonestGuardian() { - rt.guardian = rt.honestValidator(rt.dp.Secrets.Challenger1) + rt.guardian = rt.setupValidator(rt.dp.Secrets.Guardian, true, false) } func (rt *Runtime) setupMaliciousGuardian() { - rt.guardian = rt.maliciousValidator(rt.dp.Secrets.Challenger1) -} - -func (rt *Runtime) honestValidator(pk *ecdsa.PrivateKey) *L2Validator { - // setup mockup rpc for returning valid output - validatorRPC := e2eutils.NewHonestL2RPC(rt.sequencer.RPCClient()) - validatorRollupClient := sources.NewRollupClient(validatorRPC) - validator := NewL2Validator(rt.t, rt.l, &ValidatorCfg{ - OutputOracleAddr: rt.sd.DeploymentsL1.L2OutputOracleProxy, - ValidatorPoolAddr: rt.sd.DeploymentsL1.ValidatorPoolProxy, - ColosseumAddr: rt.sd.DeploymentsL1.ColosseumProxy, - SecurityCouncilAddr: rt.sd.DeploymentsL1.SecurityCouncilProxy, - ValidatorKey: pk, - AllowNonFinalized: false, - }, rt.miner.EthClient(), rt.seqEngine.EthClient(), validatorRollupClient) - validatorRPC.SetTargetBlockNumber(rt.targetInvalidBlockNumber) - return validator + rt.guardian = rt.setupValidator(rt.dp.Secrets.Guardian, true, true) } -func (rt *Runtime) maliciousValidator(pk *ecdsa.PrivateKey) *L2Validator { - // setup mockup rpc for returning invalid output - validatorRPC := e2eutils.NewMaliciousL2RPC(rt.sequencer.RPCClient()) - validatorRollupClient := sources.NewRollupClient(validatorRPC) +func (rt *Runtime) setupValidator(pk *ecdsa.PrivateKey, setInvalidBlockNumber bool, isMalicious bool) *L2Validator { + var validatorRollupClient *sources.RollupClient + if isMalicious { + // setup mockup rpc for returning invalid output + validatorRPC := e2eutils.NewMaliciousL2RPC(rt.sequencer.RPCClient()) + validatorRPC.SetTargetBlockNumber(rt.targetInvalidBlockNumber) + validatorRollupClient = sources.NewRollupClient(validatorRPC) + } else { + // setup mockup rpc for returning valid output + validatorRPC := e2eutils.NewHonestL2RPC(rt.sequencer.RPCClient()) + if setInvalidBlockNumber { + validatorRPC.SetTargetBlockNumber(rt.targetInvalidBlockNumber) + } + validatorRollupClient = sources.NewRollupClient(validatorRPC) + } validator := NewL2Validator(rt.t, rt.l, &ValidatorCfg{ - OutputOracleAddr: rt.sd.DeploymentsL1.L2OutputOracleProxy, - ValidatorPoolAddr: rt.sd.DeploymentsL1.ValidatorPoolProxy, - ColosseumAddr: rt.sd.DeploymentsL1.ColosseumProxy, - SecurityCouncilAddr: rt.sd.DeploymentsL1.SecurityCouncilProxy, - ValidatorKey: pk, - AllowNonFinalized: false, + OutputOracleAddr: rt.sd.DeploymentsL1.L2OutputOracleProxy, + ValidatorPoolAddr: rt.sd.DeploymentsL1.ValidatorPoolProxy, + ValidatorManagerAddr: rt.sd.DeploymentsL1.ValidatorManagerProxy, + AssetManagerAddr: rt.sd.DeploymentsL1.AssetManagerProxy, + ColosseumAddr: rt.sd.DeploymentsL1.ColosseumProxy, + SecurityCouncilAddr: rt.sd.DeploymentsL1.SecurityCouncilProxy, + ValidatorKey: pk, + AllowNonFinalized: false, }, rt.miner.EthClient(), rt.seqEngine.EthClient(), validatorRollupClient) - validatorRPC.SetTargetBlockNumber(rt.targetInvalidBlockNumber) return validator } -func (rt *Runtime) bindChallengeContracts() { +func (rt *Runtime) bindContracts() { var err error // bind contracts rt.outputOracleContract, err = bindings.NewL2OutputOracle(rt.sd.DeploymentsL1.L2OutputOracleProxy, rt.miner.EthClient()) @@ -169,47 +170,60 @@ func (rt *Runtime) bindChallengeContracts() { rt.valPoolContract, err = bindings.NewValidatorPoolCaller(rt.sd.DeploymentsL1.ValidatorPoolProxy, rt.miner.EthClient()) require.NoError(rt.t, err) + + rt.valMgrContract, err = bindings.NewValidatorManagerCaller(rt.sd.DeploymentsL1.ValidatorManagerProxy, rt.miner.EthClient()) + require.NoError(rt.t, err) + + rt.assetMgrContract, err = bindings.NewAssetManagerCaller(rt.sd.DeploymentsL1.AssetManagerProxy, rt.miner.EthClient()) + require.NoError(rt.t, err) + + assetTokenAddr, err := rt.assetMgrContract.ASSETTOKEN(nil) + require.NoError(rt.t, err) + rt.assetTokenContract, err = bindings.NewGovernanceTokenCaller(assetTokenAddr, rt.miner.EthClient()) + require.NoError(rt.t, err) } -// setupOutputSubmitted sets output submission by validator -func (rt *Runtime) setupOutputSubmitted() { +// assertRedeployValPoolToTerminate redeploys and upgrades ValidatorPool to change the termination index. +// It also asserts that the deploying and upgrade tx is successful. +func (rt *Runtime) assertRedeployValPoolToTerminate(newTerminationIndex *big.Int) { + deployTx, upgradeTx, err := e2eutils.RedeployValPoolToTerminate( + rt.t.Ctx(), + newTerminationIndex, + rt.miner.EthClient(), + rt.dp.Secrets, + rt.sd.RollupCfg.L1ChainID, + rt.sd.DeploymentsL1, + rt.dp.DeployConfig, + ) + require.NoError(rt.t, err) + + // Check deploy tx submission was successful + rt.includeL1BlockByTx(deployTx.Hash()) + receipt, err := rt.miner.EthClient().TransactionReceipt(rt.t.Ctx(), deployTx.Hash()) + require.NoError(rt.t, err) + require.Equal(rt.t, types.ReceiptStatusSuccessful, receipt.Status, "deploy tx submission failed") + + // Check upgrade tx submission was successful + rt.includeL1BlockByTx(upgradeTx.Hash()) + receipt, err = rt.miner.EthClient().TransactionReceipt(rt.t.Ctx(), upgradeTx.Hash()) + require.NoError(rt.t, err) + require.Equal(rt.t, types.ReceiptStatusSuccessful, receipt.Status, "upgrade tx submission failed") +} + +// setupOutputSubmitted sets output submission by validator. +func (rt *Runtime) setupOutputSubmitted(version uint8) { // NOTE(chokobole): It is necessary to wait for one finalized (or safe if AllowNonFinalized // config is set) block to pass after each submission interval before submitting the output // root. For example, if the submission interval is set to 1800 blocks, the output root can // only be submitted at 1801 finalized blocks. In fact, the following code is designed to // create one or more finalized L2 blocks in order to pass the test. If Proto Dank Sharding // is introduced, the below code fix may no longer be necessary. - for i := 0; i < 2; i++ { - // L1 block - rt.miner.ActEmptyBlock(rt.t) - // L2 block - rt.sequencer.ActL1HeadSignal(rt.t) - rt.sequencer.ActL2PipelineFull(rt.t) - rt.sequencer.ActBuildToL1Head(rt.t) - // submit and include in L1 - rt.batcher.ActSubmitAll(rt.t) - rt.IncludeL1Block(rt.dp.Addresses.Batcher) - // finalize the first and second L1 blocks, including the batch - rt.miner.ActL1SafeNext(rt.t) - rt.miner.ActL1SafeNext(rt.t) - rt.miner.ActL1FinalizeNext(rt.t) - rt.miner.ActL1FinalizeNext(rt.t) - // derive and see the L2 chain fully finalize - rt.sequencer.ActL2PipelineFull(rt.t) - rt.sequencer.ActL1SafeSignal(rt.t) - rt.sequencer.ActL1FinalizedSignal(rt.t) - } - - // deposit bond for validator - rt.validator.ActDeposit(rt.t, defaultDepositAmount) - rt.IncludeL1Block(rt.validator.address) + rt.proceedWithBlocks(3) - // check validator balance increased - bal, err := rt.valPoolContract.BalanceOf(nil, rt.validator.address) - require.NoError(rt.t, err) - require.Equal(rt.t, new(big.Int).SetUint64(defaultDepositAmount), bal) - - require.Equal(rt.t, rt.sequencer.SyncStatus().UnsafeL2, rt.sequencer.SyncStatus().FinalizedL2) + rt.depositToValPool(rt.validator) + if version == valhelper.ValidatorV2 { + rt.registerToValMgr(rt.validator) + } // create l2 output submission transactions until there is nothing left to submit for { @@ -217,24 +231,13 @@ func (rt *Runtime) setupOutputSubmitted() { if waitTime > 0 { break } - // and submit it to L1 - rt.validator.ActSubmitL2Output(rt.t) - // include output on L1 - rt.IncludeL1Block(rt.validator.address) - // Check submission was successful - receipt, err := rt.miner.EthClient().TransactionReceipt(rt.t.Ctx(), rt.validator.LastSubmitL2OutputTx()) - require.NoError(rt.t, err) - require.Equal(rt.t, types.ReceiptStatusSuccessful, receipt.Status, "submission failed") + rt.submitL2Output() } } -// setupChallenge sets challenge by challenger -func (rt *Runtime) setupChallenge(challenger *L2Validator) { +// setupChallenge sets challenge by challenger. +func (rt *Runtime) setupChallenge(challenger *L2Validator, version uint8) { // check that the output root that L1 stores is different from challenger's output root - // NOTE(chokobole): Comment these 2 lines because of the reason above. - // If Proto Dank Sharding is introduced, the below code fix may be restored. - // block := sequencer.SyncStatus().FinalizedL2 - // outputOnL1, err := outputOracleContract.GetL2OutputAfter(nil, new(big.Int).SetUint64(block.Number)) targetBlockNum := big.NewInt(int64(rt.targetInvalidBlockNumber)) var err error rt.outputIndex, err = rt.outputOracleContract.GetL2OutputIndexAfter(nil, targetBlockNum) @@ -247,20 +250,27 @@ func (rt *Runtime) setupChallenge(challenger *L2Validator) { outputComputed := challenger.fetchOutput(rt.t, rt.outputOnL1.L2BlockNumber) require.NotEqual(rt.t, eth.Bytes32(rt.outputOnL1.OutputRoot), outputComputed.OutputRoot, "output roots must different") - // deposit bond for challenger - challenger.ActDeposit(rt.t, defaultDepositAmount) - rt.IncludeL1Block(challenger.address) + if version == valhelper.ValidatorV1 { + rt.depositToValPool(challenger) - // check bond amount before create challenge - bond, err := rt.valPoolContract.GetBond(nil, rt.outputIndex) - require.NoError(rt.t, err) - require.Equal(rt.t, rt.dp.DeployConfig.ValidatorPoolRequiredBondAmount.ToInt(), bond.Amount) + // check bond amount before create challenge + bond, err := rt.valPoolContract.GetBond(nil, rt.outputIndex) + require.NoError(rt.t, err) + require.Equal(rt.t, rt.dp.DeployConfig.ValidatorPoolRequiredBondAmount.ToInt(), bond.Amount) + } else if version == valhelper.ValidatorV2 { + rt.registerToValMgr(challenger) + + // check bond amount before create challenge + bond, err := rt.assetMgrContract.TotalValidatorKroBonded(nil, challenger.address) + require.NoError(rt.t, err) + require.Equal(rt.t, uint64(0), bond.Uint64()) + } // submit create challenge tx rt.txHash = challenger.ActCreateChallenge(rt.t, rt.outputIndex) // include tx on L1 - rt.IncludeL1Block(challenger.address) + rt.includeL1BlockBySender(challenger.address) // Check whether the submission was successful rt.receipt, err = rt.miner.EthClient().TransactionReceipt(rt.t.Ctx(), rt.txHash) @@ -268,35 +278,108 @@ func (rt *Runtime) setupChallenge(challenger *L2Validator) { require.Equal(rt.t, types.ReceiptStatusSuccessful, rt.receipt.Status, "failed to create challenge") // check challenge created - challenge, err := rt.colosseumContract.GetChallenge(nil, rt.outputIndex, challenger.address) + challenge, err := rt.colosseumContract.Challenges(nil, rt.outputIndex, challenger.address) require.NoError(rt.t, err) require.NotNil(rt.t, challenge, "challenge not found") - // check pending bond amount after create challenge - pendingBond, err := rt.valPoolContract.GetPendingBond(nil, rt.outputIndex, challenger.address) + if version == valhelper.ValidatorV1 { + // check pending bond amount after create challenge + pendingBond, err := rt.valPoolContract.GetPendingBond(nil, rt.outputIndex, challenger.address) + require.NoError(rt.t, err) + require.Equal(rt.t, pendingBond, rt.dp.DeployConfig.ValidatorPoolRequiredBondAmount.ToInt()) + + // check challenger balance decreased + cBal, err := rt.valPoolContract.BalanceOf(nil, challenger.address) + require.NoError(rt.t, err) + require.Equal(rt.t, new(big.Int).Sub(new(big.Int).SetInt64(defaultDepositAmount), rt.dp.DeployConfig.ValidatorPoolRequiredBondAmount.ToInt()), cBal) + } else if version == valhelper.ValidatorV2 { + // check bond amount after create challenge + bond, err := rt.assetMgrContract.TotalValidatorKroBonded(nil, challenger.address) + require.NoError(rt.t, err) + require.Equal(rt.t, rt.dp.DeployConfig.AssetManagerBondAmount.ToInt().Uint64(), bond.Uint64()) + } +} + +func (rt *Runtime) depositToValPool(validator *L2Validator) { + // deposit bond for validator + validator.ActDeposit(rt.t, defaultDepositAmount) + rt.includeL1BlockBySender(validator.address) + + // check validator balance increased + bal, err := rt.valPoolContract.BalanceOf(nil, validator.address) require.NoError(rt.t, err) - require.Equal(rt.t, pendingBond, rt.dp.DeployConfig.ValidatorPoolRequiredBondAmount.ToInt()) + require.Equal(rt.t, new(big.Int).SetUint64(defaultDepositAmount), bal) +} + +func (rt *Runtime) registerToValMgr(validator *L2Validator) { + minActivateAmount := rt.dp.DeployConfig.ValidatorManagerMinActivateAmount.ToInt() + minActivateAmount = new(big.Int).Mul(minActivateAmount, common.Big256) + + // approve governance token + validator.ActApprove(rt.t, minActivateAmount) + rt.includeL1BlockBySender(validator.address) - // check challenger balance decreased - cBal, err := rt.valPoolContract.BalanceOf(nil, challenger.address) + // register validator + validator.ActRegisterValidator(rt.t, minActivateAmount) + rt.includeL1BlockBySender(validator.address) + + // check validator status is active + status := validator.getValidatorStatus(rt.t) + require.Equal(rt.t, val.StatusActive, status) +} + +// proceedWithBlocks proceeds n blocks. +func (rt *Runtime) proceedWithBlocks(n int) { + for i := 0; i < n; i++ { + // L1 block + rt.miner.ActEmptyBlock(rt.t) + // L2 block + rt.sequencer.ActL1HeadSignal(rt.t) + rt.sequencer.ActL2PipelineFull(rt.t) + rt.sequencer.ActBuildToL1Head(rt.t) + // submit and include in L1 + rt.batcher.ActSubmitAll(rt.t) + rt.includeL1BlockBySender(rt.dp.Addresses.Batcher) + // finalize the first and second L1 blocks, including the batch + rt.miner.ActL1SafeNext(rt.t) + rt.miner.ActL1SafeNext(rt.t) + rt.miner.ActL1FinalizeNext(rt.t) + rt.miner.ActL1FinalizeNext(rt.t) + // derive and see the L2 chain fully finalize + rt.sequencer.ActL2PipelineFull(rt.t) + rt.sequencer.ActL1SafeSignal(rt.t) + rt.sequencer.ActL1FinalizedSignal(rt.t) + } +} + +func (rt *Runtime) submitL2Output() { + // submit to L1 + rt.validator.ActSubmitL2Output(rt.t) + // include output on L1 + rt.includeL1BlockBySender(rt.validator.address) + // Check submission was successful + receipt, err := rt.miner.EthClient().TransactionReceipt(rt.t.Ctx(), rt.validator.LastSubmitL2OutputTx()) require.NoError(rt.t, err) - require.Equal(rt.t, new(big.Int).Sub(new(big.Int).SetInt64(defaultDepositAmount), rt.dp.DeployConfig.ValidatorPoolRequiredBondAmount.ToInt()), cBal) + require.Equal(rt.t, types.ReceiptStatusSuccessful, receipt.Status, "submission failed") } -// IsCreationEnded checks if the creation period of rt.outputIndex output is ended -func (rt *Runtime) IsCreationEnded() bool { - output, err := rt.outputOracleContract.GetL2Output(nil, rt.outputIndex) +func (rt *Runtime) fetchValidatorStatus(validator *L2Validator) (uint8, bool, *big.Int, *big.Int, *big.Int) { + valStatus := validator.getValidatorStatus(rt.t) + inJail := validator.isInJail(rt.t) + slashingAmount, err := rt.assetMgrContract.BONDAMOUNT(nil) + require.NoError(rt.t, err) + validatorAsset, err := rt.assetMgrContract.TotalValidatorKro(nil, validator.address) + require.NoError(rt.t, err) + validatorAssetBonded, err := rt.assetMgrContract.TotalValidatorKroBonded(nil, validator.address) require.NoError(rt.t, err) - ended := output.Timestamp.Uint64() + rt.dp.DeployConfig.ColosseumCreationPeriodSeconds - isEnded := rt.miner.l1Chain.CurrentBlock().Time > ended - return isEnded + return valStatus, inJail, validatorAsset, validatorAssetBonded, slashingAmount } -func (rt *Runtime) SetCreationPeriod(period uint64) { - rt.dp.DeployConfig.ColosseumCreationPeriodSeconds = period +func (rt *Runtime) includeL1BlockBySender(from common.Address) { + rt.miner.includeL1BlockBySender(rt.t, from, rt.l1BlockDelta) } -func (rt *Runtime) IncludeL1Block(from common.Address) { - rt.miner.includeL1Block(rt.t, from, rt.l1BlockDelta) +func (rt *Runtime) includeL1BlockByTx(txHash common.Hash) { + rt.miner.includeL1BlockByTx(rt.t, txHash, rt.l1BlockDelta) } diff --git a/op-e2e/actions/l2_validator.go b/op-e2e/actions/l2_validator.go index ce1cd425be..e47314fffe 100644 --- a/op-e2e/actions/l2_validator.go +++ b/op-e2e/actions/l2_validator.go @@ -6,7 +6,13 @@ import ( "math/big" "time" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" + kcrypto "github.com/ethereum-optimism/optimism/op-service/crypto" + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum-optimism/optimism/op-service/sources" + "github.com/ethereum-optimism/optimism/op-service/txmgr" "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" @@ -15,37 +21,36 @@ import ( "github.com/ethereum/go-ethereum/params" "github.com/stretchr/testify/require" - "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" - kcrypto "github.com/ethereum-optimism/optimism/op-service/crypto" - "github.com/ethereum-optimism/optimism/op-service/eth" - "github.com/ethereum-optimism/optimism/op-service/sources" - "github.com/ethereum-optimism/optimism/op-service/txmgr" "github.com/kroma-network/kroma/kroma-bindings/bindings" - "github.com/kroma-network/kroma/kroma-validator" + validator "github.com/kroma-network/kroma/kroma-validator" validatormetrics "github.com/kroma-network/kroma/kroma-validator/metrics" ) type ValidatorCfg struct { - OutputOracleAddr common.Address - ColosseumAddr common.Address - SecurityCouncilAddr common.Address - ValidatorPoolAddr common.Address - ValidatorKey *ecdsa.PrivateKey - AllowNonFinalized bool + OutputOracleAddr common.Address + ColosseumAddr common.Address + SecurityCouncilAddr common.Address + ValidatorPoolAddr common.Address + ValidatorManagerAddr common.Address + AssetManagerAddr common.Address + ValidatorKey *ecdsa.PrivateKey + AllowNonFinalized bool } type L2Validator struct { - log log.Logger - l1 *ethclient.Client - l2os *validator.L2OutputSubmitter - challenger *validator.Challenger - guardian *validator.Guardian - address common.Address - privKey *ecdsa.PrivateKey - l2ooContractAddr common.Address - valPoolContractAddr common.Address - lastTx common.Hash - cfg *validator.Config + log log.Logger + l1 *ethclient.Client + l2os *validator.L2OutputSubmitter + challenger *validator.Challenger + guardian *validator.Guardian + address common.Address + privKey *ecdsa.PrivateKey + l2ooContractAddr common.Address + valPoolContractAddr common.Address + valMgrContractAddr common.Address + assetManagerContractAddr common.Address + lastTx common.Hash + cfg *validator.Config } func NewL2Validator(t Testing, log log.Logger, cfg *ValidatorCfg, l1 *ethclient.Client, l2 *ethclient.Client, rollupCl *sources.RollupClient) *L2Validator { @@ -66,6 +71,8 @@ func NewL2Validator(t Testing, log log.Logger, cfg *ValidatorCfg, l1 *ethclient. validatorCfg := validator.Config{ L2OutputOracleAddr: cfg.OutputOracleAddr, ValidatorPoolAddr: cfg.ValidatorPoolAddr, + ValidatorManagerAddr: cfg.ValidatorManagerAddr, + AssetManagerAddr: cfg.AssetManagerAddr, ColosseumAddr: cfg.ColosseumAddr, SecurityCouncilAddr: cfg.SecurityCouncilAddr, ChallengerPollInterval: time.Second, @@ -106,19 +113,119 @@ func NewL2Validator(t Testing, log log.Logger, cfg *ValidatorCfg, l1 *ethclient. require.NoError(t, err) return &L2Validator{ - log: log, - l1: l1, - l2os: l2os, - challenger: challenger, - guardian: guardian, - address: from, - privKey: cfg.ValidatorKey, - l2ooContractAddr: cfg.OutputOracleAddr, - valPoolContractAddr: cfg.ValidatorPoolAddr, - cfg: &validatorCfg, + log: log, + l1: l1, + l2os: l2os, + challenger: challenger, + guardian: guardian, + address: from, + privKey: cfg.ValidatorKey, + l2ooContractAddr: cfg.OutputOracleAddr, + valPoolContractAddr: cfg.ValidatorPoolAddr, + valMgrContractAddr: cfg.ValidatorManagerAddr, + assetManagerContractAddr: cfg.AssetManagerAddr, + cfg: &validatorCfg, } } +func (v *L2Validator) CalculateWaitTime(t Testing) time.Duration { + nextBlockNumber, err := v.l2os.FetchNextBlockNumber(t.Ctx()) + require.NoError(t, err) + + outputIndex, err := v.l2os.FetchNextOutputIndex(t.Ctx()) + require.NoError(t, err) + + canSubmitOutput, err := v.l2os.CanSubmitOutput(t.Ctx(), outputIndex) + require.NoError(t, err) + require.True(t, canSubmitOutput) + + calculatedWaitTime := v.l2os.CalculateWaitTime(t.Ctx(), nextBlockNumber, outputIndex) + return calculatedWaitTime +} + +func (v *L2Validator) ActSubmitL2Output(t Testing) { + nextBlockNumber, err := v.l2os.FetchNextBlockNumber(t.Ctx()) + require.NoError(t, err) + + output, err := v.l2os.FetchOutput(t.Ctx(), nextBlockNumber) + require.NoError(t, err) + + txData, err := validator.SubmitL2OutputTxData(v.l2os.L2OOAbi(), output) + require.NoError(t, err) + + // Note: Use L1 instead of the output submitter's transaction manager because + // this is non-blocking while the txmgr is blocking & deadlocks the tests. + // Also set gasLimitMultiplier above 1 because finalization process sets state variables from 0 to value. + v.sendTx(t, &v.l2ooContractAddr, common.Big0, txData, 2) +} + +func (v *L2Validator) ActDeposit(t Testing, depositAmount uint64) { + valPoolABI, err := bindings.ValidatorPoolMetaData.GetAbi() + require.NoError(t, err) + + txData, err := valPoolABI.Pack("deposit") + require.NoError(t, err) + + v.sendTx(t, &v.valPoolContractAddr, new(big.Int).SetUint64(depositAmount), txData, 1) +} + +func (v *L2Validator) ActRegisterValidator(t Testing, assets *big.Int) { + valMgrABI, err := bindings.ValidatorManagerMetaData.GetAbi() + require.NoError(t, err) + + txData, err := valMgrABI.Pack( + "registerValidator", + assets, + uint8(10), + v.address, + ) + require.NoError(t, err) + + v.sendTx(t, &v.valMgrContractAddr, common.Big0, txData, 1) +} + +func (v *L2Validator) ActApprove(t Testing, assets *big.Int) { + assetManagerContract, err := bindings.NewAssetManagerCaller(v.assetManagerContractAddr, v.cfg.L1Client) + tokenAddr, err := assetManagerContract.ASSETTOKEN(&bind.CallOpts{}) + require.NoError(t, err) + + governanceTokenABI, err := bindings.GovernanceTokenMetaData.GetAbi() + require.NoError(t, err) + + txData, err := governanceTokenABI.Pack("approve", &v.assetManagerContractAddr, assets) + require.NoError(t, err) + + v.sendTx(t, &tokenAddr, common.Big0, txData, 1) +} + +func (v *L2Validator) fetchOutput(t Testing, blockNumber *big.Int) *eth.OutputResponse { + output, err := v.l2os.FetchOutput(t.Ctx(), blockNumber) + require.NoError(t, err) + + return output +} + +func (v *L2Validator) isValPoolTerminated(t Testing) bool { + outputIndex, err := v.l2os.FetchNextOutputIndex(t.Ctx()) + require.NoError(t, err) + + return v.l2os.IsValPoolTerminated(outputIndex) +} + +func (v *L2Validator) getValidatorStatus(t Testing) uint8 { + validatorStatus, err := v.l2os.GetValidatorStatus(t.Ctx()) + require.NoError(t, err) + + return validatorStatus +} + +func (v *L2Validator) isInJail(t Testing) bool { + inJail, err := v.l2os.IsInJail(t.Ctx()) + require.NoError(t, err) + + return inJail +} + // sendTx reimplements creating & sending transactions because we need to do the final send as async in // the action tests while we do it synchronously in the real system. func (v *L2Validator) sendTx(t Testing, toAddr *common.Address, txValue *big.Int, data []byte, gasLimitMultiplier float64) { @@ -161,45 +268,6 @@ func (v *L2Validator) sendTx(t Testing, toAddr *common.Address, txValue *big.Int v.lastTx = tx.Hash() } -func (v *L2Validator) CalculateWaitTime(t Testing) time.Duration { - nextBlockNumber, err := v.l2os.FetchNextBlockNumber(t.Ctx()) - require.NoError(t, err) - calculatedWaitTime := v.l2os.CalculateWaitTime(t.Ctx(), nextBlockNumber) - return calculatedWaitTime -} - -func (v *L2Validator) ActSubmitL2Output(t Testing) { - nextBlockNumber, err := v.l2os.FetchNextBlockNumber(t.Ctx()) - require.NoError(t, err) - - output, err := v.l2os.FetchOutput(t.Ctx(), nextBlockNumber) - require.NoError(t, err) - - txData, err := validator.SubmitL2OutputTxData(v.l2os.L2ooAbi(), output) - require.NoError(t, err) - - // Note: Use L1 instead of the output submitter's transaction manager because - // this is non-blocking while the txmgr is blocking & deadlocks the tests - v.sendTx(t, &v.l2ooContractAddr, common.Big0, txData, 1.5) -} - func (v *L2Validator) LastSubmitL2OutputTx() common.Hash { return v.lastTx } - -func (v *L2Validator) ActDeposit(t Testing, depositAmount uint64) { - valPoolABI, err := bindings.ValidatorPoolMetaData.GetAbi() - require.NoError(t, err) - - txData, err := valPoolABI.Pack("deposit") - require.NoError(t, err) - - v.sendTx(t, &v.valPoolContractAddr, new(big.Int).SetUint64(depositAmount), txData, 1) -} - -func (v *L2Validator) fetchOutput(t Testing, blockNumber *big.Int) *eth.OutputResponse { - output, err := v.l2os.FetchOutput(t.Ctx(), blockNumber) - require.NoError(t, err) - - return output -} diff --git a/op-e2e/actions/l2_validator_test.go b/op-e2e/actions/l2_validator_test.go index 4ea9f885c6..92990d2c11 100644 --- a/op-e2e/actions/l2_validator_test.go +++ b/op-e2e/actions/l2_validator_test.go @@ -1,18 +1,16 @@ package actions import ( + "math/big" "testing" + "github.com/ethereum-optimism/optimism/op-service/eth" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/log" "github.com/stretchr/testify/require" - "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" - "github.com/ethereum-optimism/optimism/op-service/eth" - "github.com/ethereum-optimism/optimism/op-service/testlog" "github.com/kroma-network/kroma/kroma-bindings/bindings" + "github.com/kroma-network/kroma/op-e2e/e2eutils/validator" ) // TestValidatorBatchType run each validator-related test case in singular batch mode and span batch mode. @@ -21,7 +19,8 @@ func TestValidatorBatchType(t *testing.T) { name string f func(gt *testing.T, deltaTimeOffset *hexutil.Uint64) }{ - {"RunValidatorTest", RunValidatorTest}, + {"RunValidatorPoolTest", RunValidatorPoolTest}, + {"RunValidatorManagerTest", RunValidatorManagerTest}, } for _, test := range tests { test := test @@ -39,75 +38,64 @@ func TestValidatorBatchType(t *testing.T) { } } -func RunValidatorTest(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { - t := NewDefaultTesting(gt) - dp := e2eutils.MakeDeployParams(t, defaultRollupTestParams) - dp.DeployConfig.L2GenesisDeltaTimeOffset = deltaTimeOffset - sd := e2eutils.Setup(t, dp, defaultAlloc) - log := testlog.Logger(t, log.LevelDebug) - miner, seqEngine, sequencer := setupSequencerTest(t, sd, log) - - rollupSeqCl := sequencer.RollupClient() - batcher := NewL2Batcher(log, sd.RollupCfg, DefaultBatcherCfg(dp), - rollupSeqCl, miner.EthClient(), seqEngine.EthClient(), seqEngine.EngineClient(t, sd.RollupCfg)) - - validator := NewL2Validator(t, log, &ValidatorCfg{ - OutputOracleAddr: sd.DeploymentsL1.L2OutputOracleProxy, - ValidatorPoolAddr: sd.DeploymentsL1.ValidatorPoolProxy, - ColosseumAddr: sd.DeploymentsL1.ColosseumProxy, - SecurityCouncilAddr: sd.DeploymentsL1.SecurityCouncilProxy, - ValidatorKey: dp.Secrets.TrustedValidator, - AllowNonFinalized: false, - }, miner.EthClient(), seqEngine.EthClient(), sequencer.RollupClient()) - - // L1 block - miner.ActEmptyBlock(t) - // L2 block - sequencer.ActL1HeadSignal(t) - sequencer.ActL2PipelineFull(t) - sequencer.ActBuildToL1Head(t) - // submit and include in L1 - batcher.ActSubmitAll(t) - miner.includeL1Block(t, dp.Addresses.Batcher, 12) - // finalize the first and second L1 blocks, including the batch - miner.ActL1SafeNext(t) - miner.ActL1SafeNext(t) - miner.ActL1FinalizeNext(t) - miner.ActL1FinalizeNext(t) - // derive and see the L2 chain fully finalize - sequencer.ActL2PipelineFull(t) - sequencer.ActL1SafeSignal(t) - sequencer.ActL1FinalizedSignal(t) - - // deposit bond for validator - validator.ActDeposit(t, 1_000) - miner.includeL1Block(t, validator.address, 12) - - require.Equal(t, sequencer.SyncStatus().UnsafeL2, sequencer.SyncStatus().FinalizedL2) +func RunValidatorPoolTest(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { + rt := defaultRuntime(gt, setupSequencerTest, deltaTimeOffset) + rt.setupHonestValidator(false) + + // bind contracts + rt.bindContracts() + + // submit outputs + rt.setupOutputSubmitted(validator.ValidatorV1) + + checkRightOutputSubmitted(rt.t, rt.outputOracleContract, rt.sequencer, rt.seqEngine) +} + +func RunValidatorManagerTest(gt *testing.T, deltaTimeOffset *hexutil.Uint64) { + rt := defaultRuntime(gt, setupSequencerTest, deltaTimeOffset) + + // Redeploy and upgrade ValidatorPool to set the termination index to a smaller value for ValidatorManager test + rt.assertRedeployValPoolToTerminate(defaultValPoolTerminationIndex) + + rt.setupHonestValidator(false) + + // bind contracts + rt.bindContracts() + + rt.proceedWithBlocks(6) + + rt.depositToValPool(rt.validator) + + // Submit outputs to ValidatorPool until newTerminationIndex + for i := uint64(0); new(big.Int).SetUint64(i).Cmp(defaultValPoolTerminationIndex) <= 0; i++ { + rt.submitL2Output() + } + + // assert if the ValidatorPool is terminated + isValPoolTerminated := rt.validator.isValPoolTerminated(rt.t) + require.True(rt.t, isValPoolTerminated, "ValPool should be terminated") + + rt.registerToValMgr(rt.validator) + // create l2 output submission transactions until there is nothing left to submit + submitAfterTransition := false for { - waitTime := validator.CalculateWaitTime(t) + waitTime := rt.validator.CalculateWaitTime(rt.t) if waitTime > 0 { break } - // and submit it to L1 - validator.ActSubmitL2Output(t) - // include output on L1 - miner.includeL1Block(t, validator.address, 12) - miner.ActEmptyBlock(t) - // Check submission was successful - receipt, err := miner.EthClient().TransactionReceipt(t.Ctx(), validator.LastSubmitL2OutputTx()) - require.NoError(t, err) - require.Equal(t, types.ReceiptStatusSuccessful, receipt.Status, "submission failed") + rt.submitL2Output() + submitAfterTransition = true } - // check that L1 stored the expected output root - outputOracleContract, err := bindings.NewL2OutputOracle(sd.DeploymentsL1.L2OutputOracleProxy, miner.EthClient()) - require.NoError(t, err) - // NOTE(chokobole): Comment these 2 lines because of the reason above. - // If Proto Dank Sharding is introduced, the below code fix may be restored. - // block := sequencer.SyncStatus().FinalizedL2 - // outputOnL1, err := outputOracleContract.GetL2OutputAfter(nil, new(big.Int).SetUint64(block.Number)) + // Assert validator submitted at least one output after transition + require.True(rt.t, submitAfterTransition) + + checkRightOutputSubmitted(rt.t, rt.outputOracleContract, rt.sequencer, rt.seqEngine) +} + +// checkRightOutputSubmitted checks that L1 stored the expected output root +func checkRightOutputSubmitted(t StatefulTesting, outputOracleContract *bindings.L2OutputOracle, sequencer *L2Sequencer, seqEngine *L2Engine) { blockNum, err := outputOracleContract.LatestBlockNumber(&bind.CallOpts{}) require.NoError(t, err) outputOnL1, err := outputOracleContract.GetL2OutputAfter(&bind.CallOpts{}, blockNum) diff --git a/op-e2e/actions/user_test.go b/op-e2e/actions/user_test.go index 2c0af3605c..ae54f8da66 100644 --- a/op-e2e/actions/user_test.go +++ b/op-e2e/actions/user_test.go @@ -5,13 +5,12 @@ import ( "math/rand" "testing" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" + "github.com/ethereum-optimism/optimism/op-service/testlog" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" "github.com/stretchr/testify/require" - - "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" - "github.com/ethereum-optimism/optimism/op-service/testlog" ) type hardforkScheduledTest struct { @@ -132,18 +131,21 @@ func runCrossLayerUserTest(gt *testing.T, test hardforkScheduledTest) { require.Equal(t, dp.Secrets.Addresses().Batcher, dp.DeployConfig.BatchSenderAddress) require.Equal(t, dp.Secrets.Addresses().TrustedValidator, dp.DeployConfig.ValidatorPoolTrustedValidator) + require.Equal(t, dp.Secrets.Addresses().TrustedValidator, dp.DeployConfig.ValidatorManagerTrustedValidator) miner, seqEngine, seq := setupSequencerTest(t, sd, log) batcher := NewL2Batcher(log, sd.RollupCfg, DefaultBatcherCfg(dp), seq.RollupClient(), miner.EthClient(), seqEngine.EthClient(), seqEngine.EngineClient(t, sd.RollupCfg)) validator := NewL2Validator(t, log, &ValidatorCfg{ - OutputOracleAddr: sd.DeploymentsL1.L2OutputOracleProxy, - ValidatorPoolAddr: sd.DeploymentsL1.ValidatorPoolProxy, - ColosseumAddr: sd.DeploymentsL1.ColosseumProxy, - SecurityCouncilAddr: sd.DeploymentsL1.SecurityCouncilProxy, - ValidatorKey: dp.Secrets.TrustedValidator, - AllowNonFinalized: true, + OutputOracleAddr: sd.DeploymentsL1.L2OutputOracleProxy, + ValidatorPoolAddr: sd.DeploymentsL1.ValidatorPoolProxy, + ValidatorManagerAddr: sd.DeploymentsL1.ValidatorManagerProxy, + AssetManagerAddr: sd.DeploymentsL1.AssetManagerProxy, + ColosseumAddr: sd.DeploymentsL1.ColosseumProxy, + SecurityCouncilAddr: sd.DeploymentsL1.SecurityCouncilProxy, + ValidatorKey: dp.Secrets.TrustedValidator, + AllowNonFinalized: true, }, miner.EthClient(), seqEngine.EthClient(), seq.RollupClient()) // need to start derivation before we can make L2 blocks @@ -258,7 +260,7 @@ func runCrossLayerUserTest(gt *testing.T, test hardforkScheduledTest) { seq.ActL2PipelineFull(t) validator.ActDeposit(t, 1000) - miner.includeL1Block(t, dp.Addresses.TrustedValidator, 12) + miner.includeL1BlockBySender(t, dp.Addresses.TrustedValidator, 12) // create l2 output submission transactions until there is nothing left to submit for { @@ -269,8 +271,7 @@ func runCrossLayerUserTest(gt *testing.T, test hardforkScheduledTest) { // submit it to L1 validator.ActSubmitL2Output(t) // include output on L1 - miner.includeL1Block(t, dp.Addresses.TrustedValidator, 12) - miner.ActEmptyBlock(t) + miner.includeL1BlockBySender(t, dp.Addresses.TrustedValidator, 12) // Check submission was successful receipt, err := miner.EthClient().TransactionReceipt(t.Ctx(), validator.LastSubmitL2OutputTx()) require.NoError(t, err) diff --git a/op-e2e/bridge_test.go b/op-e2e/bridge_test.go index 454509d77f..e73915ba05 100644 --- a/op-e2e/bridge_test.go +++ b/op-e2e/bridge_test.go @@ -5,22 +5,20 @@ import ( "math" "math/big" "testing" - "time" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/receipts" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/transactions" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" + "github.com/ethereum-optimism/optimism/op-node/rollup/derive" + "github.com/ethereum-optimism/optimism/op-service/testlog" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/params" "github.com/stretchr/testify/require" - "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/receipts" - "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/transactions" - "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" - "github.com/ethereum-optimism/optimism/op-node/rollup/derive" - "github.com/ethereum-optimism/optimism/op-service/testlog" "github.com/kroma-network/kroma/kroma-bindings/bindings" "github.com/kroma-network/kroma/kroma-bindings/predeploys" - "github.com/kroma-network/kroma/op-e2e/e2eutils/geth" ) // TestERC20BridgeDeposits tests the the L1StandardBridge bridge ERC20 @@ -112,151 +110,3 @@ func TestERC20BridgeDeposits(t *testing.T) { require.NoError(t, err) require.Equal(t, l2Balance, big.NewInt(100)) } - -// TestBridgeGovernanceToken tests the L1StandardBridge bridge GovernanceToken -// functionality. -func TestBridgeGovernanceToken(t *testing.T) { - // TODO(pangssu): Enable testing when the GovernanceToken contract is ready. - t.Skip("Skip because initial mint is not implemented") - - InitParallel(t) - - cfg := DefaultSystemConfig(t) - - sys, err := cfg.Start(t) - require.Nil(t, err, "Error starting up system") - defer sys.Close() - - log := testlog.Logger(t, log.LvlInfo) - log.Info("genesis", "l2", sys.RollupConfig.Genesis.L2, "l1", sys.RollupConfig.Genesis.L1, "l2_time", sys.RollupConfig.Genesis.L2Time) - - l1Client := sys.Clients["l1"] - l2Client := sys.Clients["sequencer"] - - l1TokenAddr := sys.Cfg.L1Deployments.L1GovernanceTokenProxy - l1BridgeAddr := cfg.L1Deployments.L1StandardBridgeProxy - l2TokenAddr := predeploys.GovernanceTokenAddr - l2BridgeAddr := predeploys.L2StandardBridgeAddr - - l1Opts, err := bind.NewKeyedTransactorWithChainID(sys.Cfg.Secrets.Bob, cfg.L1ChainIDBig()) - require.Nil(t, err) - l2Opts, err := bind.NewKeyedTransactorWithChainID(sys.Cfg.Secrets.Bob, cfg.L2ChainIDBig()) - require.Nil(t, err) - - // Init bridge contracts - l1Bridge, err := bindings.NewL1StandardBridge(l1BridgeAddr, l1Client) - require.NoError(t, err) - l2Bridge, err := bindings.NewL2StandardBridge(l2BridgeAddr, l2Client) - require.NoError(t, err) - - // Init token contracts - l1Token, err := bindings.NewGovernanceToken(l1TokenAddr, l1Client) - require.NoError(t, err) - l2Token, err := bindings.NewGovernanceToken(l2TokenAddr, l2Client) - require.NoError(t, err) - - // Approve GovernanceToken with the bridge on L1 and L2 - tx, err := l1Token.Approve(l1Opts, l1BridgeAddr, new(big.Int).SetUint64(math.MaxUint64)) - require.NoError(t, err) - _, err = wait.ForReceiptOK(context.Background(), l1Client, tx.Hash()) - require.NoError(t, err) - tx, err = l2Token.Approve(l2Opts, l2BridgeAddr, new(big.Int).SetUint64(math.MaxUint64)) - require.NoError(t, err) - _, err = wait.ForReceiptOK(context.Background(), l2Client, tx.Hash()) - require.NoError(t, err) - - // Wait until Alice have enough tokens on L2 - _, err = geth.WaitForBlock(big.NewInt(10), l2Client, 20*time.Second) - require.NoError(t, err) - aliceL2Opts, err := bind.NewKeyedTransactorWithChainID(cfg.Secrets.Alice, cfg.L2ChainIDBig()) - require.Nil(t, err) - bridgeAmount, err := l2Token.BalanceOf(&bind.CallOpts{}, aliceL2Opts.From) - require.NoError(t, err) - require.NotZero(t, bridgeAmount.Uint64()) - - // Send Alice's tokens to Bob - tx, err = transactions.PadGasEstimate(aliceL2Opts, 1.1, func(opts *bind.TransactOpts) (*types.Transaction, error) { - return l2Token.Transfer(opts, l2Opts.From, bridgeAmount) - }) - require.NoError(t, err) - _, err = wait.ForReceiptOK(context.Background(), l2Client, tx.Hash()) - require.NoError(t, err) - - bobL1Balance, err := l1Token.BalanceOf(&bind.CallOpts{}, l1Opts.From) - require.NoError(t, err) - require.Zero(t, bobL1Balance.Uint64()) - bobL2Balance, err := l2Token.BalanceOf(&bind.CallOpts{}, l2Opts.From) - require.NoError(t, err) - require.Equal(t, bobL2Balance, bridgeAmount) - - l1Supply, err := l1Token.TotalSupply(&bind.CallOpts{}) - require.NoError(t, err) - - // Withdraw GovernanceToken to L1 - tx, err = transactions.PadGasEstimate(l2Opts, 1.1, func(opts *bind.TransactOpts) (*types.Transaction, error) { - return l2Bridge.BridgeERC20(opts, l2TokenAddr, l1TokenAddr, bridgeAmount, 100000, []byte{}) - }) - require.NoError(t, err) - receipt, err := wait.ForReceiptOK(context.Background(), l2Client, tx.Hash()) - require.NoError(t, err) - proveReceipt, finalizeReceipt := ProveAndFinalizeWithdrawal(t, cfg, sys, "verifier", cfg.Secrets.Bob, receipt) - require.Equal(t, types.ReceiptStatusSuccessful, proveReceipt.Status) - require.Equal(t, types.ReceiptStatusSuccessful, finalizeReceipt.Status) - - // Withdrawal complete, Bob's token balance increases on L1. - newBobL1Balance, err := l1Token.BalanceOf(&bind.CallOpts{}, l1Opts.From) - require.NoError(t, err) - require.Equal(t, bobL1Balance.Add(bobL1Balance, bridgeAmount).Cmp(newBobL1Balance), 0) - // Bob's token balance decreases on L2. - newBobL2Balance, err := l2Token.BalanceOf(&bind.CallOpts{}, l2Opts.From) - require.NoError(t, err) - require.Equal(t, bobL2Balance.Sub(bobL2Balance, bridgeAmount).Cmp(newBobL2Balance), 0) - // Total supply increases on L1. - newL1Supply, err := l1Token.TotalSupply(&bind.CallOpts{}) - require.NoError(t, err) - require.Equal(t, l1Supply.Add(l1Supply, bridgeAmount).Cmp(newL1Supply), 0) - // It's difficult to verify the exact decrease in token total supply on L2, - // as the issuance amount increases with each block - - // Deposit GovernanceToken to L2 - tx, err = transactions.PadGasEstimate(l1Opts, 1.1, func(opts *bind.TransactOpts) (*types.Transaction, error) { - return l1Bridge.BridgeERC20(opts, l1TokenAddr, l2TokenAddr, bridgeAmount, 100000, []byte{}) - }) - require.NoError(t, err) - depositReceipt, err := wait.ForReceiptOK(context.Background(), l1Client, tx.Hash()) - require.NoError(t, err) - - t.Log("Deposit through L1StandardBridge", "gas used", depositReceipt.GasUsed) - - // compute the deposit transaction hash + poll for it - portal, err := bindings.NewKromaPortal(cfg.L1Deployments.KromaPortalProxy, l1Client) - require.NoError(t, err) - - depIt, err := portal.FilterTransactionDeposited(&bind.FilterOpts{Start: 0}, nil, nil, nil) - require.NoError(t, err) - var depositEvent *bindings.KromaPortalTransactionDeposited - for depIt.Next() { - depositEvent = depIt.Event - } - require.NotNil(t, depositEvent) - - depositTx, err := derive.UnmarshalDepositLogEvent(&depositEvent.Raw) - require.NoError(t, err) - _, err = wait.ForReceiptOK(context.Background(), l2Client, types.NewTx(depositTx).Hash()) - require.NoError(t, err) - - // Deposit complete, Bob's token balance decreases on L1. - newBobL1Balance, err = l1Token.BalanceOf(&bind.CallOpts{}, l1Opts.From) - require.NoError(t, err) - require.Equal(t, bobL1Balance.Sub(bobL1Balance, bridgeAmount).Cmp(newBobL1Balance), 0) - // Bob's token balance increases on L2. - newBobL2Balance, err = l2Token.BalanceOf(&bind.CallOpts{}, l2Opts.From) - require.NoError(t, err) - require.Equal(t, bobL2Balance.Add(bobL2Balance, bridgeAmount).Cmp(newBobL2Balance), 0) - // Total supply decreases on L1. - newL1Supply, err = l1Token.TotalSupply(&bind.CallOpts{}) - require.NoError(t, err) - require.Equal(t, l1Supply.Sub(l1Supply, bridgeAmount).Cmp(newL1Supply), 0) - // It's difficult to verify the exact increase in token total supply on L2, - // as the issuance amount increases with each block -} diff --git a/op-e2e/config/init.go b/op-e2e/config/init.go index d8766d7fc5..ed5bf28c4e 100644 --- a/op-e2e/config/init.go +++ b/op-e2e/config/init.go @@ -10,15 +10,14 @@ import ( "testing" "time" - "golang.org/x/exp/slog" - + "github.com/ethereum-optimism/optimism/op-e2e/external" + op_service "github.com/ethereum-optimism/optimism/op-service" + oplog "github.com/ethereum-optimism/optimism/op-service/log" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core/state" "github.com/ethereum/go-ethereum/log" + "golang.org/x/exp/slog" - "github.com/ethereum-optimism/optimism/op-e2e/external" - op_service "github.com/ethereum-optimism/optimism/op-service" - oplog "github.com/ethereum-optimism/optimism/op-service/log" "github.com/kroma-network/kroma/kroma-chain-ops/genesis" ) @@ -128,6 +127,7 @@ func init() { DeployConfig.L2BlockTime = 1 // [Kroma: START] DeployConfig.ValidatorPoolRoundDuration = DeployConfig.L2OutputOracleSubmissionInterval * DeployConfig.L2BlockTime / 2 + DeployConfig.ValidatorManagerRoundDurationSeconds = DeployConfig.L2OutputOracleSubmissionInterval * DeployConfig.L2BlockTime / 2 // [Kroma: END] if L1Deployments != nil { diff --git a/op-e2e/constants.go b/op-e2e/constants.go deleted file mode 100644 index d44567751c..0000000000 --- a/op-e2e/constants.go +++ /dev/null @@ -1,6 +0,0 @@ -package op_e2e - -const ( - DummyHashSepolia = "0xaf01bc158f9b35867aea1517e84cf67eedc6a397c0df380b4b139eb570ddb2fc" - DummyHashDev = "0xa1235b834d6f1f78f78bc4db856fbc49302cce2c519921347600693021e087f7" -) diff --git a/op-e2e/e2eutils/geth/wait.go b/op-e2e/e2eutils/geth/wait.go index d36f509bfc..76398178ac 100644 --- a/op-e2e/e2eutils/geth/wait.go +++ b/op-e2e/e2eutils/geth/wait.go @@ -16,8 +16,6 @@ import ( "github.com/ethereum/go-ethereum/rpc" ) -const timeoutMultiplier = 10 - var ( // errTimeout represents a timeout errTimeout = errors.New("timeout") @@ -83,12 +81,6 @@ func WaitForTransaction(hash common.Hash, client *ethclient.Client, timeout time } } -func WaitForL2Transaction(hash common.Hash, client *ethclient.Client, timeout time.Duration) (*types.Receipt, error) { - // NOTE(pangssu): The operation speed seems to have been slowed down by changing to Poseidon hash. - // Therefore, we have increased the timeout, which should be improved later. - return WaitForTransaction(hash, client, timeout*timeoutMultiplier) -} - func WaitForBlock(number *big.Int, client *ethclient.Client, timeout time.Duration) (*types.Block, error) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() diff --git a/op-e2e/e2eutils/secrets.go b/op-e2e/e2eutils/secrets.go index 1710068ddc..8d7ee51a9d 100644 --- a/op-e2e/e2eutils/secrets.go +++ b/op-e2e/e2eutils/secrets.go @@ -19,18 +19,19 @@ import ( var DefaultMnemonicConfig = &MnemonicConfig{ Mnemonic: "test test test test test test test test test test test junk", CliqueSigner: "m/44'/60'/0'/0/0", - TrustedValidator: "m/44'/60'/0'/0/1", + TrustedValidator: "m/44'/60'/0'/0/1", // 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 Batcher: "m/44'/60'/0'/0/2", Deployer: "m/44'/60'/0'/0/3", Alice: "m/44'/60'/0'/0/4", SequencerP2P: "m/44'/60'/0'/0/5", Bob: "m/44'/60'/0'/0/7", - Mallory: "m/44'/60'/0'/0/8", + Mallory: "m/44'/60'/0'/0/8", // 0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f SysCfgOwner: "m/44'/60'/0'/0/0", // [Kroma: START], - Challenger1: "m/44'/60'/0'/0/11", - Challenger2: "m/44'/60'/0'/0/12", + Challenger1: "m/44'/60'/0'/0/11", // 0x71bE63f3384f5fb98995898A86B02Fb2426c5788 + Challenger2: "m/44'/60'/0'/0/12", // 0xFABB0ac9d68B0B445fB7357272Ff202C5651694a + Guardian: "m/44'/60'/0'/0/13", // 0x1CBd3b2770909D4e10f157cABC84C7264073C9Ec // [Kroma: END] } @@ -56,6 +57,7 @@ type MnemonicConfig struct { // [Kroma: START] Challenger1 string Challenger2 string + Guardian string // [Kroma: END } @@ -106,6 +108,8 @@ func (m *MnemonicConfig) Secrets() (*Secrets, error) { if err != nil { return nil, err } + + // [Kroma: START] challenger1, err := wallet.PrivateKey(account(m.Challenger1)) if err != nil { return nil, err @@ -114,6 +118,11 @@ func (m *MnemonicConfig) Secrets() (*Secrets, error) { if err != nil { return nil, err } + guardian, err := wallet.PrivateKey(account(m.Guardian)) + if err != nil { + return nil, err + } + // [Kroma: END] return &Secrets{ Deployer: deployer, @@ -130,6 +139,7 @@ func (m *MnemonicConfig) Secrets() (*Secrets, error) { // [Kroma :START] Challenger1: challenger1, Challenger2: challenger2, + Guardian: guardian, // [Kroma: END] }, nil } @@ -156,6 +166,7 @@ type Secrets struct { // [Kroma: START] Challenger1 *ecdsa.PrivateKey Challenger2 *ecdsa.PrivateKey + Guardian *ecdsa.PrivateKey // [Kroma: END] } @@ -188,6 +199,7 @@ func (s *Secrets) Addresses() *Addresses { // [Kroma: START] Challenger1: crypto.PubkeyToAddress(s.Challenger1.PublicKey), Challenger2: crypto.PubkeyToAddress(s.Challenger2.PublicKey), + Guardian: crypto.PubkeyToAddress(s.Guardian.PublicKey), // [Kroma: END] } } @@ -211,6 +223,7 @@ type Addresses struct { // [Kroma: START] Challenger1 common.Address Challenger2 common.Address + Guardian common.Address // [Kroma: END] } @@ -229,6 +242,7 @@ func (a *Addresses) All() []common.Address { // [Kroma: START] a.Challenger1, a.Challenger2, + a.Guardian, // [Kroma: END] } } diff --git a/op-e2e/e2eutils/setup.go b/op-e2e/e2eutils/setup.go index 8c5845d2ca..c51a5ac72d 100644 --- a/op-e2e/e2eutils/setup.go +++ b/op-e2e/e2eutils/setup.go @@ -1,20 +1,25 @@ package e2eutils import ( + "context" "math/big" "os" "path" "time" + "github.com/ethereum-optimism/optimism/op-e2e/config" + "github.com/ethereum-optimism/optimism/op-node/rollup" + opCrypto "github.com/ethereum-optimism/optimism/op-service/crypto" + "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/core" - + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" "github.com/stretchr/testify/require" - "github.com/ethereum-optimism/optimism/op-e2e/config" - "github.com/ethereum-optimism/optimism/op-node/rollup" - "github.com/ethereum-optimism/optimism/op-service/eth" + "github.com/kroma-network/kroma/kroma-bindings/bindings" "github.com/kroma-network/kroma/kroma-chain-ops/genesis" ) @@ -24,7 +29,7 @@ var testingJWTSecret = [32]byte{123} func WriteDefaultJWT(t TestingBase) string { // Sadly the geth node config cannot load JWT secret from memory, it has to be a file jwtPath := path.Join(t.TempDir(), "jwt_secret") - if err := os.WriteFile(jwtPath, []byte(hexutil.Encode(testingJWTSecret[:])), 0600); err != nil { + if err := os.WriteFile(jwtPath, []byte(hexutil.Encode(testingJWTSecret[:])), 0o600); err != nil { t.Fatalf("failed to prepare jwt file for geth: %v", err) } return jwtPath @@ -64,10 +69,9 @@ func MakeDeployParams(t require.TestingT, tp *TestParams) *DeployParams { deployConfig.L1BlockTime = tp.L1BlockTime deployConfig.UsePlasma = tp.UsePlasma // [Kroma: START] - //genesisTimeOffset := hexutil.Uint64(0) + // genesisTimeOffset := hexutil.Uint64(0) deployConfig.L2GenesisDeltaTimeOffset = nil deployConfig.L2GenesisEcotoneTimeOffset = nil - deployConfig.ValidatorPoolRoundDuration = deployConfig.L2OutputOracleSubmissionInterval * deployConfig.L2BlockTime / 2 // [Kroma: END] ApplyDeployConfigForks(deployConfig) @@ -75,6 +79,7 @@ func MakeDeployParams(t require.TestingT, tp *TestParams) *DeployParams { require.Equal(t, addresses.Batcher, deployConfig.BatchSenderAddress) require.Equal(t, addresses.SequencerP2P, deployConfig.P2PSequencerAddress) require.Equal(t, addresses.TrustedValidator, deployConfig.ValidatorPoolTrustedValidator) + require.Equal(t, addresses.TrustedValidator, deployConfig.ValidatorManagerTrustedValidator) return &DeployParams{ DeployConfig: deployConfig, @@ -114,6 +119,7 @@ func Setup(t require.TestingT, deployParams *DeployParams, alloc *AllocParams) * deployConf.L1GenesisBlockTimestamp = hexutil.Uint64(time.Now().Unix()) // [Kroma: START] deployConf.ValidatorPoolRoundDuration = deployConf.L2OutputOracleSubmissionInterval * deployConf.L2BlockTime / 2 + deployConf.ValidatorManagerRoundDurationSeconds = deployConf.L2OutputOracleSubmissionInterval * deployConf.L2BlockTime / 2 // [Kroma: END] require.NoError(t, deployConf.Check()) @@ -124,9 +130,22 @@ func Setup(t require.TestingT, deployParams *DeployParams, alloc *AllocParams) * require.NoError(t, err, "failed to create l1 genesis") if alloc.PrefundTestUsers { for _, addr := range deployParams.Addresses.All() { - l1Genesis.Alloc[addr] = core.GenesisAccount{ - Balance: Ether(1e12), + // [Kroma: START] + // If address already exists in allocs, do not modify other fields except for balance + amount := Ether(1e12) + if existing, ok := l1Genesis.Alloc[addr]; ok { + l1Genesis.Alloc[addr] = core.GenesisAccount{ + Code: existing.Code, + Storage: existing.Storage, + Balance: amount, + Nonce: existing.Nonce, + } + } else { + l1Genesis.Alloc[addr] = core.GenesisAccount{ + Balance: amount, + } } + // [Kroma: END] } } for addr, val := range alloc.L1Alloc { @@ -139,9 +158,22 @@ func Setup(t require.TestingT, deployParams *DeployParams, alloc *AllocParams) * require.NoError(t, err, "failed to create l2 genesis") if alloc.PrefundTestUsers { for _, addr := range deployParams.Addresses.All() { - l2Genesis.Alloc[addr] = core.GenesisAccount{ - Balance: Ether(1e12), + // [Kroma: START] + // If address already exists in allocs, do not modify other fields except for balance + amount := Ether(1e12) + if existing, ok := l2Genesis.Alloc[addr]; ok { + l2Genesis.Alloc[addr] = core.GenesisAccount{ + Code: existing.Code, + Storage: existing.Storage, + Balance: amount, + Nonce: existing.Nonce, + } + } else { + l2Genesis.Alloc[addr] = core.GenesisAccount{ + Balance: amount, + } } + // [Kroma: END] } } for addr, val := range alloc.L2Alloc { @@ -188,6 +220,7 @@ func Setup(t require.TestingT, deployParams *DeployParams, alloc *AllocParams) * require.Equal(t, deployParams.Secrets.Addresses().Batcher, deployParams.DeployConfig.BatchSenderAddress) require.Equal(t, deployParams.Secrets.Addresses().SequencerP2P, deployParams.DeployConfig.P2PSequencerAddress) require.Equal(t, deployParams.Secrets.Addresses().TrustedValidator, deployParams.DeployConfig.ValidatorPoolTrustedValidator) + require.Equal(t, deployParams.Secrets.Addresses().TrustedValidator, deployParams.DeployConfig.ValidatorManagerTrustedValidator) return &SetupData{ L1Cfg: l1Genesis, @@ -232,3 +265,54 @@ func UseFPAC() bool { func UsePlasma() bool { return os.Getenv("OP_E2E_USE_PLASMA") == "true" } + +// [Kroma: START] + +// RedeployValPoolToTerminate redeploys ValidatorPool and upgrades proxy to set the termination index to the given value. +func RedeployValPoolToTerminate( + ctx context.Context, + terminationIndex *big.Int, + l1Client *ethclient.Client, + secrets *Secrets, + l1ChainID *big.Int, + l1Deployments *genesis.L1Deployments, + deployConfig *genesis.DeployConfig, +) (*types.Transaction, *types.Transaction, error) { + signerFn := opCrypto.PrivateKeySignerFn(secrets.SysCfgOwner, l1ChainID) + txOpts := &bind.TransactOpts{ + Context: ctx, + From: secrets.Addresses().SysCfgOwner, + Signer: signerFn, + } + + // Deploy a ValidatorPool implementation + implAddr, deployTx, _, err := bindings.DeployValidatorPool( + txOpts, + l1Client, + l1Deployments.L2OutputOracleProxy, + l1Deployments.KromaPortalProxy, + l1Deployments.SecurityCouncilProxy, + secrets.Addresses().TrustedValidator, + deployConfig.ValidatorPoolRequiredBondAmount.ToInt(), + new(big.Int).SetUint64(deployConfig.ValidatorPoolMaxUnbond), + new(big.Int).SetUint64(deployConfig.ValidatorPoolRoundDuration), + terminationIndex, + ) + if err != nil { + return nil, nil, err + } + + // Upgrade ValidatorPoolProxy to the deployed implementation address + proxyAdmin, err := bindings.NewProxyAdminTransactor(l1Deployments.ProxyAdmin, l1Client) + if err != nil { + return nil, nil, err + } + upgradeTx, err := proxyAdmin.Upgrade(txOpts, l1Deployments.ValidatorPoolProxy, implAddr) + if err != nil { + return nil, nil, err + } + + return deployTx, upgradeTx, nil +} + +// [Kroma: END] diff --git a/op-e2e/e2eutils/setup_test.go b/op-e2e/e2eutils/setup_test.go index 0a3d484f6c..49bd7edc58 100644 --- a/op-e2e/e2eutils/setup_test.go +++ b/op-e2e/e2eutils/setup_test.go @@ -29,10 +29,10 @@ func TestSetup(t *testing.T) { alloc := &AllocParams{PrefundTestUsers: true} sd := Setup(t, dp, alloc) require.Contains(t, sd.L1Cfg.Alloc, dp.Addresses.Alice) - require.Equal(t, sd.L1Cfg.Alloc[dp.Addresses.Alice].Balance, Ether(1e12)) + require.Equal(t, sd.L1Cfg.Alloc[dp.Addresses.Alice].Balance.Uint64(), Ether(1e12).Uint64()) require.Contains(t, sd.L2Cfg.Alloc, dp.Addresses.Alice) - require.Equal(t, sd.L2Cfg.Alloc[dp.Addresses.Alice].Balance, Ether(1e12)) + require.Equal(t, sd.L2Cfg.Alloc[dp.Addresses.Alice].Balance.Uint64(), Ether(1e12).Uint64()) require.Contains(t, sd.L1Cfg.Alloc, dp.DeployConfig.KromaPortalProxy) require.Contains(t, sd.L2Cfg.Alloc, predeploys.L1BlockAddr) diff --git a/op-e2e/e2eutils/validator/validator.go b/op-e2e/e2eutils/validator/validator.go new file mode 100644 index 0000000000..cc7a94a64b --- /dev/null +++ b/op-e2e/e2eutils/validator/validator.go @@ -0,0 +1,131 @@ +package validator + +import ( + "context" + "crypto/ecdsa" + "math/big" + "testing" + "time" + + "github.com/ethereum-optimism/optimism/op-e2e/config" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/stretchr/testify/require" + + "github.com/kroma-network/kroma/kroma-bindings/bindings" +) + +const ( + ValidatorV1 uint8 = iota + ValidatorV2 +) + +type Helper struct { + t *testing.T + l1Client *ethclient.Client + l1ChainID *big.Int + l1BlockTime uint64 + valPoolContract *bindings.ValidatorPool + ValMgrContract *bindings.ValidatorManager + AssetMgrContract *bindings.AssetManager + AssetTokenContract *bindings.GovernanceToken +} + +func NewHelper(t *testing.T, l1Client *ethclient.Client, l1ChainID *big.Int, l1BlockTime uint64) *Helper { + valPoolContract, err := bindings.NewValidatorPool(config.L1Deployments.ValidatorPoolProxy, l1Client) + require.NoError(t, err) + + valMgrContract, err := bindings.NewValidatorManager(config.L1Deployments.ValidatorManagerProxy, l1Client) + require.NoError(t, err) + + assetMgrContract, err := bindings.NewAssetManager(config.L1Deployments.AssetManagerProxy, l1Client) + require.NoError(t, err) + + assetTokenContract, err := bindings.NewGovernanceToken(config.L1Deployments.L1GovernanceTokenProxy, l1Client) + require.NoError(t, err) + + return &Helper{ + t: t, + l1Client: l1Client, + l1ChainID: l1ChainID, + l1BlockTime: l1BlockTime, + valPoolContract: valPoolContract, + ValMgrContract: valMgrContract, + AssetMgrContract: assetMgrContract, + AssetTokenContract: assetTokenContract, + } +} + +func (h *Helper) DepositToValPool(priv *ecdsa.PrivateKey, value *big.Int) { + transactOpts, err := bind.NewKeyedTransactorWithChainID(priv, h.l1ChainID) + require.NoError(h.t, err) + transactOpts.Value = value + + tx, err := h.valPoolContract.Deposit(transactOpts) + require.NoError(h.t, err) + + _, err = wait.ForReceiptOK(context.Background(), h.l1Client, tx.Hash()) + require.NoError(h.t, err) +} + +func (h *Helper) UnbondValPool(priv *ecdsa.PrivateKey) bool { + transactOpts, err := bind.NewKeyedTransactorWithChainID(priv, h.l1ChainID) + require.NoError(h.t, err) + + tx, err := h.valPoolContract.Unbond(transactOpts) + require.NoError(h.t, err) + + receipt, err := geth.WaitForTransaction(tx.Hash(), h.l1Client, time.Duration(3*h.l1BlockTime)*time.Second) + require.NoError(h.t, err) + + return receipt.Status == types.ReceiptStatusSuccessful +} + +func (h *Helper) ApproveAssetToken(priv *ecdsa.PrivateKey, spender common.Address, amount *big.Int) { + transactOpts, err := bind.NewKeyedTransactorWithChainID(priv, h.l1ChainID) + require.NoError(h.t, err) + + tx, err := h.AssetTokenContract.Approve(transactOpts, spender, amount) + require.NoError(h.t, err) + + _, err = wait.ForReceiptOK(context.Background(), h.l1Client, tx.Hash()) + require.NoError(h.t, err) +} + +func (h *Helper) RegisterToValMgr(priv *ecdsa.PrivateKey, amount *big.Int, withdrawAddr common.Address) { + transactOpts, err := bind.NewKeyedTransactorWithChainID(priv, h.l1ChainID) + require.NoError(h.t, err) + + tx, err := h.AssetTokenContract.Approve(transactOpts, config.L1Deployments.AssetManagerProxy, amount) + require.NoError(h.t, err) + + _, err = wait.ForReceiptOK(context.Background(), h.l1Client, tx.Hash()) + require.NoError(h.t, err) + + tx, err = h.ValMgrContract.RegisterValidator(transactOpts, amount, uint8(10), withdrawAddr) + require.NoError(h.t, err) + + _, err = wait.ForReceiptOK(context.Background(), h.l1Client, tx.Hash()) + require.NoError(h.t, err) +} + +func (h *Helper) Delegate(priv *ecdsa.PrivateKey, validator common.Address, amount *big.Int) { + transactOpts, err := bind.NewKeyedTransactorWithChainID(priv, h.l1ChainID) + require.NoError(h.t, err) + + tx, err := h.AssetTokenContract.Approve(transactOpts, config.L1Deployments.AssetManagerProxy, amount) + require.NoError(h.t, err) + + _, err = wait.ForReceiptOK(context.Background(), h.l1Client, tx.Hash()) + require.NoError(h.t, err) + + tx, err = h.AssetMgrContract.Delegate(transactOpts, validator, amount) + require.NoError(h.t, err) + + _, err = wait.ForReceiptOK(context.Background(), h.l1Client, tx.Hash()) + require.NoError(h.t, err) +} diff --git a/op-e2e/e2eutils/wait/transactions.go b/op-e2e/e2eutils/wait/transactions.go new file mode 100644 index 0000000000..52646023e8 --- /dev/null +++ b/op-e2e/e2eutils/wait/transactions.go @@ -0,0 +1,52 @@ +package wait + +import ( + "context" + "crypto/ecdsa" + "math/big" + "time" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient" +) + +func ForTransferTxOnL2(l2ChainID *big.Int, l2Seq, l2Sync *ethclient.Client, + from *ecdsa.PrivateKey, to common.Address, value *big.Int) (*types.Receipt, error) { + ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) + nonce, err := l2Seq.PendingNonceAt(ctx, crypto.PubkeyToAddress(from.PublicKey)) + cancel() + if err != nil { + return nil, err + } + + tx := types.MustSignNewTx(from, types.LatestSignerForChainID(l2ChainID), &types.DynamicFeeTx{ + ChainID: l2ChainID, + Nonce: nonce, + To: &to, + Value: value, + GasTipCap: big.NewInt(10), + GasFeeCap: big.NewInt(200), + Gas: 21000, + }) + + ctx, cancel = context.WithTimeout(context.Background(), 2*time.Second) + err = l2Seq.SendTransaction(ctx, tx) + cancel() + if err != nil { + return nil, err + } + + _, err = ForReceiptOK(context.Background(), l2Seq, tx.Hash()) + if err != nil { + return nil, err + } + + receipt, err := ForReceiptOK(context.Background(), l2Sync, tx.Hash()) + if err != nil { + return nil, err + } + + return receipt, nil +} diff --git a/op-e2e/setup.go b/op-e2e/setup.go index 5a50762342..7c6e19883b 100644 --- a/op-e2e/setup.go +++ b/op-e2e/setup.go @@ -6,6 +6,7 @@ import ( "crypto/rand" "errors" "fmt" + "math" "math/big" "net" "os" @@ -16,37 +17,14 @@ import ( "testing" "time" - ds "github.com/ipfs/go-datastore" - dsSync "github.com/ipfs/go-datastore/sync" - ic "github.com/libp2p/go-libp2p/core/crypto" - "github.com/libp2p/go-libp2p/core/host" - "github.com/libp2p/go-libp2p/core/peer" - "github.com/libp2p/go-libp2p/core/peerstore" - "github.com/libp2p/go-libp2p/p2p/host/peerstore/pstoremem" - mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" - ma "github.com/multiformats/go-multiaddr" - "github.com/stretchr/testify/require" - - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/core" - "github.com/ethereum/go-ethereum/core/types" - geth_eth "github.com/ethereum/go-ethereum/eth" - "github.com/ethereum/go-ethereum/ethclient" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/rpc" - - "github.com/kroma-network/kroma/op-e2e/e2eutils/batcher" - bss "github.com/ethereum-optimism/optimism/op-batcher/batcher" batcherFlags "github.com/ethereum-optimism/optimism/op-batcher/flags" "github.com/ethereum-optimism/optimism/op-e2e/config" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/batcher" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/fakebeacon" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth" + "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/wait" "github.com/ethereum-optimism/optimism/op-node/chaincfg" "github.com/ethereum-optimism/optimism/op-node/metrics" rollupNode "github.com/ethereum-optimism/optimism/op-node/node" @@ -64,11 +42,31 @@ import ( "github.com/ethereum-optimism/optimism/op-service/sources" "github.com/ethereum-optimism/optimism/op-service/testlog" "github.com/ethereum-optimism/optimism/op-service/txmgr" - "github.com/kroma-network/kroma/kroma-bindings/bindings" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/core" + geth_eth "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rpc" + ds "github.com/ipfs/go-datastore" + dsSync "github.com/ipfs/go-datastore/sync" + ic "github.com/libp2p/go-libp2p/core/crypto" + "github.com/libp2p/go-libp2p/core/host" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/peerstore" + "github.com/libp2p/go-libp2p/p2p/host/peerstore/pstoremem" + mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" + ma "github.com/multiformats/go-multiaddr" + "github.com/stretchr/testify/require" + "github.com/kroma-network/kroma/kroma-bindings/predeploys" "github.com/kroma-network/kroma/kroma-chain-ops/genesis" validator "github.com/kroma-network/kroma/kroma-validator" validatormetrics "github.com/kroma-network/kroma/kroma-validator/metrics" + valhelper "github.com/kroma-network/kroma/op-e2e/e2eutils/validator" "github.com/kroma-network/kroma/op-e2e/testdata" "github.com/kroma-network/kroma/op-service/client" ) @@ -104,7 +102,6 @@ func DefaultSystemConfig(t *testing.T) SystemConfig { // [Kroma: START] deployConfig.L2GenesisDeltaTimeOffset = nil deployConfig.L2GenesisEcotoneTimeOffset = nil - deployConfig.ValidatorPoolRoundDuration = deployConfig.L2OutputOracleSubmissionInterval * deployConfig.L2BlockTime / 2 // [Kroma: END] require.NoError(t, deployConfig.Check(), "Deploy config is invalid, do you need to run make devnet-allocs?") l1Deployments := config.L1Deployments.Copy() @@ -112,7 +109,10 @@ func DefaultSystemConfig(t *testing.T) SystemConfig { require.Equal(t, secrets.Addresses().Batcher, deployConfig.BatchSenderAddress) require.Equal(t, secrets.Addresses().SequencerP2P, deployConfig.P2PSequencerAddress) + // [Kroma: START] require.Equal(t, secrets.Addresses().TrustedValidator, deployConfig.ValidatorPoolTrustedValidator) + require.Equal(t, secrets.Addresses().TrustedValidator, deployConfig.ValidatorManagerTrustedValidator) + // [Kroma: END] // Tests depend on premine being filled with secrets addresses premine := make(map[common.Address]*big.Int) @@ -160,11 +160,14 @@ func DefaultSystemConfig(t *testing.T) SystemConfig { }, }, Loggers: map[string]log.Logger{ - "verifier": testlog.Logger(t, log.LevelInfo).New("role", "verifier"), - "sequencer": testlog.Logger(t, log.LevelInfo).New("role", "sequencer"), - "batcher": testlog.Logger(t, log.LevelInfo).New("role", "batcher"), - "validator": testlog.Logger(t, log.LevelCrit).New("role", "validator"), + "verifier": testlog.Logger(t, log.LevelInfo).New("role", "verifier"), + "sequencer": testlog.Logger(t, log.LevelInfo).New("role", "sequencer"), + "batcher": testlog.Logger(t, log.LevelInfo).New("role", "batcher"), + "validator": testlog.Logger(t, log.LevelCrit).New("role", "validator"), + // [Kroma: START] "challenger": testlog.Logger(t, log.LevelCrit).New("role", "challenger"), + "guardian": testlog.Logger(t, log.LevelCrit).New("role", "guardian"), + // [Kroma: END] }, GethOptions: map[string][]geth.GethOption{}, P2PTopology: nil, // no P2P connectivity by default @@ -247,9 +250,12 @@ type SystemConfig struct { MaxPendingTransactions uint64 // [Kroma: START] - // TODO(0xHansLee): temporal flag for malicious validator. If it is set true, the validator acts as a malicious one - EnableMaliciousValidator bool - EnableGuardian bool + // EnableChallenge enables challenge setup, the validator will act as a malicious one and + // the challenger and guardian will act as honest parties. + EnableChallenge bool + + // ValidatorVersion makes the version of validator system other than V1. + ValidatorVersion uint8 // [Kroma: END] } @@ -296,12 +302,15 @@ type System struct { L2GenesisCfg *core.Genesis // Connections to running nodes - EthInstances map[string]EthInstance - Clients map[string]*ethclient.Client - RawClients map[string]*rpc.Client - RollupNodes map[string]*rollupNode.OpNode - Validator *validator.Validator - Challenger *validator.Validator + EthInstances map[string]EthInstance + Clients map[string]*ethclient.Client + RawClients map[string]*rpc.Client + RollupNodes map[string]*rollupNode.OpNode + Validator *validator.Validator + // [Kroma: START] + Challenger *validator.Validator + Guardian *validator.Validator + // [Kroma: END] BatchSubmitter *bss.BatcherService Mocknet mocknet.Mocknet @@ -394,6 +403,18 @@ func (sys *System) Close() { combinedErr = errors.Join(combinedErr, fmt.Errorf("stop L2OutputSubmitter: %w", err)) } } + // [Kroma: START] + if sys.Challenger != nil { + if err := sys.Challenger.Stop(); err != nil { + combinedErr = errors.Join(combinedErr, fmt.Errorf("stop Challenger: %w", err)) + } + } + if sys.Guardian != nil { + if err := sys.Guardian.Stop(); err != nil { + combinedErr = errors.Join(combinedErr, fmt.Errorf("stop Guardian: %w", err)) + } + } + // [Kroma: END] if sys.BatchSubmitter != nil { if err := sys.BatchSubmitter.Kill(); err != nil && !errors.Is(err, bss.ErrAlreadyStopped) { combinedErr = errors.Join(combinedErr, fmt.Errorf("stop BatchSubmitter: %w", err)) @@ -418,13 +439,6 @@ func (sys *System) Close() { combinedErr = errors.Join(combinedErr, fmt.Errorf("stop Mocknet: %w", err)) } } - // [Kroma: START] - if sys.Challenger != nil { - if err := sys.Challenger.Stop(); err != nil { - combinedErr = errors.Join(combinedErr, fmt.Errorf("stop Challenger: %w", err)) - } - } - // [Kroma: END] require.NoError(sys.t, combinedErr, "Failed to stop system") } @@ -462,6 +476,7 @@ func (s *SystemConfigOptions) Get(key, role string) (systemConfigHook, bool) { func (cfg SystemConfig) Start(t *testing.T, _opts ...SystemConfigOption) (*System, error) { // [Kroma: START] cfg.DeployConfig.ValidatorPoolRoundDuration = cfg.DeployConfig.L2OutputOracleSubmissionInterval * cfg.DeployConfig.L2BlockTime / 2 + cfg.DeployConfig.ValidatorManagerRoundDurationSeconds = cfg.DeployConfig.L2OutputOracleSubmissionInterval * cfg.DeployConfig.L2BlockTime / 2 // [Kroma: END] opts, err := NewSystemConfigOptions(_opts) if err != nil { @@ -799,6 +814,7 @@ func (cfg SystemConfig) Start(t *testing.T, _opts ...SystemConfigOption) (*Syste return sys, nil } + // [Kroma: START] // Run validator node (L2 Output Submitter, Asserter) validatorCliCfg := validator.CLIConfig{ L1EthRpc: sys.EthInstances["l1"].WSEndpoint(), @@ -807,15 +823,15 @@ func (cfg SystemConfig) Start(t *testing.T, _opts ...SystemConfigOption) (*Syste L2OOAddress: config.L1Deployments.L2OutputOracleProxy.Hex(), ColosseumAddress: config.L1Deployments.ColosseumProxy.Hex(), ValPoolAddress: config.L1Deployments.ValidatorPoolProxy.Hex(), + ValMgrAddress: config.L1Deployments.ValidatorManagerProxy.Hex(), + AssetManagerAddress: config.L1Deployments.AssetManagerProxy.Hex(), ChallengerPollInterval: 500 * time.Millisecond, TxMgrConfig: newTxMgrConfig(sys.EthInstances["l1"].WSEndpoint(), cfg.Secrets.TrustedValidator), AllowNonFinalized: cfg.NonFinalizedOutputs, - OutputSubmitterRetryInterval: 50 * time.Millisecond, - OutputSubmitterRoundBuffer: 30, - ChallengerEnabled: false, + OutputSubmitterRetryInterval: 500 * time.Millisecond, + OutputSubmitterRoundBuffer: cfg.DeployConfig.L2OutputOracleSubmissionInterval / 2, OutputSubmitterEnabled: true, OutputSubmitterAllowPublicRound: true, - SecurityCouncilAddress: config.L1Deployments.SecurityCouncilProxy.Hex(), LogConfig: oplog.CLIConfig{ Level: log.LevelInfo, Format: oplog.FormatText, @@ -823,9 +839,40 @@ func (cfg SystemConfig) Start(t *testing.T, _opts ...SystemConfigOption) (*Syste } // deposit to ValidatorPool to be a validator - err = cfg.DepositValidatorPool(sys.Clients["l1"], cfg.Secrets.TrustedValidator, big.NewInt(params.Ether)) - if err != nil { - return nil, fmt.Errorf("trusted validator unable to deposit to ValidatorPool: %w", err) + validatorHelper := sys.ValidatorHelper() + validatorHelper.DepositToValPool(cfg.Secrets.TrustedValidator, big.NewInt(params.Ether)) + + if cfg.ValidatorVersion == valhelper.ValidatorV2 { + // register to ValidatorManager to be a validator + depositAmount := new(big.Int).Mul(cfg.DeployConfig.ValidatorManagerMinActivateAmount.ToInt(), common.Big256) + validatorHelper.RegisterToValMgr(cfg.Secrets.TrustedValidator, depositAmount, cfg.Secrets.Addresses().TrustedValidator) + + // set up ValidatorRewardVault(Mallory) to be able to provide asset tokens to AssetManager + validatorHelper.ApproveAssetToken(cfg.Secrets.Mallory, cfg.L1Deployments.AssetManagerProxy, new(big.Int).SetUint64(math.MaxUint64)) + + func() { + // Redeploy and upgrade ValidatorPool to set the termination index to a smaller value for ValidatorManager test + ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) + defer cancel() + deployTx, upgradeTx, err := e2eutils.RedeployValPoolToTerminate( + ctx, + cfg.DeployConfig.ValidatorPoolTerminateOutputIndex.ToInt(), + l1Client, + cfg.Secrets, + cfg.L1ChainIDBig(), + cfg.L1Deployments, + cfg.DeployConfig, + ) + require.NoError(t, err) + + // Check deploy tx and upgrade tx submission were successful + ctx, cancel = context.WithTimeout(context.Background(), 15*time.Second) + defer cancel() + _, err = wait.ForReceiptOK(ctx, l1Client, deployTx.Hash()) + require.NoError(t, err) + _, err = wait.ForReceiptOK(ctx, l1Client, upgradeTx.Hash()) + require.NoError(t, err) + }() } validatorCfg, err := validator.NewValidatorConfig(validatorCliCfg, sys.Cfg.Loggers["validator"], validatormetrics.NoopMetrics) @@ -843,8 +890,8 @@ func (cfg SystemConfig) Start(t *testing.T, _opts ...SystemConfigOption) (*Syste validatorCfg.RollupClient = sources.NewRollupClient(validatorMaliciousL2RPC) validatorCfg.L2Client = sys.Clients["sequencer"] - // If malicious validator is turned on, set target block number for submitting invalid output - if cfg.EnableMaliciousValidator { + // For challenge setup, set target block number for submitting invalid output + if cfg.EnableChallenge { validatorMaliciousL2RPC.SetTargetBlockNumber(testdata.TargetBlockNumber) } @@ -857,6 +904,63 @@ func (cfg SystemConfig) Start(t *testing.T, _opts ...SystemConfigOption) (*Syste return nil, fmt.Errorf("unable to start validator: %w", err) } + if cfg.EnableChallenge { + if err = cfg.StartChallengeSystem(sys); err != nil { + return nil, fmt.Errorf("unable to start challenge system: %w", err) + } + } + // [Kroma: END] + + var batchType uint = derive.SingularBatchType + if cfg.DeployConfig.L2GenesisDeltaTimeOffset != nil && *cfg.DeployConfig.L2GenesisDeltaTimeOffset == hexutil.Uint64(0) { + batchType = derive.SpanBatchType + } + // batcher defaults if unset + batcherMaxL1TxSizeBytes := cfg.BatcherMaxL1TxSizeBytes + if batcherMaxL1TxSizeBytes == 0 { + batcherMaxL1TxSizeBytes = 120_000 + } + batcherTargetNumFrames := cfg.BatcherTargetNumFrames + if batcherTargetNumFrames == 0 { + batcherTargetNumFrames = 1 + } + batcherCLIConfig := &bss.CLIConfig{ + L1EthRpc: sys.EthInstances["l1"].WSEndpoint(), + L2EthRpc: sys.EthInstances["sequencer"].WSEndpoint(), + RollupRpc: sys.RollupNodes["sequencer"].HTTPEndpoint(), + MaxPendingTransactions: cfg.MaxPendingTransactions, + MaxChannelDuration: 1, + MaxL1TxSize: batcherMaxL1TxSizeBytes, + TestUseMaxTxSizeForBlobs: cfg.BatcherUseMaxTxSizeForBlobs, + TargetNumFrames: int(batcherTargetNumFrames), + ApproxComprRatio: 0.4, + SubSafetyMargin: 4, + PollInterval: 50 * time.Millisecond, + TxMgrConfig: newTxMgrConfig(sys.EthInstances["l1"].WSEndpoint(), cfg.Secrets.Batcher), + LogConfig: oplog.CLIConfig{ + Level: log.LevelInfo, + Format: oplog.FormatText, + }, + Stopped: sys.Cfg.DisableBatcher, // Batch submitter may be enabled later + BatchType: batchType, + DataAvailabilityType: sys.Cfg.DataAvailabilityType, + } + // Batch Submitter + batcher, err := bss.BatcherServiceFromCLIConfig(context.Background(), "0.0.1", batcherCLIConfig, sys.Cfg.Loggers["batcher"]) + if err != nil { + return nil, fmt.Errorf("failed to setup batch submitter: %w", err) + } + if err := batcher.Start(context.Background()); err != nil { + return nil, errors.Join(fmt.Errorf("failed to start batch submitter: %w", err), batcher.Stop(context.Background())) + } + sys.BatchSubmitter = batcher + + return sys, nil +} + +// [Kroma: START] + +func (cfg SystemConfig) StartChallengeSystem(sys *System) error { // Run validator node (Challenger) challengerCliCfg := validator.CLIConfig{ L1EthRpc: sys.EthInstances["l1"].WSEndpoint(), @@ -865,13 +969,13 @@ func (cfg SystemConfig) Start(t *testing.T, _opts ...SystemConfigOption) (*Syste L2OOAddress: config.L1Deployments.L2OutputOracleProxy.Hex(), ColosseumAddress: config.L1Deployments.ColosseumProxy.Hex(), ValPoolAddress: config.L1Deployments.ValidatorPoolProxy.Hex(), + ValMgrAddress: config.L1Deployments.ValidatorManagerProxy.Hex(), + AssetManagerAddress: config.L1Deployments.AssetManagerProxy.Hex(), ChallengerPollInterval: 500 * time.Millisecond, ProverRPC: "http://0.0.0.0:0", TxMgrConfig: newTxMgrConfig(sys.EthInstances["l1"].WSEndpoint(), cfg.Secrets.Challenger1), - OutputSubmitterEnabled: false, + AllowNonFinalized: cfg.NonFinalizedOutputs, ChallengerEnabled: true, - SecurityCouncilAddress: config.L1Deployments.SecurityCouncilProxy.Hex(), - GuardianEnabled: cfg.EnableGuardian, LogConfig: oplog.CLIConfig{ Level: log.LevelInfo, Format: oplog.FormatText, @@ -880,82 +984,86 @@ func (cfg SystemConfig) Start(t *testing.T, _opts ...SystemConfigOption) (*Syste challengerCfg, err := validator.NewValidatorConfig(challengerCliCfg, sys.Cfg.Loggers["challenger"], validatormetrics.NoopMetrics) if err != nil { - return nil, fmt.Errorf("unable to init challenger config: %w", err) + return fmt.Errorf("unable to init challenger config: %w", err) } // Replace to mock RPC client - cl, err = rpc.DialHTTP(challengerCliCfg.RollupRpc) + cl, err := rpc.DialHTTP(challengerCliCfg.RollupRpc) if err != nil { - return nil, fmt.Errorf("unable to init challenger rollup rpc client: %w", err) + return fmt.Errorf("unable to init challenger rollup rpc client: %w", err) } - rpcCl = client.NewBaseRPCClient(cl) + rpcCl := client.NewBaseRPCClient(cl) challengerHonestL2RPC := e2eutils.NewHonestL2RPC(rpcCl) challengerCfg.RollupClient = sources.NewRollupClient(challengerHonestL2RPC) challengerCfg.L2Client = sys.Clients["sequencer"] - // If malicious validator is turned on, set target block number for challenge - if cfg.EnableMaliciousValidator { - challengerHonestL2RPC.SetTargetBlockNumber(testdata.TargetBlockNumber) - } + // For challenge setup, set target block number for submitting invalid output + challengerHonestL2RPC.SetTargetBlockNumber(testdata.TargetBlockNumber) // Replace to mock fetcher challengerCfg.ProofFetcher = e2eutils.NewFetcher(sys.Cfg.Loggers["challenger"], "./testdata/proof") sys.Challenger, err = validator.NewValidator(*challengerCfg, sys.Cfg.Loggers["challenger"], validatormetrics.NoopMetrics) if err != nil { - return nil, fmt.Errorf("unable to setup challenger: %w", err) + return fmt.Errorf("unable to setup challenger: %w", err) } if err := sys.Challenger.Start(); err != nil { - return nil, fmt.Errorf("unable to start challenger: %w", err) + return fmt.Errorf("unable to start challenger: %w", err) } - var batchType uint = derive.SingularBatchType - if cfg.DeployConfig.L2GenesisDeltaTimeOffset != nil && *cfg.DeployConfig.L2GenesisDeltaTimeOffset == hexutil.Uint64(0) { - batchType = derive.SpanBatchType - } - // batcher defaults if unset - batcherMaxL1TxSizeBytes := cfg.BatcherMaxL1TxSizeBytes - if batcherMaxL1TxSizeBytes == 0 { - batcherMaxL1TxSizeBytes = 120_000 - } - batcherTargetNumFrames := cfg.BatcherTargetNumFrames - if batcherTargetNumFrames == 0 { - batcherTargetNumFrames = 1 - } - batcherCLIConfig := &bss.CLIConfig{ - L1EthRpc: sys.EthInstances["l1"].WSEndpoint(), - L2EthRpc: sys.EthInstances["sequencer"].WSEndpoint(), - RollupRpc: sys.RollupNodes["sequencer"].HTTPEndpoint(), - MaxPendingTransactions: cfg.MaxPendingTransactions, - MaxChannelDuration: 1, - MaxL1TxSize: batcherMaxL1TxSizeBytes, - TestUseMaxTxSizeForBlobs: cfg.BatcherUseMaxTxSizeForBlobs, - TargetNumFrames: int(batcherTargetNumFrames), - ApproxComprRatio: 0.4, - SubSafetyMargin: 4, - PollInterval: 50 * time.Millisecond, - TxMgrConfig: newTxMgrConfig(sys.EthInstances["l1"].WSEndpoint(), cfg.Secrets.Batcher), + // Run validator node (Guardian) + guardianCliCfg := validator.CLIConfig{ + L1EthRpc: sys.EthInstances["l1"].WSEndpoint(), + L2EthRpc: sys.EthInstances["sequencer"].HTTPEndpoint(), + RollupRpc: sys.RollupNodes["sequencer"].HTTPEndpoint(), + L2OOAddress: config.L1Deployments.L2OutputOracleProxy.Hex(), + ColosseumAddress: config.L1Deployments.ColosseumProxy.Hex(), + ValPoolAddress: config.L1Deployments.ValidatorPoolProxy.Hex(), + ValMgrAddress: config.L1Deployments.ValidatorManagerProxy.Hex(), + AssetManagerAddress: config.L1Deployments.AssetManagerProxy.Hex(), + SecurityCouncilAddress: config.L1Deployments.SecurityCouncilProxy.Hex(), + TxMgrConfig: newTxMgrConfig(sys.EthInstances["l1"].WSEndpoint(), cfg.Secrets.Guardian), + AllowNonFinalized: cfg.NonFinalizedOutputs, + GuardianEnabled: true, + GuardianPollInterval: time.Second, LogConfig: oplog.CLIConfig{ Level: log.LevelInfo, Format: oplog.FormatText, }, - Stopped: sys.Cfg.DisableBatcher, // Batch submitter may be enabled later - BatchType: batchType, - DataAvailabilityType: sys.Cfg.DataAvailabilityType, } - // Batch Submitter - batcher, err := bss.BatcherServiceFromCLIConfig(context.Background(), "0.0.1", batcherCLIConfig, sys.Cfg.Loggers["batcher"]) + + guardianCfg, err := validator.NewValidatorConfig(guardianCliCfg, sys.Cfg.Loggers["guardian"], validatormetrics.NoopMetrics) if err != nil { - return nil, fmt.Errorf("failed to setup batch submitter: %w", err) + return fmt.Errorf("unable to init guardian config: %w", err) } - if err := batcher.Start(context.Background()); err != nil { - return nil, errors.Join(fmt.Errorf("failed to start batch submitter: %w", err), batcher.Stop(context.Background())) + + // Replace to mock RPC client + cl, err = rpc.DialHTTP(guardianCliCfg.RollupRpc) + if err != nil { + return fmt.Errorf("unable to init guardian rollup rpc client: %w", err) } - sys.BatchSubmitter = batcher + rpcCl = client.NewBaseRPCClient(cl) + guardianHonestL2RPC := e2eutils.NewHonestL2RPC(rpcCl) + guardianCfg.RollupClient = sources.NewRollupClient(guardianHonestL2RPC) + guardianCfg.L2Client = sys.Clients["sequencer"] - return sys, nil + // For challenge setup, set target block number for submitting invalid output + guardianHonestL2RPC.SetTargetBlockNumber(testdata.TargetBlockNumber) + + sys.Guardian, err = validator.NewValidator(*guardianCfg, sys.Cfg.Loggers["guardian"], validatormetrics.NoopMetrics) + if err != nil { + return fmt.Errorf("unable to setup guardian: %w", err) + } + + if err := sys.Guardian.Start(); err != nil { + return fmt.Errorf("unable to start guardian: %w", err) + } + + return nil } +// [Kroma: END] + // IP6 range that gets blackholed (in case our traffic ever makes it out onto // the internet). var blackholeIP6 = net.ParseIP("100::") @@ -1005,6 +1113,14 @@ func (sys *System) BatcherHelper() *batcher.Helper { return batcher.NewHelper(sys.t, sys.Cfg.Secrets.Batcher, sys.RollupConfig, sys.NodeClient("l1")) } +// [Kroma: START] + +func (sys *System) ValidatorHelper() *valhelper.Helper { + return valhelper.NewHelper(sys.t, sys.NodeClient("l1"), sys.Cfg.L1ChainIDBig(), sys.Cfg.DeployConfig.L1BlockTime) +} + +// [Kroma: END] + func UseHTTP() bool { return os.Getenv("OP_E2E_USE_HTTP") == "true" } @@ -1055,66 +1171,6 @@ func (cfg SystemConfig) L2ChainIDBig() *big.Int { return new(big.Int).SetUint64(cfg.DeployConfig.L2ChainID) } -func (cfg SystemConfig) DepositValidatorPool(l1Client *ethclient.Client, priv *ecdsa.PrivateKey, value *big.Int) error { - valpoolContract, err := bindings.NewValidatorPool(config.L1Deployments.ValidatorPoolProxy, l1Client) - if err != nil { - return fmt.Errorf("unable to create ValidatorPool instance: %w", err) - } - transactOpts, err := bind.NewKeyedTransactorWithChainID(priv, cfg.L1ChainIDBig()) - if err != nil { - return fmt.Errorf("unable to create transactor opts: %w", err) - } - transactOpts.Value = value - tx, err := valpoolContract.Deposit(transactOpts) - if err != nil { - return fmt.Errorf("unable to send deposit transaction: %w", err) - } - _, err = geth.WaitForTransaction(tx.Hash(), l1Client, time.Duration(3*cfg.DeployConfig.L1BlockTime)*time.Second) - if err != nil { - return fmt.Errorf("unable to wait for validator deposit tx on L1: %w", err) - } - - return nil -} - -func (cfg SystemConfig) SendTransferTx(l2Seq *ethclient.Client, l2Sync *ethclient.Client) (*types.Receipt, error) { - chainId := cfg.L2ChainIDBig() - ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) - nonce, err := l2Seq.PendingNonceAt(ctx, cfg.Secrets.Addresses().Alice) - cancel() - if err != nil { - return nil, fmt.Errorf("failed to get nonce: %w", err) - } - tx := types.MustSignNewTx(cfg.Secrets.Alice, types.LatestSignerForChainID(chainId), &types.DynamicFeeTx{ - ChainID: chainId, - Nonce: nonce, - To: &common.Address{0xff, 0xff}, - Value: common.Big1, - GasTipCap: big.NewInt(10), - GasFeeCap: big.NewInt(200), - Gas: 21000, - }) - - ctx, cancel = context.WithTimeout(context.Background(), 2*time.Duration(cfg.DeployConfig.L1BlockTime)*time.Second) - err = l2Seq.SendTransaction(ctx, tx) - cancel() - if err != nil { - return nil, fmt.Errorf("failed to send L2 tx to sequencer: %w", err) - } - - _, err = geth.WaitForL2Transaction(tx.Hash(), l2Seq, 4*time.Duration(cfg.DeployConfig.L1BlockTime)*time.Second) - if err != nil { - return nil, fmt.Errorf("failed to wait L2 tx on sequencer: %w", err) - } - - receipt, err := geth.WaitForL2Transaction(tx.Hash(), l2Sync, 4*time.Duration(cfg.DeployConfig.L1BlockTime)*time.Second) - if err != nil { - return nil, fmt.Errorf("failed to wait L2 tx on verifier: %w", err) - } - - return receipt, nil -} - func hexPriv(in *ecdsa.PrivateKey) string { b := e2eutils.EncodePrivKey(in) return hexutil.Encode(b) diff --git a/op-e2e/system_test.go b/op-e2e/system_test.go index 3e85a9bf1c..fae85b51de 100644 --- a/op-e2e/system_test.go +++ b/op-e2e/system_test.go @@ -10,23 +10,6 @@ import ( "testing" "time" - "github.com/ethereum/go-ethereum" - "github.com/ethereum/go-ethereum/accounts/abi/bind" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" - "github.com/ethereum/go-ethereum/consensus/misc/eip4844" - "github.com/ethereum/go-ethereum/core/types" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/eth/ethconfig" - "github.com/ethereum/go-ethereum/ethclient" - "github.com/ethereum/go-ethereum/log" - "github.com/ethereum/go-ethereum/node" - "github.com/ethereum/go-ethereum/params" - "github.com/ethereum/go-ethereum/rpc" - "github.com/libp2p/go-libp2p/core/peer" - "github.com/stretchr/testify/require" - "golang.org/x/exp/slices" - "github.com/ethereum-optimism/optimism/op-e2e/config" "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth" gethutils "github.com/ethereum-optimism/optimism/op-e2e/e2eutils/geth" @@ -44,10 +27,28 @@ import ( "github.com/ethereum-optimism/optimism/op-service/retry" "github.com/ethereum-optimism/optimism/op-service/sources" "github.com/ethereum-optimism/optimism/op-service/testlog" + "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/consensus/misc/eip4844" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/eth/ethconfig" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/log" + "github.com/ethereum/go-ethereum/node" + "github.com/ethereum/go-ethereum/params" + "github.com/ethereum/go-ethereum/rpc" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/stretchr/testify/require" + "golang.org/x/exp/slices" + "github.com/kroma-network/kroma/kroma-bindings/bindings" "github.com/kroma-network/kroma/kroma-bindings/predeploys" val "github.com/kroma-network/kroma/kroma-validator" chal "github.com/kroma-network/kroma/kroma-validator/challenge" + valhelper "github.com/kroma-network/kroma/op-e2e/e2eutils/validator" ) // TestSystemBatchType run each system e2e test case in singular batch mode and span batch mode. @@ -96,6 +97,8 @@ func TestL2OutputSubmitter(t *testing.T) { cfg := DefaultSystemConfig(t) cfg.NonFinalizedOutputs = true // speed up the time till we see checkpoint outputs + cfg.DeployConfig.L1BlockTime = 3 + cfg.DeployConfig.L2BlockTime = 2 // same config with L2OutputOracle sys, err := cfg.Start(t) require.Nil(t, err, "Error starting up system") @@ -160,10 +163,93 @@ func TestL2OutputSubmitter(t *testing.T) { } } +func TestL2OutputSubmitterV2(t *testing.T) { + InitParallel(t, SkipOnFPAC) + + cfg := DefaultSystemConfig(t) + cfg.NonFinalizedOutputs = true // speed up the time till we see checkpoint outputs + cfg.DeployConfig.L1BlockTime = 3 + cfg.DeployConfig.L2BlockTime = 2 // same config with L2OutputOracle + cfg.ValidatorVersion = valhelper.ValidatorV2 + newTerminationIndex := hexutil.Big(*common.Big1) + cfg.DeployConfig.ValidatorPoolTerminateOutputIndex = &newTerminationIndex + + sys, err := cfg.Start(t) + require.NoError(t, err, "Error starting up system") + defer sys.Close() + + rollupRPCClient, err := rpc.DialContext(context.Background(), sys.RollupNodes["sequencer"].HTTPEndpoint()) + require.NoError(t, err) + rollupClient := sources.NewRollupClient(client.NewBaseRPCClient(rollupRPCClient)) + + l2OutputOracle, err := bindings.NewL2OutputOracleCaller(cfg.L1Deployments.L2OutputOracleProxy, sys.Clients["l1"]) + require.NoError(t, err) + + valPool, err := bindings.NewValidatorPoolCaller(cfg.L1Deployments.ValidatorPoolProxy, sys.Clients["l1"]) + require.NoError(t, err) + + l2Verif := sys.Clients["verifier"] + _, err = geth.WaitForBlock(big.NewInt(6), l2Verif, 10*time.Duration(cfg.DeployConfig.L2BlockTime)*time.Second) + require.NoError(t, err) + + // Wait for output submitter to update L2 output oracle + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + + for ; ; <-ticker.C { + select { + case <-ctx.Done(): + t.Fatalf("State root update via ValidatorManager was not performed") + default: + nextOutputIndex, err := l2OutputOracle.NextOutputIndex(&bind.CallOpts{}) + require.NoError(t, err) + + isTerminated, err := valPool.IsTerminated(&bind.CallOpts{}, nextOutputIndex) + require.NoError(t, err) + + if nextOutputIndex.Cmp(newTerminationIndex.ToInt()) == 1 { + require.True(t, isTerminated) + } else { + require.False(t, isTerminated) + } + + if nextOutputIndex.Cmp(common.Big0) == 0 { + continue + } + + // Retrieve the l2 output committed at this updated timestamp + latestOutputIndex := new(big.Int).Sub(nextOutputIndex, common.Big1) + committedL2Output, err := l2OutputOracle.GetL2Output(&bind.CallOpts{}, latestOutputIndex) + require.NotEqual(t, [32]byte{}, committedL2Output.OutputRoot, "Empty L2 Output") + require.NoError(t, err) + + // Fetch the corresponding L2 block and assert the committed L2 + // output matches the block's state root. + func() { + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + l2Output, err := rollupClient.OutputAtBlock(ctx, committedL2Output.L2BlockNumber.Uint64()) + require.NoError(t, err) + require.Equal(t, l2Output.OutputRoot[:], committedL2Output.OutputRoot[:]) + }() + + if nextOutputIndex.Cmp(new(big.Int).Add(newTerminationIndex.ToInt(), common.Big1)) == 1 { + return + } + } + } +} + func TestValidationReward(t *testing.T) { InitParallel(t) cfg := DefaultSystemConfig(t) + cfg.NonFinalizedOutputs = true // speed up the time till we see checkpoint outputs + cfg.DeployConfig.L1BlockTime = 3 + cfg.DeployConfig.L2BlockTime = 2 // same config with L2OutputOracle sys, err := cfg.Start(t) require.NoError(t, err, "Error starting up system") @@ -179,8 +265,8 @@ func TestValidationReward(t *testing.T) { require.NoError(t, err) require.GreaterOrEqual(t, rewardDivider.Uint64(), uint64(1)) - // Send a transaction to pay a fee. - _, err = cfg.SendTransferTx(l2Seq, l2Verif) + // Send a transaction to pay a fee + _, err = wait.ForTransferTxOnL2(sys.Cfg.L2ChainIDBig(), l2Seq, l2Verif, cfg.Secrets.Alice, common.Address{0xff, 0xff}, common.Big1) require.NoError(t, err) l2RewardedCh := make(chan *bindings.ValidatorRewardVaultRewarded, 1) @@ -191,6 +277,7 @@ func TestValidationReward(t *testing.T) { timeout := time.Duration(cfg.DeployConfig.FinalizationPeriodSeconds+30) * time.Second ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() + for { select { case evt := <-l2RewardedCh: @@ -205,6 +292,118 @@ func TestValidationReward(t *testing.T) { } } +func TestValidatorSystemUpgradeToV2(t *testing.T) { + InitParallel(t) + + cfg := DefaultSystemConfig(t) + cfg.NonFinalizedOutputs = true // speed up the time till we see checkpoint outputs + cfg.DeployConfig.L1BlockTime = 3 + cfg.DeployConfig.L2BlockTime = 2 // same config with L2OutputOracle + cfg.ValidatorVersion = valhelper.ValidatorV2 + // Set termination index of ValidatorPool large enough to enable auto finalization in ValidatorPool at least once + outputNum := cfg.DeployConfig.FinalizationPeriodSeconds / + (cfg.DeployConfig.L2OutputOracleSubmissionInterval * cfg.DeployConfig.L2BlockTime) + newTerminationIndex := hexutil.Big(*big.NewInt(int64(outputNum + 3))) + cfg.DeployConfig.ValidatorPoolTerminateOutputIndex = &newTerminationIndex + + sys, err := cfg.Start(t) + require.NoError(t, err, "Error starting up system") + defer sys.Close() + + l1Client := sys.Clients["l1"] + validatorHelper := sys.ValidatorHelper() + + // Delegate to receive validation reward + validatorAddr := cfg.Secrets.Addresses().TrustedValidator + validatorHelper.Delegate(cfg.Secrets.Challenger1, validatorAddr, cfg.DeployConfig.ValidatorManagerMinActivateAmount.ToInt()) + + // Capture initial asset amount and validator weight + beforeDelegateAmount, err := validatorHelper.AssetMgrContract.TotalKroAssets(&bind.CallOpts{}, validatorAddr) + require.NoError(t, err) + + beforeDepositAmount, err := validatorHelper.AssetMgrContract.TotalValidatorKro(&bind.CallOpts{}, validatorAddr) + require.NoError(t, err) + + l2OutputOracle, err := bindings.NewL2OutputOracleCaller(cfg.L1Deployments.L2OutputOracleProxy, l1Client) + require.NoError(t, err) + + nextFinalizeOutputIndex, err := l2OutputOracle.NextFinalizeOutputIndex(&bind.CallOpts{}) + require.NoError(t, err) + + // Subscribe reward distribution event in ValidatorManager + rewardedCh := make(chan *bindings.ValidatorManagerRewardDistributed, 1) + rewardedSub, err := validatorHelper.ValMgrContract.WatchRewardDistributed(&bind.WatchOpts{}, rewardedCh, []*big.Int{}, []common.Address{}) + require.NoError(t, err) + defer rewardedSub.Unsubscribe() + + // Wait for ValidatorPool termination and first reward distribution in ValidatorManager + timeout := time.Duration(cfg.DeployConfig.FinalizationPeriodSeconds*2+30) * time.Second + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + + for ; ; <-ticker.C { + select { + case <-ctx.Done(): + t.Fatalf("Timed out waiting for the first reward distribution in ValidatorManager") + case evt := <-rewardedCh: + require.Equal(t, new(big.Int).Add(newTerminationIndex.ToInt(), common.Big1).Uint64(), evt.OutputIndex.Uint64()) + + newIndex, err := l2OutputOracle.NextFinalizeOutputIndex(&bind.CallOpts{}) + require.NoError(t, err) + require.NotEqual(t, newIndex.Uint64(), nextFinalizeOutputIndex.Uint64()) + + // Since multiple outputs can be finalized at once, need to consider it to calculate actual reward distribution + finalizedOutputNum := new(big.Int).Sub(newIndex, nextFinalizeOutputIndex) + baseReward := new(big.Int).Mul(evt.BaseReward, finalizedOutputNum) + validatorReward := new(big.Int).Mul(evt.ValidatorReward, finalizedOutputNum) + + afterDelegateAmount, err := validatorHelper.AssetMgrContract.TotalKroAssets(&bind.CallOpts{}, validatorAddr) + require.NoError(t, err) + require.Equal(t, new(big.Int).Add(beforeDelegateAmount, baseReward), afterDelegateAmount) + + afterDepositAmount, err := validatorHelper.AssetMgrContract.TotalValidatorKro(&bind.CallOpts{}, validatorAddr) + require.NoError(t, err) + require.Equal(t, new(big.Int).Add(beforeDepositAmount, validatorReward), afterDepositAmount) + + reflectiveWeight, err := validatorHelper.AssetMgrContract.ReflectiveWeight(&bind.CallOpts{}, validatorAddr) + require.NoError(t, err) + actualWeight, err := validatorHelper.ValMgrContract.GetWeight(&bind.CallOpts{}, validatorAddr) + require.NoError(t, err) + require.Equal(t, reflectiveWeight, actualWeight) + + return + default: + nextOutputIndex, err := l2OutputOracle.NextOutputIndex(&bind.CallOpts{}) + require.NoError(t, err) + + nextFinalizeOutputIndex, err = l2OutputOracle.NextFinalizeOutputIndex(&bind.CallOpts{}) + require.NoError(t, err) + + // Unbond manually between ValidatorPool termination and first reward distribution in ValidatorManager + if nextOutputIndex.Cmp(newTerminationIndex.ToInt()) <= 0 || + nextFinalizeOutputIndex.Cmp(newTerminationIndex.ToInt()) == 1 { + continue + } + + isFinalized, err := l2OutputOracle.IsFinalized(&bind.CallOpts{}, nextFinalizeOutputIndex) + require.NoError(t, err) + if !isFinalized { + continue + } + + success := validatorHelper.UnbondValPool(cfg.Secrets.Guardian) + if success { + newIndex, err := l2OutputOracle.NextFinalizeOutputIndex(&bind.CallOpts{}) + require.NoError(t, err) + require.NotEqual(t, newIndex.Uint64(), nextFinalizeOutputIndex.Uint64()) + } + } + } +} + func TestSystemE2EDencunAtGenesis(t *testing.T) { InitParallel(t) @@ -1460,100 +1659,339 @@ func TestChallenge(t *testing.T) { InitParallel(t) cfg := DefaultSystemConfig(t) - cfg.EnableMaliciousValidator = true - cfg.EnableGuardian = true + cfg.EnableChallenge = true + cfg.NonFinalizedOutputs = true // speed up the time till we see checkpoint outputs + cfg.DeployConfig.L1BlockTime = 3 + cfg.DeployConfig.L2BlockTime = 2 // same config with L2OutputOracle sys, err := cfg.Start(t) require.NoError(t, err, "Error starting up system") defer sys.Close() l1Client := sys.Clients["l1"] + validatorHelper := sys.ValidatorHelper() - // deposit to ValidatorPool to be a challenger - err = cfg.DepositValidatorPool(l1Client, cfg.Secrets.Challenger1, big.NewInt(1_000_000_000)) - require.NoError(t, err, "Error challenger deposit to ValidatorPool") + // Deposit to ValidatorPool to be a challenger + validatorHelper.DepositToValPool(cfg.Secrets.Challenger1, big.NewInt(1_000_000_000)) - // OutputOracle is already deployed l2OutputOracle, err := bindings.NewL2OutputOracleCaller(cfg.L1Deployments.L2OutputOracleProxy, l1Client) require.NoError(t, err) - // Colosseum is already deployed colosseum, err := bindings.NewColosseumCaller(cfg.L1Deployments.ColosseumProxy, l1Client) require.NoError(t, err) - // SecurityCouncil is already deployed securityCouncil, err := bindings.NewSecurityCouncil(cfg.L1Deployments.SecurityCouncilProxy, l1Client) require.NoError(t, err) targetOutputOracleIndex := uint64(math.Ceil(float64(testdata.TargetBlockNumber) / float64(cfg.DeployConfig.L2OutputOracleSubmissionInterval))) + challengerAddr := cfg.Secrets.Addresses().Challenger1 - // set a timeout for waiting READY_TO_PROVE of challenge + // Set a timeout for challenge success and output validation by security council ctx, cancel := context.WithTimeout(context.Background(), 200*time.Second) defer cancel() - ticker := time.NewTicker(1 * time.Second) + ticker := time.NewTicker(time.Second) defer ticker.Stop() - for ; ; <-ticker.C { + for challengeCreated, numCheck := false, 0; ; <-ticker.C { select { case <-ctx.Done(): - t.Fatalf("Timed out for challenge test") + t.Fatalf("Timed out waiting for challenge conclusion") default: - challengeStatus, err := colosseum.GetStatus(&bind.CallOpts{}, new(big.Int).SetUint64(targetOutputOracleIndex), cfg.Secrets.Addresses().Challenger1) + challengeStatus, err := colosseum.GetStatus(&bind.CallOpts{}, new(big.Int).SetUint64(targetOutputOracleIndex), challengerAddr) require.NoError(t, err) - // wait until status becomes READY_TO_PROVE - if challengeStatus != chal.StatusReadyToProve { + if challengeStatus == chal.StatusReadyToProve { + challengeCreated = true + } + if !challengeCreated { + continue + } + // after challenge is proven, status is NONE + if challengeStatus != chal.StatusNone { continue } + + // Check validation request tx exists and not executed + toBlock := latestBlock(t, l1Client) + iter, err := securityCouncil.FilterValidationRequested(&bind.FilterOpts{End: &toBlock}, nil) + require.NoError(t, err) + eventExists := iter.Next() + require.True(t, eventExists) + tx, err := securityCouncil.Transactions(&bind.CallOpts{}, iter.Event.TransactionId) + require.NoError(t, err) + eventExists = iter.Next() + require.False(t, eventExists) + err = iter.Close() + require.NoError(t, err) + require.NotEqual(t, tx.Target, common.Address{}) + require.False(t, tx.Executed) + + // Check output is deleted by challenger + output, err := l2OutputOracle.GetL2Output(&bind.CallOpts{}, new(big.Int).SetUint64(targetOutputOracleIndex)) + require.NoError(t, err) + require.Equal(t, output.Submitter, challengerAddr) + require.True(t, val.IsOutputDeleted(output.OutputRoot)) + + numCheck++ + + // after enough time for security council elapsed, the challenge is regarded to be correct + if numCheck >= 5 { + return + } } - break } - cancel() +} - // set a timeout for security council to validate output (provingTimeout + buffer) - provingTimeout, err := colosseum.PROVINGTIMEOUT(&bind.CallOpts{}) - ctx, cancel = context.WithTimeout(context.Background(), time.Duration(provingTimeout.Uint64()+5)*time.Second) +func TestChallengeV2(t *testing.T) { + InitParallel(t) + + cfg := DefaultSystemConfig(t) + cfg.EnableChallenge = true + cfg.NonFinalizedOutputs = true // speed up the time till we see checkpoint outputs + cfg.DeployConfig.L1BlockTime = 3 + cfg.DeployConfig.L2BlockTime = 2 // same config with L2OutputOracle + cfg.ValidatorVersion = valhelper.ValidatorV2 + newTerminationIndex := hexutil.Big(*common.Big1) + cfg.DeployConfig.ValidatorPoolTerminateOutputIndex = &newTerminationIndex + + sys, err := cfg.Start(t) + require.NoError(t, err, "Error starting up system") + defer sys.Close() + + l1Client := sys.Clients["l1"] + validatorHelper := sys.ValidatorHelper() + + // Register to ValidatorManager to be a challenger + validatorHelper.RegisterToValMgr(cfg.Secrets.Challenger1, + cfg.DeployConfig.ValidatorManagerMinActivateAmount.ToInt(), cfg.Secrets.Addresses().Challenger1) + + l2OutputOracle, err := bindings.NewL2OutputOracleCaller(cfg.L1Deployments.L2OutputOracleProxy, l1Client) + require.NoError(t, err) + + colosseum, err := bindings.NewColosseumCaller(cfg.L1Deployments.ColosseumProxy, l1Client) + require.NoError(t, err) + + securityCouncil, err := bindings.NewSecurityCouncil(cfg.L1Deployments.SecurityCouncilProxy, l1Client) + require.NoError(t, err) + + targetOutputOracleIndex := uint64(math.Ceil(float64(testdata.TargetBlockNumber) / float64(cfg.DeployConfig.L2OutputOracleSubmissionInterval))) + challengerAddr := cfg.Secrets.Addresses().Challenger1 + validatorAddr := cfg.Secrets.Addresses().TrustedValidator + beforeAmount, err := validatorHelper.AssetMgrContract.TotalValidatorKro(&bind.CallOpts{}, validatorAddr) + + // Subscribe slash event in ValidatorManager + slashedCh := make(chan *bindings.ValidatorManagerSlashed, 1) + slashedSub, err := validatorHelper.ValMgrContract.WatchSlashed(&bind.WatchOpts{}, slashedCh, []*big.Int{}, []common.Address{}) + require.NoError(t, err) + defer slashedSub.Unsubscribe() + + // Set a timeout for challenge success and output validation by security council + ctx, cancel := context.WithTimeout(context.Background(), 200*time.Second) defer cancel() - for numCheck := 0; ; <-ticker.C { + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + + for challengeCreated, numCheck, slashed := false, 0, false; ; <-ticker.C { select { case <-ctx.Done(): - // after enough time for security council elapsed, the challenge is regarded to be correct - require.True(t, numCheck >= 5, "at least 5 sec should be elapsed after challenge succeed") - return + t.Fatalf("Timed out waiting for challenge conclusion") + case evt := <-slashedCh: + require.Equal(t, validatorAddr, evt.Loser) + require.Equal(t, targetOutputOracleIndex, evt.OutputIndex.Uint64()) + + slashedAmount := evt.Amount + afterAmount, err := validatorHelper.AssetMgrContract.TotalValidatorKro(&bind.CallOpts{}, validatorAddr) + require.NoError(t, err) + require.Equal(t, new(big.Int).Sub(beforeAmount, slashedAmount).Uint64(), afterAmount.Uint64()) + + inJail, err := validatorHelper.ValMgrContract.InJail(&bind.CallOpts{}, validatorAddr) + require.NoError(t, err) + require.True(t, inJail) + + slashed = true default: - challengeStatus, err := colosseum.GetStatus(&bind.CallOpts{}, new(big.Int).SetUint64(targetOutputOracleIndex), cfg.Secrets.Addresses().Challenger1) + challengeStatus, err := colosseum.GetStatus(&bind.CallOpts{}, new(big.Int).SetUint64(targetOutputOracleIndex), challengerAddr) require.NoError(t, err) - // after challenge is proven, status is NONE - if challengeStatus == chal.StatusNone { - // check validation request tx exists and not executed - toBlock := latestBlock(t, l1Client) - iter, err := securityCouncil.FilterValidationRequested(&bind.FilterOpts{End: &toBlock}, nil) - require.NoError(t, err) - eventExists := iter.Next() - require.True(t, eventExists) - tx, err := securityCouncil.Transactions(&bind.CallOpts{}, iter.Event.TransactionId) - require.NoError(t, err) - eventExists = iter.Next() - require.False(t, eventExists) - err = iter.Close() - require.NoError(t, err) - require.NotEqual(t, tx.Target, common.Address{}) - require.False(t, tx.Executed) + if challengeStatus == chal.StatusReadyToProve { + challengeCreated = true - // check output is deleted by challenger - output, err := l2OutputOracle.GetL2Output(&bind.CallOpts{}, new(big.Int).SetUint64(targetOutputOracleIndex)) + bond, err := validatorHelper.AssetMgrContract.TotalValidatorKroBonded(&bind.CallOpts{}, challengerAddr) require.NoError(t, err) - require.Equal(t, output.Submitter, cfg.Secrets.Addresses().Challenger1) - require.True(t, val.IsOutputDeleted(output.OutputRoot)) + require.Equal(t, cfg.DeployConfig.AssetManagerBondAmount.ToInt().Uint64(), bond.Uint64()) + } + if !challengeCreated { + continue + } + // after challenge is proven, status is NONE + if challengeStatus != chal.StatusNone { + continue + } - numCheck++ - if numCheck >= 5 { - return + // check validation request tx exists and not executed + toBlock := latestBlock(t, l1Client) + iter, err := securityCouncil.FilterValidationRequested(&bind.FilterOpts{End: &toBlock}, nil) + require.NoError(t, err) + eventExists := iter.Next() + require.True(t, eventExists) + tx, err := securityCouncil.Transactions(&bind.CallOpts{}, iter.Event.TransactionId) + require.NoError(t, err) + eventExists = iter.Next() + require.False(t, eventExists) + err = iter.Close() + require.NoError(t, err) + require.NotEqual(t, tx.Target, common.Address{}) + require.False(t, tx.Executed) + + // check output is deleted by challenger + output, err := l2OutputOracle.GetL2Output(&bind.CallOpts{}, new(big.Int).SetUint64(targetOutputOracleIndex)) + require.NoError(t, err) + require.Equal(t, output.Submitter, challengerAddr) + require.True(t, val.IsOutputDeleted(output.OutputRoot)) + + numCheck++ + } + + // after enough time for security council elapsed, the challenge is regarded to be correct + if slashed && numCheck >= 5 { + return + } + } +} + +func TestChallengerTimeoutByGuardian(t *testing.T) { + InitParallel(t) + + cfg := DefaultSystemConfig(t) + cfg.EnableChallenge = true + cfg.NonFinalizedOutputs = true // speed up the time till we see checkpoint outputs + cfg.DeployConfig.L1BlockTime = 3 + cfg.DeployConfig.L2BlockTime = 2 // same config with L2OutputOracle + + sys, err := cfg.Start(t) + require.NoError(t, err, "Error starting up system") + defer sys.Close() + + l1Client := sys.Clients["l1"] + validatorHelper := sys.ValidatorHelper() + + // deposit to ValidatorPool to be a challenger + validatorHelper.DepositToValPool(cfg.Secrets.Challenger1, big.NewInt(1_000_000_000)) + + l2OutputOracle, err := bindings.NewL2OutputOracleCaller(cfg.L1Deployments.L2OutputOracleProxy, l1Client) + require.NoError(t, err) + + colosseum, err := bindings.NewColosseum(cfg.L1Deployments.ColosseumProxy, l1Client) + require.NoError(t, err) + + targetOutputOracleIndex := new(big.Int).SetUint64( + uint64(math.Ceil(float64(testdata.TargetBlockNumber) / float64(cfg.DeployConfig.L2OutputOracleSubmissionInterval)))) + challengerAddr := cfg.Secrets.Addresses().Challenger1 + + // set a timeout for waiting creation period of challenge to end + ctx, cancel := context.WithTimeout(context.Background(), 200*time.Second) + defer cancel() + + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + + for ; ; <-ticker.C { + select { + case <-ctx.Done(): + t.Fatalf("Timed out at challenger timeout test for guardian") + default: + nextOutputIndex, err := l2OutputOracle.NextOutputIndex(&bind.CallOpts{}) + require.NoError(t, err) + + // wait until target output is submitted + if nextOutputIndex.Cmp(targetOutputOracleIndex) <= 0 { + continue + } + + challengeStatus, err := colosseum.GetStatus(&bind.CallOpts{}, targetOutputOracleIndex, challengerAddr) + require.NoError(t, err) + + // wait until challenge is created + if challengeStatus == chal.StatusNone { + continue + } + + // stop challenger to make the status to ChallengerTimeout + if sys.Challenger != nil { + if err := sys.Challenger.Stop(); err != nil { + t.Fatalf("Failed to stop challenger") } + sys.Challenger = nil + } + // stop asserter not to call challenger timeout + if sys.Validator != nil { + if err := sys.Validator.Stop(); err != nil { + t.Fatalf("Failed to stop validator") + } + sys.Validator = nil + } + + inCreationPeriod, err := colosseum.IsInCreationPeriod(&bind.CallOpts{}, targetOutputOracleIndex) + require.NoError(t, err) + + // wait until creation period is ended + if inCreationPeriod { + continue + } + + challengeStatus, err = colosseum.GetStatus(&bind.CallOpts{}, targetOutputOracleIndex, challengerAddr) + require.NoError(t, err) + + // assert that asserter didn't call challenger timeout + if challengeStatus != chal.StatusChallengerTimeout { + continue + } + } + break + } + + // set a timeout for security council to call challenger timeout + ctx, cancel = context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + + for ; ; <-ticker.C { + select { + case <-ctx.Done(): + t.Fatalf("Timed out at challenger timeout test for guardian") + default: + challengeStatus, err := colosseum.GetStatus(&bind.CallOpts{}, targetOutputOracleIndex, challengerAddr) + require.NoError(t, err) + + // after challenger timeout is called, status is NONE + if challengeStatus != chal.StatusNone { + continue } + + // assert that the one who called challenger timeout is guardian + toBlock := latestBlock(t, l1Client) + iter, err := colosseum.FilterChallengerTimedOut( + &bind.FilterOpts{End: &toBlock}, + []*big.Int{targetOutputOracleIndex}, + []common.Address{challengerAddr}, + ) + require.NoError(t, err) + eventExists := iter.Next() + require.True(t, eventExists) + txHash := iter.Event.Raw.TxHash + err = iter.Close() + require.NoError(t, err) + + tx, _, err := l1Client.TransactionByHash(context.Background(), txHash) + require.NoError(t, err) + receipt, err := l1Client.TransactionReceipt(context.Background(), txHash) + require.NoError(t, err) + from, err := l1Client.TransactionSender(context.Background(), tx, receipt.BlockHash, receipt.TransactionIndex) + require.NoError(t, err) + require.Equal(t, from, cfg.Secrets.Addresses().Guardian) + + return } } } diff --git a/ops-devnet/docker-compose.yml b/ops-devnet/docker-compose.yml index 23da4f4739..49e4ad13a0 100644 --- a/ops-devnet/docker-compose.yml +++ b/ops-devnet/docker-compose.yml @@ -198,6 +198,8 @@ services: VALIDATOR_L2OO_ADDRESS: "${L2OO_ADDRESS}" VALIDATOR_COLOSSEUM_ADDRESS: "${COLOSSEUM_ADDRESS}" VALIDATOR_VALPOOL_ADDRESS: "${VALPOOL_ADDRESS}" + VALIDATOR_VALMGR_ADDRESS: "${VALMGR_ADDRESS}" + VALIDATOR_ASSETMANAGER_ADDRESS: "${ASSETMANAGER_ADDRESS}" VALIDATOR_PPROF_ENABLED: "true" VALIDATOR_METRICS_ENABLED: "true" VALIDATOR_ALLOW_NON_FINALIZED: "true" @@ -230,6 +232,8 @@ services: VALIDATOR_L2OO_ADDRESS: "${L2OO_ADDRESS}" VALIDATOR_COLOSSEUM_ADDRESS: "${COLOSSEUM_ADDRESS}" VALIDATOR_VALPOOL_ADDRESS: "${VALPOOL_ADDRESS}" + VALIDATOR_VALMGR_ADDRESS: "${VALMGR_ADDRESS}" + VALIDATOR_ASSETMANAGER_ADDRESS: "${ASSETMANAGER_ADDRESS}" VALIDATOR_ALLOW_NON_FINALIZED: "true" VALIDATOR_PROVER_RPC: "0.0.0.0:0" VALIDATOR_OUTPUT_SUBMITTER_ENABLED: "false" diff --git a/package.json b/package.json index 6113001c7a..397cfd6da2 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "private": true, "engines": { "node": ">=16", - "pnpm": ">=8" + "pnpm": ">=9" }, "scripts": { "clean": "pnpm recursive run clean; rm -rf node_modules packages/*/node_modules && echo 'Finished cleaning. Run `pnpm install && pnpm build` from root of repo to rebuild the repo.'", diff --git a/packages/contracts/.gas-snapshot b/packages/contracts/.gas-snapshot index 1209f9f0e8..9397173d47 100644 --- a/packages/contracts/.gas-snapshot +++ b/packages/contracts/.gas-snapshot @@ -1,78 +1,156 @@ -ColosseumTest:test_bisect_cancelChallenge_succeeds() (gas: 2703534) -ColosseumTest:test_bisect_finalizedOutput_reverts() (gas: 461816) -ColosseumTest:test_bisect_ifNotYourTurn_reverts() (gas: 458959) -ColosseumTest:test_bisect_succeeds() (gas: 435065) -ColosseumTest:test_bisect_whenAsserterTimedOut_reverts() (gas: 461426) -ColosseumTest:test_bisect_whenChallengerTimedOut_reverts() (gas: 457332) -ColosseumTest:test_bisect_withBadSegments_reverts() (gas: 483077) -ColosseumTest:test_cancelChallenge_noChallenge_reverts() (gas: 15895) -ColosseumTest:test_cancelChallenge_outputNotDeleted_reverts() (gas: 444353) -ColosseumTest:test_cancelChallenge_senderNotChallenger_reverts() (gas: 2921844) -ColosseumTest:test_cancelChallenge_succeeds() (gas: 2663086) -ColosseumTest:test_cancelChallenge_whenChallengerTimedOut_reverts() (gas: 2918908) -ColosseumTest:test_challengerNotCloseWhenAsserterTimeout_succeeds() (gas: 452962) -ColosseumTest:test_challengerTimeout_succeeds() (gas: 431293) -ColosseumTest:test_constructor() (gas: 22387) -ColosseumTest:test_createChallenge_afterChallengeProven_reverts() (gas: 2443010) -ColosseumTest:test_createChallenge_afterChallengerTimedOut_succeeds() (gas: 711775) -ColosseumTest:test_createChallenge_afterCreationPeriod_reverts() (gas: 46712) -ColosseumTest:test_createChallenge_afterDismissed_succeeds() (gas: 2797726) -ColosseumTest:test_createChallenge_asAsserter_reverts() (gas: 47544) -ColosseumTest:test_createChallenge_existedChallenge_reverts() (gas: 450104) -ColosseumTest:test_createChallenge_finalizedOutput_reverts() (gas: 46428) -ColosseumTest:test_createChallenge_genesisOutput_reverts() (gas: 33901) -ColosseumTest:test_createChallenge_notSubmittedOutput_reverts() (gas: 33407) -ColosseumTest:test_createChallenge_otherChallenger_succeeds() (gas: 855413) -ColosseumTest:test_createChallenge_succeeds() (gas: 437731) -ColosseumTest:test_createChallenge_withBadSegments_reverts() (gas: 112613) -ColosseumTest:test_createChallenge_wrongFork_reverts() (gas: 45197) -ColosseumTest:test_dismissChallenge_notSecurityCouncil_reverts() (gas: 2434906) -ColosseumTest:test_dismissChallenge_outputNotDeleted_reverts() (gas: 16395) -ColosseumTest:test_dismissChallenge_succeeds() (gas: 2449751) -ColosseumTest:test_forceDeleteOutput_alreadyDeletedOutput_reverts() (gas: 590423) -ColosseumTest:test_forceDeleteOutput_finalizedOutput_reverts() (gas: 579676) -ColosseumTest:test_forceDeleteOutput_notSecurityCouncil_reverts() (gas: 15991) -ColosseumTest:test_forceDeleteOutput_succeeds() (gas: 584036) -ColosseumTest:test_isInCreationPeriod_succeeds() (gas: 43125) -ColosseumTest:test_proveFault_cancelChallenge_succeeds() (gas: 2878434) -ColosseumTest:test_proveFault_finalizedOutput_reverts() (gas: 653340) -ColosseumTest:test_proveFault_succeeds() (gas: 2430758) +AssetManagerTest:test_bondValidatorKro_callerNotValMgr_reverts() (gas: 15598) +AssetManagerTest:test_bondValidatorKro_insufficientAsset_reverts() (gas: 20521) +AssetManagerTest:test_bondValidatorKro_succeeds() (gas: 275433) +AssetManagerTest:test_claimKghReward_succeeds() (gas: 447217) +AssetManagerTest:test_claimKghReward_zeroBoostedReward_reverts() (gas: 421099) +AssetManagerTest:test_constructor_succeeds() (gas: 31906) +AssetManagerTest:test_decreaseBalanceWithChallenge_callerNotValMgr_reverts() (gas: 15673) +AssetManagerTest:test_decreaseBalanceWithChallenge_succeeds() (gas: 282304) +AssetManagerTest:test_delegateKghBatch_claimBoostedReward_succeeds() (gas: 584327) +AssetManagerTest:test_delegateKghBatch_succeeds() (gas: 1041426) +AssetManagerTest:test_delegateKghBatch_validatorInJail_reverts() (gas: 301551) +AssetManagerTest:test_delegateKghBatch_validatorStatusExited_reverts() (gas: 277328) +AssetManagerTest:test_delegateKghBatch_validatorStatusNone_reverts() (gas: 26662) +AssetManagerTest:test_delegateKghBatch_zeroTokenIds_reverts() (gas: 276074) +AssetManagerTest:test_delegateKgh_claimBoostedReward_succeeds() (gas: 518863) +AssetManagerTest:test_delegateKgh_succeeds() (gas: 434728) +AssetManagerTest:test_delegateKgh_validatorInJail_reverts() (gas: 301163) +AssetManagerTest:test_delegateKgh_validatorStatusExited_reverts() (gas: 277046) +AssetManagerTest:test_delegateKgh_validatorStatusNone_reverts() (gas: 26252) +AssetManagerTest:test_delegate_succeeds() (gas: 368718) +AssetManagerTest:test_delegate_validatorInJail_reverts() (gas: 303399) +AssetManagerTest:test_delegate_validatorStatusExited_reverts() (gas: 278816) +AssetManagerTest:test_delegate_validatorStatusNone_reverts() (gas: 28510) +AssetManagerTest:test_delegate_zeroAsset_reverts() (gas: 278292) +AssetManagerTest:test_depositToRegister_callerNotValMgr_reverts() (gas: 20052) +AssetManagerTest:test_depositToRegister_succeeds() (gas: 146718) +AssetManagerTest:test_depositToRegister_zeroWithdrawAcc_reverts() (gas: 20461) +AssetManagerTest:test_deposit_activate_succeeds() (gas: 303795) +AssetManagerTest:test_deposit_inJailNotActivate_succeeds() (gas: 235896) +AssetManagerTest:test_deposit_notActivate_succeeds() (gas: 208180) +AssetManagerTest:test_deposit_succeeds() (gas: 314091) +AssetManagerTest:test_deposit_validatorStatusNone_reverts() (gas: 28672) +AssetManagerTest:test_deposit_zeroAsset_reverts() (gas: 13482) +AssetManagerTest:test_increaseBalanceWithChallenge_callerNotValMgr_reverts() (gas: 15809) +AssetManagerTest:test_increaseBalanceWithChallenge_succeeds() (gas: 113595) +AssetManagerTest:test_increaseBalanceWithChallenge_winnerIsSC_succeeds() (gas: 64186) +AssetManagerTest:test_increaseBalanceWithReward_callerNotValMgr_reverts() (gas: 15992) +AssetManagerTest:test_increaseBalanceWithReward_succeeds() (gas: 489107) +AssetManagerTest:test_increaseBalanceWithReward_validatorIsSC_succeeds() (gas: 80038) +AssetManagerTest:test_revertDecreaseBalanceWithChallenge_callerNotValMgr_reverts() (gas: 15692) +AssetManagerTest:test_revertDecreaseBalanceWithChallenge_succeeds() (gas: 46440) +AssetManagerTest:test_unbondValidatorKro_callerNotValMgr_reverts() (gas: 15661) +AssetManagerTest:test_unbondValidatorKro_succeeds() (gas: 283547) +AssetManagerTest:test_undelegateKghBatch_invalidTokenIds_reverts() (gas: 18710) +AssetManagerTest:test_undelegateKghBatch_noBoostedReward_succeeds() (gas: 1063101) +AssetManagerTest:test_undelegateKghBatch_notElapsedMinDelegationPeriod_reverts() (gas: 500485) +AssetManagerTest:test_undelegateKghBatch_succeeds() (gas: 1118214) +AssetManagerTest:test_undelegateKghBatch_zeroTokenIds_reverts() (gas: 16039) +AssetManagerTest:test_undelegateKgh_invalidTokenIds_reverts() (gas: 18005) +AssetManagerTest:test_undelegateKgh_noBoostedReward_succeeds() (gas: 409163) +AssetManagerTest:test_undelegateKgh_notElapsedMinDelegationPeriod_reverts() (gas: 420946) +AssetManagerTest:test_undelegateKgh_severalDelegators_succeeds() (gas: 594509) +AssetManagerTest:test_undelegateKgh_succeeds() (gas: 450188) +AssetManagerTest:test_undelegate_largeAsset_reverts() (gas: 21036) +AssetManagerTest:test_undelegate_notElapsedMinDelegationPeriod_reverts() (gas: 356857) +AssetManagerTest:test_undelegate_removedFromValidatorTree_succeeds() (gas: 337871) +AssetManagerTest:test_undelegate_severalDelegators_succeeds() (gas: 466609) +AssetManagerTest:test_undelegate_succeeds() (gas: 395021) +AssetManagerTest:test_undelegate_zeroAsset_reverts() (gas: 15713) +AssetManagerTest:test_withdraw_insufficientValidatorKro_reverts() (gas: 276194) +AssetManagerTest:test_withdraw_notElapsedMinDelegationPeriod_reverts() (gas: 269749) +AssetManagerTest:test_withdraw_notExpiredJailPeriod_reverts() (gas: 286622) +AssetManagerTest:test_withdraw_notWithdrawAcc_reverts() (gas: 267624) +AssetManagerTest:test_withdraw_succeeds() (gas: 270093) +AssetManagerTest:test_withdraw_validatorKroBonded_reverts() (gas: 278896) +AssetManagerTest:test_withdraw_zeroAsset_reverts() (gas: 269207) +ColosseumTest:test_bisect_cancelChallenge_senderNotChallenger_reverts() (gas: 3046639) +ColosseumTest:test_bisect_cancelChallenge_succeeds() (gas: 2831053) +ColosseumTest:test_bisect_finalizedOutput_reverts() (gas: 465903) +ColosseumTest:test_bisect_ifNotYourTurn_reverts() (gas: 463101) +ColosseumTest:test_bisect_succeeds() (gas: 438785) +ColosseumTest:test_bisect_whenAsserterTimedOut_reverts() (gas: 465515) +ColosseumTest:test_bisect_whenChallengerTimedOut_reverts() (gas: 460604) +ColosseumTest:test_bisect_withBadSegments_reverts() (gas: 486727) +ColosseumTest:test_cancelChallenge_noChallenge_reverts() (gas: 35450) +ColosseumTest:test_cancelChallenge_outputNotDeleted_reverts() (gas: 448697) +ColosseumTest:test_cancelChallenge_senderNotChallenger_reverts() (gas: 3050503) +ColosseumTest:test_cancelChallenge_succeeds() (gas: 2781055) +ColosseumTest:test_cancelChallenge_whenChallengerTimedOut_reverts() (gas: 3043892) +ColosseumTest:test_challengerNotCloseWhenAsserterTimeout_succeeds() (gas: 457433) +ColosseumTest:test_challengerTimeout_succeeds() (gas: 436222) +ColosseumTest:test_constructor_succeeds() (gas: 39410) +ColosseumTest:test_createChallenge_afterChallengeProven_reverts() (gas: 2565549) +ColosseumTest:test_createChallenge_afterChallengerTimedOut_succeeds() (gas: 718692) +ColosseumTest:test_createChallenge_afterCreationPeriod_reverts() (gas: 54363) +ColosseumTest:test_createChallenge_afterDismissed_succeeds() (gas: 2851976) +ColosseumTest:test_createChallenge_asAsserter_reverts() (gas: 54916) +ColosseumTest:test_createChallenge_existedChallenge_reverts() (gas: 454878) +ColosseumTest:test_createChallenge_genesisOutput_reverts() (gas: 20894) +ColosseumTest:test_createChallenge_notSubmittedOutput_reverts() (gas: 45093) +ColosseumTest:test_createChallenge_otherChallenger_succeeds() (gas: 863698) +ColosseumTest:test_createChallenge_succeeds() (gas: 442407) +ColosseumTest:test_createChallenge_withBadSegments_reverts() (gas: 135055) +ColosseumTest:test_createChallenge_wrongFork_reverts() (gas: 52602) +ColosseumTest:test_dismissChallenge_finalizedOutput_reverts() (gas: 583918) +ColosseumTest:test_dismissChallenge_invalidAddressGiven_reverts() (gas: 2577707) +ColosseumTest:test_dismissChallenge_invalidOutputGiven_reverts() (gas: 2567255) +ColosseumTest:test_dismissChallenge_invalidPublicInput_reverts() (gas: 2571294) +ColosseumTest:test_dismissChallenge_notSecurityCouncil_reverts() (gas: 2556986) +ColosseumTest:test_dismissChallenge_outputNotDeleted_reverts() (gas: 37588) +ColosseumTest:test_dismissChallenge_succeeds() (gas: 2501391) +ColosseumTest:test_forceDeleteOutput_alreadyDeletedOutput_reverts() (gas: 596833) +ColosseumTest:test_forceDeleteOutput_finalizedOutput_reverts() (gas: 581327) +ColosseumTest:test_forceDeleteOutput_notSecurityCouncil_reverts() (gas: 15822) +ColosseumTest:test_forceDeleteOutput_succeeds() (gas: 590479) +ColosseumTest:test_initialize_succeeds() (gas: 34291) +ColosseumTest:test_isInCreationPeriod_succeeds() (gas: 43151) +ColosseumTest:test_proveFault_cancelChallenge_succeeds() (gas: 2978962) +ColosseumTest:test_proveFault_finalizedOutput_reverts() (gas: 698828) +ColosseumTest:test_proveFault_succeeds() (gas: 2552943) +Colosseum_ValidatorSystemUpgrade_Test:test_cancelChallenge_callValidatorManager_succeeds() (gas: 2851640) +Colosseum_ValidatorSystemUpgrade_Test:test_challengerTimeout_callValidatorManager_succeeds() (gas: 479816) +Colosseum_ValidatorSystemUpgrade_Test:test_createChallenge_callValidatorManager_succeeds() (gas: 440957) +Colosseum_ValidatorSystemUpgrade_Test:test_createChallenge_notSatisfyCondition_reverts() (gas: 77683) +Colosseum_ValidatorSystemUpgrade_Test:test_dismissChallenge_callValidatorManager_succeeds() (gas: 2822011) +Colosseum_ValidatorSystemUpgrade_Test:test_forceDeleteOutput_callValidatorManager_succeeds() (gas: 661517) +Colosseum_ValidatorSystemUpgrade_Test:test_proveFault_callValidatorManager_succeeds() (gas: 2587483) CrossDomainMessenger_BaseGas_Test:test_baseGas_succeeds() (gas: 11763) -CrossDomainOwnable2_Test:test_onlyOwner_notMessenger_reverts() (gas: 8451) +CrossDomainOwnable2_Test:test_onlyOwner_notMessenger_reverts() (gas: 8496) CrossDomainOwnable2_Test:test_onlyOwner_notOwner2_reverts() (gas: 57515) -CrossDomainOwnable2_Test:test_onlyOwner_notOwner_reverts() (gas: 16603) +CrossDomainOwnable2_Test:test_onlyOwner_notOwner_reverts() (gas: 16581) CrossDomainOwnable2_Test:test_onlyOwner_succeeds() (gas: 73549) -CrossDomainOwnable3_Test:test_constructor_succeeds() (gas: 10648) -CrossDomainOwnable3_Test:test_crossDomainOnlyOwner_notMessenger_reverts() (gas: 28385) -CrossDomainOwnable3_Test:test_crossDomainOnlyOwner_notOwner2_reverts() (gas: 74033) -CrossDomainOwnable3_Test:test_crossDomainOnlyOwner_notOwner_reverts() (gas: 32065) +CrossDomainOwnable3_Test:test_constructor_succeeds() (gas: 10626) +CrossDomainOwnable3_Test:test_crossDomainOnlyOwner_notMessenger_reverts() (gas: 28436) +CrossDomainOwnable3_Test:test_crossDomainOnlyOwner_notOwner2_reverts() (gas: 74082) +CrossDomainOwnable3_Test:test_crossDomainOnlyOwner_notOwner_reverts() (gas: 32071) CrossDomainOwnable3_Test:test_crossDomainTransferOwnership_succeeds() (gas: 91638) -CrossDomainOwnable3_Test:test_localOnlyOwner_notOwner_reverts() (gas: 13239) -CrossDomainOwnable3_Test:test_localOnlyOwner_succeeds() (gas: 35326) -CrossDomainOwnable3_Test:test_localTransferOwnership_succeeds() (gas: 52240) -CrossDomainOwnable3_Test:test_transferOwnershipNoLocal_succeeds() (gas: 48766) -CrossDomainOwnable3_Test:test_transferOwnership_noLocalZeroAddress_reverts() (gas: 12063) -CrossDomainOwnable3_Test:test_transferOwnership_notOwner_reverts() (gas: 13461) +CrossDomainOwnable3_Test:test_localOnlyOwner_notOwner_reverts() (gas: 13223) +CrossDomainOwnable3_Test:test_localOnlyOwner_succeeds() (gas: 35304) +CrossDomainOwnable3_Test:test_localTransferOwnership_succeeds() (gas: 52290) +CrossDomainOwnable3_Test:test_transferOwnershipNoLocal_succeeds() (gas: 48772) +CrossDomainOwnable3_Test:test_transferOwnership_noLocalZeroAddress_reverts() (gas: 12108) +CrossDomainOwnable3_Test:test_transferOwnership_notOwner_reverts() (gas: 13467) CrossDomainOwnable3_Test:test_transferOwnership_zeroAddress_reverts() (gas: 12129) -CrossDomainOwnableThroughPortal_Test:test_depositTransaction_crossDomainOwner_succeeds() (gas: 72640) +CrossDomainOwnableThroughPortal_Test:test_depositTransaction_crossDomainOwner_succeeds() (gas: 72609) CrossDomainOwnable_Test:test_onlyOwner_notOwner_reverts() (gas: 10597) CrossDomainOwnable_Test:test_onlyOwner_succeeds() (gas: 34883) -FeeVault_Test:test_constructor_succeeds() (gas: 10766) +FeeVault_Test:test_constructor_succeeds() (gas: 10832) FeeVault_Test:test_minWithdrawalAmount_succeeds() (gas: 10737) FeeVault_Test:test_withdrawToL2_fromOtherEOA_reverts() (gas: 8729) FeeVault_Test:test_withdrawToL2_succeeds() (gas: 68809) FeeVault_Test:test_withdraw_fromOtherEOA_reverts() (gas: 8720) GasBenchMark_KromaPortal:test_depositTransaction_benchmark() (gas: 75076) -GasBenchMark_KromaPortal:test_depositTransaction_benchmark_1() (gas: 75709) -GasBenchMark_KromaPortal:test_proveWithdrawalTransaction_benchmark() (gas: 263545) -GasBenchMark_L1CrossDomainMessenger:test_sendMessage_benchmark_0() (gas: 342622) -GasBenchMark_L1CrossDomainMessenger:test_sendMessage_benchmark_1() (gas: 2940873) -GasBenchMark_L1StandardBridge_Deposit:test_depositERC20_benchmark_0() (gas: 518893) -GasBenchMark_L1StandardBridge_Deposit:test_depositERC20_benchmark_1() (gas: 4031086) +GasBenchMark_KromaPortal:test_depositTransaction_benchmark_1() (gas: 75687) +GasBenchMark_KromaPortal:test_proveWithdrawalTransaction_benchmark() (gas: 263529) +GasBenchMark_L1CrossDomainMessenger:test_sendMessage_benchmark_0() (gas: 342689) +GasBenchMark_L1CrossDomainMessenger:test_sendMessage_benchmark_1() (gas: 2940851) +GasBenchMark_L1StandardBridge_Deposit:test_depositERC20_benchmark_0() (gas: 518894) +GasBenchMark_L1StandardBridge_Deposit:test_depositERC20_benchmark_1() (gas: 4031087) GasBenchMark_L1StandardBridge_Deposit:test_depositETH_benchmark_0() (gas: 421662) GasBenchMark_L1StandardBridge_Deposit:test_depositETH_benchmark_1() (gas: 3467561) -GasBenchMark_L1StandardBridge_Finalize:test_finalizeBridgeETH_benchmark() (gas: 32274) -GasBenchMark_L2OutputOracle:test_submitL2Output_benchmark() (gas: 155626) +GasBenchMark_L1StandardBridge_Finalize:test_finalizeBridgeETH_benchmark() (gas: 32252) +GasBenchMark_L2OutputOracle:test_submitL2Output_benchmark() (gas: 157518) GasPriceOracleBedrock_Test:test_baseFee_succeeds() (gas: 8347) GasPriceOracleBedrock_Test:test_decimals_succeeds() (gas: 6189) GasPriceOracleBedrock_Test:test_gasPrice_succeeds() (gas: 8316) @@ -90,191 +168,221 @@ GasPriceOracleEcotone_Test:test_l1BaseFee_succeeds() (gas: 10745) GasPriceOracleEcotone_Test:test_overhead_legacyFunction_reverts() (gas: 10507) GasPriceOracleEcotone_Test:test_scalar_legacyFunction_reverts() (gas: 10517) GasPriceOracleEcotone_Test:test_setEcotone_wrongCaller_reverts() (gas: 11616) -GovernanceToken_Test:test_approve_succeeds() (gas: 138034) -GovernanceToken_Test:test_burnFrom_succeeds() (gas: 126920) -GovernanceToken_Test:test_burn_fromBridge_succeeds() (gas: 89023) -GovernanceToken_Test:test_burn_succeeds() (gas: 116336) -GovernanceToken_Test:test_constructor_succeeds() (gas: 19167) -GovernanceToken_Test:test_decreaseAllowance_succeeds() (gas: 142030) -GovernanceToken_Test:test_increaseAllowance_succeeds() (gas: 142034) -GovernanceToken_Test:test_mint_fromBridge_succeeds() (gas: 110807) -GovernanceToken_Test:test_mint_fromNotOwner_reverts() (gas: 19242) -GovernanceToken_Test:test_transferFrom_succeeds() (gas: 151175) -GovernanceToken_Test:test_transfer_succeeds() (gas: 142639) +GovernanceToken_Test:test_approve_succeeds() (gas: 147735) +GovernanceToken_Test:test_burn_fromBridge_succeeds() (gas: 101673) +GovernanceToken_Test:test_burn_fromNotBridge_reverts() (gas: 119917) +GovernanceToken_Test:test_constructor_succeeds() (gas: 26460) +GovernanceToken_Test:test_decreaseAllowance_succeeds() (gas: 152214) +GovernanceToken_Test:test_increaseAllowance_succeeds() (gas: 152329) +GovernanceToken_Test:test_mint_fromBridge_succeeds() (gas: 120468) +GovernanceToken_Test:test_mint_fromNotMinter_reverts() (gas: 29912) +GovernanceToken_Test:test_mint_fromOwner_succeeds() (gas: 122562) +GovernanceToken_Test:test_transferFrom_succeeds() (gas: 162551) +GovernanceToken_Test:test_transfer_succeeds() (gas: 153430) Hashing_hashDepositSource_Test:test_hashDepositSource_succeeds() (gas: 639) -KromaMintableERC20_Test:test_bridge_succeeds() (gas: 7707) -KromaMintableERC20_Test:test_burn_notBridge_reverts() (gas: 11172) -KromaMintableERC20_Test:test_burn_succeeds() (gas: 50863) -KromaMintableERC20_Test:test_erc165_supportsInterface_succeeds() (gas: 6671) -KromaMintableERC20_Test:test_mint_notBridge_reverts() (gas: 11107) -KromaMintableERC20_Test:test_mint_succeeds() (gas: 63487) +KromaMintableERC20_Test:test_bridge_succeeds() (gas: 7750) +KromaMintableERC20_Test:test_burn_notBridge_reverts() (gas: 11156) +KromaMintableERC20_Test:test_burn_succeeds() (gas: 50872) +KromaMintableERC20_Test:test_erc165_supportsInterface_succeeds() (gas: 6649) +KromaMintableERC20_Test:test_mint_notBridge_reverts() (gas: 11113) +KromaMintableERC20_Test:test_mint_succeeds() (gas: 63493) KromaMintableERC20_Test:test_remoteToken_succeeds() (gas: 7664) KromaMintableERC20_Test:test_semver_succeeds() (gas: 7029) -KromaMintableERC721Factory_Test:test_constructor_succeeds() (gas: 8424) -KromaMintableERC721Factory_Test:test_createKromaMintableERC721_succeeds() (gas: 2120328) -KromaMintableERC721Factory_Test:test_createKromaMintableERC721_zeroRemoteToken_reverts() (gas: 9451) -KromaMintableERC721_Test:test_burn_notBridge_reverts() (gas: 137360) -KromaMintableERC721_Test:test_burn_succeeds() (gas: 117707) -KromaMintableERC721_Test:test_constructor_succeeds() (gas: 22529) -KromaMintableERC721_Test:test_safeMint_notBridge_reverts() (gas: 11197) -KromaMintableERC721_Test:test_safeMint_succeeds() (gas: 140972) -KromaMintableERC721_Test:test_tokenURI_succeeds() (gas: 162846) -KromaMintableTokenFactory_Test:test_bridge_succeeds() (gas: 7607) -KromaMintableTokenFactory_Test:test_createKromaMintableERC20_remoteIsZero_succeeds() (gas: 9387) -KromaMintableTokenFactory_Test:test_createKromaMintableERC20_sameTwice_succeeds() (gas: 1900829) +KromaMintableERC721Factory_Test:test_constructor_succeeds() (gas: 8402) +KromaMintableERC721Factory_Test:test_createKromaMintableERC721_succeeds() (gas: 2120306) +KromaMintableERC721Factory_Test:test_createKromaMintableERC721_zeroRemoteToken_reverts() (gas: 9429) +KromaMintableERC721_Test:test_burn_notBridge_reverts() (gas: 137350) +KromaMintableERC721_Test:test_burn_succeeds() (gas: 117716) +KromaMintableERC721_Test:test_constructor_succeeds() (gas: 22507) +KromaMintableERC721_Test:test_safeMint_notBridge_reverts() (gas: 11181) +KromaMintableERC721_Test:test_safeMint_succeeds() (gas: 140978) +KromaMintableERC721_Test:test_tokenURI_succeeds() (gas: 162852) +KromaMintableTokenFactory_Test:test_bridge_succeeds() (gas: 7673) +KromaMintableTokenFactory_Test:test_createKromaMintableERC20_remoteIsZero_succeeds() (gas: 9365) +KromaMintableTokenFactory_Test:test_createKromaMintableERC20_sameTwice_succeeds() (gas: 1900807) KromaMintableTokenFactory_Test:test_createKromaMintableERC20_succeeds() (gas: 956445) KromaPortalUpgradeable_Test:test_initialize_cannotInitImpl_reverts() (gas: 11006) KromaPortalUpgradeable_Test:test_initialize_cannotInitProxy_reverts() (gas: 15930) KromaPortalUpgradeable_Test:test_params_initValuesOnProxy_succeeds() (gas: 21800) KromaPortalUpgradeable_Test:test_upgradeToAndCall_upgrading_succeeds() (gas: 180688) -KromaPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifOutputRootChanges_reverts() (gas: 300723) -KromaPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifOutputTimestampIsNotFinalized_reverts() (gas: 304182) +KromaPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifOutputRootChanges_reverts() (gas: 300767) +KromaPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifOutputTimestampIsNotFinalized_reverts() (gas: 304248) KromaPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifWithdrawalNotProven_reverts() (gas: 41755) -KromaPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifWithdrawalProofNotOldEnough_reverts() (gas: 293766) -KromaPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onInsufficientGas_reverts() (gas: 291334) -KromaPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onRecentWithdrawal_reverts() (gas: 274532) -KromaPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onReentrancy_reverts() (gas: 329279) -KromaPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onReplay_reverts() (gas: 340503) +KromaPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_ifWithdrawalProofNotOldEnough_reverts() (gas: 293788) +KromaPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onInsufficientGas_reverts() (gas: 291400) +KromaPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onRecentWithdrawal_reverts() (gas: 274554) +KromaPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onReentrancy_reverts() (gas: 329410) +KromaPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_onReplay_reverts() (gas: 340591) KromaPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_paused_reverts() (gas: 53614) -KromaPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_provenWithdrawalHash_succeeds() (gas: 329613) -KromaPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_targetFails_fails() (gas: 8797746687696168233) -KromaPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_timestampLessThanL2OracleStart_reverts() (gas: 291313) -KromaPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_onInvalidOutputRootProof_reverts() (gas: 101136) -KromaPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_onSelfCall_reverts() (gas: 66247) +KromaPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_provenWithdrawalHash_succeeds() (gas: 329679) +KromaPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_targetFails_fails() (gas: 8797746687696168235) +KromaPortal_FinalizeWithdrawal_Test:test_finalizeWithdrawalTransaction_timestampLessThanL2OracleStart_reverts() (gas: 291335) +KromaPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_onInvalidOutputRootProof_reverts() (gas: 101114) +KromaPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_onSelfCall_reverts() (gas: 66250) KromaPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_paused_reverts() (gas: 87066) -KromaPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_replayProveChangedOutputRootAndOutputIndex_succeeds() (gas: 647473) -KromaPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_replayProveChangedOutputRoot_succeeds() (gas: 449354) +KromaPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_replayProveChangedOutputRootAndOutputIndex_succeeds() (gas: 674387) +KromaPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_replayProveChangedOutputRoot_succeeds() (gas: 449332) KromaPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_replayProve_reverts() (gas: 288788) -KromaPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_validWithdrawalProof_succeeds() (gas: 274724) -KromaPortal_Test:test_constructor_succeeds() (gas: 19560) -KromaPortal_Test:test_depositTransaction_contractCreation_reverts() (gas: 14241) -KromaPortal_Test:test_depositTransaction_createWithZeroValueForContract_succeeds() (gas: 76801) -KromaPortal_Test:test_depositTransaction_createWithZeroValueForEOA_succeeds() (gas: 77167) +KromaPortal_FinalizeWithdrawal_Test:test_proveWithdrawalTransaction_validWithdrawalProof_succeeds() (gas: 274702) +KromaPortal_Test:test_constructor_succeeds() (gas: 19538) +KromaPortal_Test:test_depositTransaction_contractCreation_reverts() (gas: 14306) +KromaPortal_Test:test_depositTransaction_createWithZeroValueForContract_succeeds() (gas: 76779) +KromaPortal_Test:test_depositTransaction_createWithZeroValueForEOA_succeeds() (gas: 77145) KromaPortal_Test:test_depositTransaction_noValueContract_succeeds() (gas: 76797) -KromaPortal_Test:test_depositTransaction_noValueEOA_succeeds() (gas: 77076) +KromaPortal_Test:test_depositTransaction_noValueEOA_succeeds() (gas: 77142) KromaPortal_Test:test_depositTransaction_smallGasLimit_reverts() (gas: 14270) -KromaPortal_Test:test_depositTransaction_withEthValueAndContractContractCreation_succeeds() (gas: 83837) -KromaPortal_Test:test_depositTransaction_withEthValueAndEOAContractCreation_succeeds() (gas: 75981) -KromaPortal_Test:test_depositTransaction_withEthValueFromContract_succeeds() (gas: 83505) +KromaPortal_Test:test_depositTransaction_withEthValueAndContractContractCreation_succeeds() (gas: 83815) +KromaPortal_Test:test_depositTransaction_withEthValueAndEOAContractCreation_succeeds() (gas: 75959) +KromaPortal_Test:test_depositTransaction_withEthValueFromContract_succeeds() (gas: 83483) KromaPortal_Test:test_depositTransaction_withEthValueFromEOA_succeeds() (gas: 84111) -KromaPortal_Test:test_isOutputFinalized_succeeds() (gas: 194634) -KromaPortal_Test:test_pause_onlyGuardian_reverts() (gas: 22340) -KromaPortal_Test:test_pause_succeeds() (gas: 42359) +KromaPortal_Test:test_isOutputFinalized_succeeds() (gas: 196918) +KromaPortal_Test:test_pause_onlyGuardian_reverts() (gas: 22346) +KromaPortal_Test:test_pause_succeeds() (gas: 42343) KromaPortal_Test:test_receive_succeeds() (gas: 127638) -KromaPortal_Test:test_simple_isOutputFinalized_succeeds() (gas: 35393) -KromaPortal_Test:test_unpause_onlyGuardian_reverts() (gas: 46358) -KromaPortal_Test:test_unpause_succeeds() (gas: 31932) +KromaPortal_Test:test_simple_isOutputFinalized_succeeds() (gas: 35481) +KromaPortal_Test:test_unpause_onlyGuardian_reverts() (gas: 46370) +KromaPortal_Test:test_unpause_succeeds() (gas: 31941) +KromaVestingWalletTest:test_constructor_succeeds() (gas: 13916) +KromaVestingWalletTest:test_constructor_zeroValues_reverts() (gas: 72941) +KromaVestingWalletTest:test_initialize_durationNotMultiple_reverts() (gas: 1609487) +KromaVestingWalletTest:test_initialize_succeeds() (gas: 21609) +KromaVestingWalletTest:test_release_afterFullyVested_succeeds() (gas: 79771) +KromaVestingWalletTest:test_release_notBeneficiary_reverts() (gas: 28552) +KromaVestingWalletTest:test_release_succeeds() (gas: 115505) +KromaVestingWalletTest:test_release_tokenAfterFullyVested_succeeds() (gas: 95024) +KromaVestingWalletTest:test_release_token_succeeds() (gas: 153617) L1BlockBedrock_Test:test_updateValues_succeeds() (gas: 65631) L1BlockEcotone_Test:test_setL1BlockValuesEcotone_isDepositor_succeeds() (gas: 80519) L1BlockEcotone_Test:test_setL1BlockValuesEcotone_notDepositor_fails() (gas: 7621) -L1CrossDomainMessenger_Test:test_messageVersion_succeeds() (gas: 13950) -L1CrossDomainMessenger_Test:test_relayMessage_retryAfterFailure_succeeds() (gas: 178390) -L1CrossDomainMessenger_Test:test_relayMessage_succeeds() (gas: 61388) -L1CrossDomainMessenger_Test:test_relayMessage_toSystemContract_reverts() (gas: 39132) -L1CrossDomainMessenger_Test:test_relayMessage_v2_reverts() (gas: 12404) +L1CrossDomainMessenger_Test:test_messageVersion_succeeds() (gas: 13928) +L1CrossDomainMessenger_Test:test_relayMessage_retryAfterFailure_succeeds() (gas: 178402) +L1CrossDomainMessenger_Test:test_relayMessage_succeeds() (gas: 61394) +L1CrossDomainMessenger_Test:test_relayMessage_toSystemContract_reverts() (gas: 39138) +L1CrossDomainMessenger_Test:test_relayMessage_v2_reverts() (gas: 12388) L1CrossDomainMessenger_Test:test_replayMessage_withValue_reverts() (gas: 22319) -L1CrossDomainMessenger_Test:test_sendMessage_succeeds() (gas: 368802) -L1CrossDomainMessenger_Test:test_sendMessage_twice_succeeds() (gas: 1649705) -L1CrossDomainMessenger_Test:test_xDomainMessageSender_reset_succeeds() (gas: 66194) +L1CrossDomainMessenger_Test:test_sendMessage_succeeds() (gas: 368808) +L1CrossDomainMessenger_Test:test_sendMessage_twice_succeeds() (gas: 1649750) +L1CrossDomainMessenger_Test:test_xDomainMessageSender_reset_succeeds() (gas: 66200) L1CrossDomainMessenger_Test:test_xDomainSender_notSet_reverts() (gas: 15602) L1ERC721Bridge_Test:test_bridgeERC721To_localTokenZeroAddress_reverts() (gas: 52833) -L1ERC721Bridge_Test:test_bridgeERC721To_remoteTokenZeroAddress_reverts() (gas: 27424) +L1ERC721Bridge_Test:test_bridgeERC721To_remoteTokenZeroAddress_reverts() (gas: 27402) L1ERC721Bridge_Test:test_bridgeERC721To_succeeds() (gas: 433928) -L1ERC721Bridge_Test:test_bridgeERC721To_wrongOwner_reverts() (gas: 61054) -L1ERC721Bridge_Test:test_bridgeERC721_fromContract_reverts() (gas: 25770) +L1ERC721Bridge_Test:test_bridgeERC721To_wrongOwner_reverts() (gas: 61120) +L1ERC721Bridge_Test:test_bridgeERC721_fromContract_reverts() (gas: 25815) L1ERC721Bridge_Test:test_bridgeERC721_localTokenZeroAddress_reverts() (gas: 50668) -L1ERC721Bridge_Test:test_bridgeERC721_remoteTokenZeroAddress_reverts() (gas: 25216) -L1ERC721Bridge_Test:test_bridgeERC721_succeeds() (gas: 431486) -L1ERC721Bridge_Test:test_bridgeERC721_wrongOwner_reverts() (gas: 60928) -L1ERC721Bridge_Test:test_constructor_succeeds() (gas: 8595) -L1ERC721Bridge_Test:test_finalizeBridgeERC721_notEscrowed_reverts() (gas: 22168) -L1ERC721Bridge_Test:test_finalizeBridgeERC721_notFromRemoteMessenger_reverts() (gas: 19846) +L1ERC721Bridge_Test:test_bridgeERC721_remoteTokenZeroAddress_reverts() (gas: 25281) +L1ERC721Bridge_Test:test_bridgeERC721_succeeds() (gas: 431464) +L1ERC721Bridge_Test:test_bridgeERC721_wrongOwner_reverts() (gas: 60906) +L1ERC721Bridge_Test:test_constructor_succeeds() (gas: 8573) +L1ERC721Bridge_Test:test_finalizeBridgeERC721_notEscrowed_reverts() (gas: 22146) +L1ERC721Bridge_Test:test_finalizeBridgeERC721_notFromRemoteMessenger_reverts() (gas: 19891) L1ERC721Bridge_Test:test_finalizeBridgeERC721_notViaLocalMessenger_reverts() (gas: 16068) L1ERC721Bridge_Test:test_finalizeBridgeERC721_selfToken_reverts() (gas: 17664) L1ERC721Bridge_Test:test_finalizeBridgeERC721_succeeds() (gas: 400866) -L1StandardBridge_BridgeERC20To_Test:test_bridgeERC20To_succeeds() (gas: 686746) -L1StandardBridge_BridgeERC20_Test:test_bridgeERC20_succeeds() (gas: 684469) -L1StandardBridge_BridgeERC20_TestFail:test_bridgeERC20_notEoa_reverts() (gas: 17149) -L1StandardBridge_BridgeETHTo_Test:test_bridgeETHTo_succeeds() (gas: 483457) +L1StandardBridge_BridgeERC20To_Test:test_bridgeERC20To_succeeds() (gas: 687091) +L1StandardBridge_BridgeERC20_Test:test_bridgeERC20_succeeds() (gas: 684814) +L1StandardBridge_BridgeERC20_TestFail:test_bridgeERC20_notEoa_reverts() (gas: 17150) +L1StandardBridge_BridgeETHTo_Test:test_bridgeETHTo_succeeds() (gas: 483523) L1StandardBridge_BridgeETH_Test:test_bridgeETH_succeeds() (gas: 470622) L1StandardBridge_BridgeETH_TestFail:test_BridgeETH_notEoa_reverts() (gas: 35428) L1StandardBridge_FinalizeBridgeERC20Withdrawal_Test:test_finalizeBridgeERC20Withdrawal_succeeds() (gas: 467657) -L1StandardBridge_FinalizeBridgeERC20Withdrawal_TestFail:test_finalizeBridgeERC20Withdrawal_notMessenger_reverts() (gas: 24540) -L1StandardBridge_FinalizeBridgeERC20Withdrawal_TestFail:test_finalizeBridgeERC20Withdrawal_notOtherBridge_reverts() (gas: 25038) -L1StandardBridge_FinalizeBridgeETH_Test:test_finalizeBridgeETH_succeeds() (gas: 42199) +L1StandardBridge_FinalizeBridgeERC20Withdrawal_TestFail:test_finalizeBridgeERC20Withdrawal_notMessenger_reverts() (gas: 24541) +L1StandardBridge_FinalizeBridgeERC20Withdrawal_TestFail:test_finalizeBridgeERC20Withdrawal_notOtherBridge_reverts() (gas: 25039) +L1StandardBridge_FinalizeBridgeETH_Test:test_finalizeBridgeETH_succeeds() (gas: 42177) L1StandardBridge_FinalizeBridgeETH_TestFail:test_finalizeBridgeETH_incorrectValue_reverts() (gas: 27596) -L1StandardBridge_FinalizeBridgeETH_TestFail:test_finalizeBridgeETH_sendToMessenger_reverts() (gas: 27699) +L1StandardBridge_FinalizeBridgeETH_TestFail:test_finalizeBridgeETH_sendToMessenger_reverts() (gas: 27677) L1StandardBridge_FinalizeBridgeETH_TestFail:test_finalizeBridgeETH_sendToSelf_reverts() (gas: 27668) L1StandardBridge_FinalizeETHWithdrawal_Test:test_finalizeETHWithdrawal_succeeds() (gas: 47289) L1StandardBridge_Getter_Test:test_getters_succeeds() (gas: 16030) L1StandardBridge_Initialize_Test:test_initialize_succeeds() (gas: 16254) L1StandardBridge_Receive_Test:test_receive_succeeds() (gas: 590342) -L2CrossDomainMessenger_Test:test_messageVersion_succeeds() (gas: 8504) -L2CrossDomainMessenger_Test:test_relayMessage_retry_succeeds() (gas: 163838) -L2CrossDomainMessenger_Test:test_relayMessage_succeeds() (gas: 48913) -L2CrossDomainMessenger_Test:test_relayMessage_toSystemContract_reverts() (gas: 20390) -L2CrossDomainMessenger_Test:test_relayMessage_v1_reverts() (gas: 11715) -L2CrossDomainMessenger_Test:test_sendMessage_succeeds() (gas: 122983) -L2CrossDomainMessenger_Test:test_sendMessage_twice_succeeds() (gas: 133664) -L2CrossDomainMessenger_Test:test_xDomainMessageSender_reset_succeeds() (gas: 49223) -L2CrossDomainMessenger_Test:test_xDomainSender_senderNotSet_reverts() (gas: 10583) +L2CrossDomainMessenger_Test:test_messageVersion_succeeds() (gas: 8482) +L2CrossDomainMessenger_Test:test_relayMessage_retry_succeeds() (gas: 163828) +L2CrossDomainMessenger_Test:test_relayMessage_succeeds() (gas: 48919) +L2CrossDomainMessenger_Test:test_relayMessage_toSystemContract_reverts() (gas: 20396) +L2CrossDomainMessenger_Test:test_relayMessage_v1_reverts() (gas: 11765) +L2CrossDomainMessenger_Test:test_sendMessage_succeeds() (gas: 122986) +L2CrossDomainMessenger_Test:test_sendMessage_twice_succeeds() (gas: 133737) +L2CrossDomainMessenger_Test:test_xDomainMessageSender_reset_succeeds() (gas: 49229) +L2CrossDomainMessenger_Test:test_xDomainSender_senderNotSet_reverts() (gas: 10561) L2ERC721Bridge_Test:test_bridgeERC721To_localTokenZeroAddress_reverts() (gas: 26569) -L2ERC721Bridge_Test:test_bridgeERC721To_remoteTokenZeroAddress_reverts() (gas: 21895) +L2ERC721Bridge_Test:test_bridgeERC721To_remoteTokenZeroAddress_reverts() (gas: 21940) L2ERC721Bridge_Test:test_bridgeERC721To_succeeds() (gas: 145163) -L2ERC721Bridge_Test:test_bridgeERC721To_wrongOwner_reverts() (gas: 29621) -L2ERC721Bridge_Test:test_bridgeERC721_fromContract_reverts() (gas: 22308) +L2ERC721Bridge_Test:test_bridgeERC721To_wrongOwner_reverts() (gas: 29599) +L2ERC721Bridge_Test:test_bridgeERC721_fromContract_reverts() (gas: 22286) L2ERC721Bridge_Test:test_bridgeERC721_localTokenZeroAddress_reverts() (gas: 24448) -L2ERC721Bridge_Test:test_bridgeERC721_remoteTokenZeroAddress_reverts() (gas: 19776) -L2ERC721Bridge_Test:test_bridgeERC721_succeeds() (gas: 142787) -L2ERC721Bridge_Test:test_bridgeERC721_wrongOwner_reverts() (gas: 29430) -L2ERC721Bridge_Test:test_constructor_succeeds() (gas: 8528) +L2ERC721Bridge_Test:test_bridgeERC721_remoteTokenZeroAddress_reverts() (gas: 19754) +L2ERC721Bridge_Test:test_bridgeERC721_succeeds() (gas: 142765) +L2ERC721Bridge_Test:test_bridgeERC721_wrongOwner_reverts() (gas: 29408) +L2ERC721Bridge_Test:test_constructor_succeeds() (gas: 8506) L2ERC721Bridge_Test:test_finalizeBridgeERC721_alreadyExists_reverts() (gas: 29227) L2ERC721Bridge_Test:test_finalizeBridgeERC721_interfaceNotCompliant_reverts() (gas: 242342) -L2ERC721Bridge_Test:test_finalizeBridgeERC721_notFromRemoteMessenger_reverts() (gas: 19946) +L2ERC721Bridge_Test:test_finalizeBridgeERC721_notFromRemoteMessenger_reverts() (gas: 19924) L2ERC721Bridge_Test:test_finalizeBridgeERC721_notViaLocalMessenger_reverts() (gas: 16146) L2ERC721Bridge_Test:test_finalizeBridgeERC721_selfToken_reverts() (gas: 17731) L2ERC721Bridge_Test:test_finalizeBridgeERC721_succeeds() (gas: 167435) L2OutputOracleTest:test_computeL2Timestamp_succeeds() (gas: 38209) -L2OutputOracleTest:test_constructor_badTimestamp_reverts() (gas: 71011) -L2OutputOracleTest:test_constructor_l2BlockTimeZero_reverts() (gas: 45978) -L2OutputOracleTest:test_constructor_submissionInterval_reverts() (gas: 46013) -L2OutputOracleTest:test_constructor_succeeds() (gas: 34075) -L2OutputOracleTest:test_getL2OutputIndexAfter_multipleOutputsExist_succeeds() (gas: 496433) -L2OutputOracleTest:test_getL2OutputIndexAfter_noOutputsExist_reverts() (gas: 17939) -L2OutputOracleTest:test_getL2OutputIndexAfter_previousBlock_succeeds() (gas: 166662) -L2OutputOracleTest:test_getL2OutputIndexAfter_sameBlock_succeeds() (gas: 166570) -L2OutputOracleTest:test_getL2Output_succeeds() (gas: 173594) -L2OutputOracleTest:test_latestBlockNumber_succeeds() (gas: 167568) -L2OutputOracleTest:test_nextBlockNumber_succeeds() (gas: 185180) -L2OutputOracleTest:test_replaceL2Output_finalized_reverts() (gas: 187347) -L2OutputOracleTest:test_replaceL2Output_ifNotChallenger_reverts() (gas: 19404) -L2OutputOracleTest:test_replaceL2Output_nonExistent_reverts() (gas: 185630) -L2OutputOracleTest:test_replaceL2Output_succeeds() (gas: 431045) -L2OutputOracleTest:test_replaceL2Output_zeroAddress_reverts() (gas: 21823) -L2OutputOracleTest:test_submitL2Output_emptyOutput_reverts() (gas: 37200) -L2OutputOracleTest:test_submitL2Output_futureTimetamp_reverts() (gas: 39187) -L2OutputOracleTest:test_submitL2Output_notValidator_reverts() (gas: 36230) -L2OutputOracleTest:test_submitL2Output_submitAnotherOutput_succeeds() (gas: 176804) -L2OutputOracleTest:test_submitL2Output_unexpectedBlockNumber_reverts() (gas: 38897) -L2OutputOracleTest:test_submitL2Output_unmatchedBlockhash_reverts() (gas: 39996) -L2OutputOracleTest:test_submitL2Output_wrongFork_reverts() (gas: 39535) -L2OutputOracleTest:test_submitWithBlockhashAndHeight_succeeds() (gas: 165867) -L2OutputOracleUpgradeable_Test:test_initValuesOnProxy_succeeds() (gas: 33444) -L2OutputOracleUpgradeable_Test:test_initializeImpl_alreadyInitialized_reverts() (gas: 15167) -L2OutputOracleUpgradeable_Test:test_initializeProxy_alreadyInitialized_reverts() (gas: 20105) +L2OutputOracleTest:test_constructor_badTimestamp_reverts() (gas: 75696) +L2OutputOracleTest:test_constructor_l2BlockTimeZero_reverts() (gas: 50628) +L2OutputOracleTest:test_constructor_submissionInterval_reverts() (gas: 50663) +L2OutputOracleTest:test_constructor_succeeds() (gas: 44318) +L2OutputOracleTest:test_getL2OutputIndexAfter_multipleOutputsExist_succeeds() (gas: 508005) +L2OutputOracleTest:test_getL2OutputIndexAfter_noOutputsExist_reverts() (gas: 17961) +L2OutputOracleTest:test_getL2OutputIndexAfter_previousBlock_succeeds() (gas: 168833) +L2OutputOracleTest:test_getL2OutputIndexAfter_sameBlock_succeeds() (gas: 168741) +L2OutputOracleTest:test_getL2Output_succeeds() (gas: 175765) +L2OutputOracleTest:test_latestBlockNumber_succeeds() (gas: 169828) +L2OutputOracleTest:test_nextBlockNumber_succeeds() (gas: 187531) +L2OutputOracleTest:test_nextOutputMinL2Timestamp_succeeds() (gas: 20841) +L2OutputOracleTest:test_replaceL2Output_finalized_reverts() (gas: 189652) +L2OutputOracleTest:test_replaceL2Output_ifNotChallenger_reverts() (gas: 19427) +L2OutputOracleTest:test_replaceL2Output_nonExistent_reverts() (gas: 187958) +L2OutputOracleTest:test_replaceL2Output_succeeds() (gas: 440664) +L2OutputOracleTest:test_replaceL2Output_zeroAddress_reverts() (gas: 21868) +L2OutputOracleTest:test_submitL2Output_emptyOutput_reverts() (gas: 39524) +L2OutputOracleTest:test_submitL2Output_futureTimetamp_reverts() (gas: 41673) +L2OutputOracleTest:test_submitL2Output_notValidator_reverts() (gas: 38094) +L2OutputOracleTest:test_submitL2Output_submitAnotherOutput_succeeds() (gas: 179087) +L2OutputOracleTest:test_submitL2Output_unexpectedBlockNumber_reverts() (gas: 40696) +L2OutputOracleTest:test_submitL2Output_unmatchedBlockhash_reverts() (gas: 42298) +L2OutputOracleTest:test_submitL2Output_wrongFork_reverts() (gas: 41859) +L2OutputOracleTest:test_submitWithBlockhashAndHeight_succeeds() (gas: 168125) +L2OutputOracleUpgradeable_Test:test_initValuesOnProxy_succeeds() (gas: 36974) +L2OutputOracleUpgradeable_Test:test_initializeImpl_alreadyInitialized_reverts() (gas: 15145) +L2OutputOracleUpgradeable_Test:test_initializeProxy_alreadyInitialized_reverts() (gas: 20171) L2OutputOracleUpgradeable_Test:test_upgrading_succeeds() (gas: 180651) -L2StandardBridge_BridgeERC20To_Test:test_bridgeERC20To_succeeds() (gas: 380870) -L2StandardBridge_BridgeERC20_Test:test_bridgeERC20_succeeds() (gas: 376942) -L2StandardBridge_Bridge_Test:test_finalizeBridgeERC20_succeeds() (gas: 83235) -L2StandardBridge_Bridge_Test:test_finalizeBridgeETH_incorrectValue_reverts() (gas: 23876) -L2StandardBridge_Bridge_Test:test_finalizeBridgeETH_sendToMessenger_reverts() (gas: 24037) -L2StandardBridge_Bridge_Test:test_finalizeBridgeETH_sendToSelf_reverts() (gas: 23903) -L2StandardBridge_FinalizeBridgeETH_Test:test_finalizeBridgeETH_succeeds() (gas: 36111) +L2OutputOracle_ValidatorSystemUpgrade_Test:test_setNextFinalizeOutputIndex_succeeds() (gas: 41542) +L2OutputOracle_ValidatorSystemUpgrade_Test:test_setNextFinalizeOutputIndex_wrongCaller_reverts() (gas: 41164) +L2OutputOracle_ValidatorSystemUpgrade_Test:test_submitL2Output_upgradeValidatorSystem_succeeds() (gas: 380985) +L2StandardBridge_BridgeERC20To_Test:test_bridgeERC20To_succeeds() (gas: 381156) +L2StandardBridge_BridgeERC20_Test:test_bridgeERC20_succeeds() (gas: 377223) +L2StandardBridge_Bridge_Test:test_finalizeBridgeERC20_succeeds() (gas: 83253) +L2StandardBridge_Bridge_Test:test_finalizeBridgeETH_incorrectValue_reverts() (gas: 23891) +L2StandardBridge_Bridge_Test:test_finalizeBridgeETH_sendToMessenger_reverts() (gas: 24027) +L2StandardBridge_Bridge_Test:test_finalizeBridgeETH_sendToSelf_reverts() (gas: 23918) +L2StandardBridge_FinalizeBridgeETH_Test:test_finalizeBridgeETH_succeeds() (gas: 36089) L2StandardBridge_Test:test_initialize_succeeds() (gas: 19153) L2StandardBridge_Test:test_receive_succeeds() (gas: 128689) L2ToL1MessagePasserTest:test_burn_succeeds() (gas: 109877) L2ToL1MessagePasserTest:test_initiateWithdrawal_fromContract_succeeds() (gas: 70364) L2ToL1MessagePasserTest:test_initiateWithdrawal_fromEOA_succeeds() (gas: 75917) +MintManagerTest:test_acceptOwnershipOfToken_fromNotOwner_reverts() (gas: 13015) +MintManagerTest:test_constructor_invalidLengthArray_reverts() (gas: 162680) +MintManagerTest:test_constructor_sameRecipient_succeeds() (gas: 1059218) +MintManagerTest:test_constructor_succeeds() (gas: 132879) +MintManagerTest:test_constructor_tooManyShares_reverts() (gas: 688804) +MintManagerTest:test_constructor_zeroRecipient_reverts() (gas: 164769) +MintManagerTest:test_constructor_zeroShares_reverts() (gas: 164399) +MintManagerTest:test_distribute_fromNotOwner_reverts() (gas: 13055) +MintManagerTest:test_distribute_succeeds() (gas: 558730) +MintManagerTest:test_mint_alreadyMinted_reverts() (gas: 248847) +MintManagerTest:test_mint_fromNotOwner_reverts() (gas: 12959) +MintManagerTest:test_mint_succeeds() (gas: 246927) +MintManagerTest:test_renounceOwnershipOfToken_beforeMinted_reverts() (gas: 15197) +MintManagerTest:test_renounceOwnershipOfToken_fromNotOwner_reverts() (gas: 13014) +MintManagerTest:test_renounceOwnershipOfToken_succeeds() (gas: 254991) +MintManagerTest:test_transferAndAcceptOwnershipOfToken_succeeds() (gas: 1430287) +MintManagerTest:test_transferOwnershipOfToken_fromNotOwner_reverts() (gas: 13174) NodeReader_Test:test_readBytes32_32bytesting() (gas: 637) NodeReader_Test:test_readBytes32_too_short_byte() (gas: 3543) NodeReader_Test:test_readBytesN_4bytesting() (gas: 900) @@ -356,54 +464,110 @@ UpgradeGovernorTest:test_initialize_succeeds() (gas: 85053) UpgradeGovernorTest:test_queueProposal_succeeds() (gas: 280037) UpgradeGovernorTest:test_voteProposal_overPeriod_reverts() (gas: 152674) UpgradeGovernorTest:test_voteProposal_succeeds() (gas: 198054) -ValidatorPoolTest:test_addPendingBond_insufficientBalances_reverts() (gas: 298307) -ValidatorPoolTest:test_addPendingBond_noBond_reverts() (gas: 29935) -ValidatorPoolTest:test_addPendingBond_succeeds() (gas: 367864) -ValidatorPoolTest:test_balanceOf_succeeds() (gas: 57635) -ValidatorPoolTest:test_constructor_succeeds() (gas: 26460) -ValidatorPoolTest:test_createBond_existsBond_reverts() (gas: 366588) -ValidatorPoolTest:test_createBond_insufficientBalances_reverts() (gas: 138992) -ValidatorPoolTest:test_createBond_senderNotL2OO_reverts() (gas: 190067) -ValidatorPoolTest:test_createBond_succeeds() (gas: 287505) -ValidatorPoolTest:test_createBond_unbondBefore_succeeds() (gas: 512147) -ValidatorPoolTest:test_deposit_alreadyValidator_succeeds() (gas: 207096) +ValidatorManagerTest:test_activateValidator_alreadyActivated_reverts() (gas: 270995) +ValidatorManagerTest:test_activateValidator_exited_reverts() (gas: 225835) +ValidatorManagerTest:test_activateValidator_inJail_reverts() (gas: 982177) +ValidatorManagerTest:test_activateValidator_notValidator_reverts() (gas: 20006) +ValidatorManagerTest:test_activateValidator_registered_reverts() (gas: 177860) +ValidatorManagerTest:test_activatedValidatorTotalWeight_succeeds() (gas: 569720) +ValidatorManagerTest:test_afterSubmitL2Output_distributeRewardToSC_succeeds() (gas: 588089) +ValidatorManagerTest:test_afterSubmitL2Output_distributeReward_succeeds() (gas: 854004) +ValidatorManagerTest:test_afterSubmitL2Output_resetNoSubmissionCount_succeeds() (gas: 755102) +ValidatorManagerTest:test_afterSubmitL2Output_senderNotL2OO_reverts() (gas: 15890) +ValidatorManagerTest:test_afterSubmitL2Output_tryJail_succeeds() (gas: 894704) +ValidatorManagerTest:test_afterSubmitL2Output_updatePriorityValidator_succeeds() (gas: 922290) +ValidatorManagerTest:test_bondValidatorKro_notColosseum_reverts() (gas: 277399) +ValidatorManagerTest:test_bondValidatorKro_succeeds() (gas: 286826) +ValidatorManagerTest:test_checkSubmissionEligibility_inJail_reverts() (gas: 905817) +ValidatorManagerTest:test_checkSubmissionEligibility_notSatisfyCondition_reverts() (gas: 22032) +ValidatorManagerTest:test_checkSubmissionEligibility_notSelected_reverts() (gas: 66670) +ValidatorManagerTest:test_checkSubmissionEligibility_priorityRound_succeeds() (gas: 274517) +ValidatorManagerTest:test_checkSubmissionEligibility_publicRound_inJail_reverts() (gas: 908973) +ValidatorManagerTest:test_checkSubmissionEligibility_publicRound_notSatisfyCondition_reverts() (gas: 71117) +ValidatorManagerTest:test_checkSubmissionEligibility_publicRound_succeeds() (gas: 323677) +ValidatorManagerTest:test_checkSubmissionEligibility_senderNotL2OO_reverts() (gas: 15560) +ValidatorManagerTest:test_constructor_smallMinActivateAmount_reverts() (gas: 65108) +ValidatorManagerTest:test_constructor_succeeds() (gas: 42979) +ValidatorManagerTest:test_finalizeCommissionChange_changeDelayNotElapsed_reverts() (gas: 291325) +ValidatorManagerTest:test_finalizeCommissionChange_exited_reverts() (gas: 273552) +ValidatorManagerTest:test_finalizeCommissionChange_inJail_reverts() (gas: 901102) +ValidatorManagerTest:test_finalizeCommissionChange_notInitiated_reverts() (gas: 273569) +ValidatorManagerTest:test_finalizeCommissionChange_succeeds() (gas: 308088) +ValidatorManagerTest:test_getStatus_registered_succeeds() (gas: 270544) +ValidatorManagerTest:test_initCommissionChange_exited_reverts() (gas: 267036) +ValidatorManagerTest:test_initCommissionChange_inJail_reverts() (gas: 901152) +ValidatorManagerTest:test_initCommissionChange_largeCommissionRate_reverts() (gas: 273359) +ValidatorManagerTest:test_initCommissionChange_sameCommissionRate_reverts() (gas: 275314) +ValidatorManagerTest:test_initCommissionChange_succeeds() (gas: 284547) +ValidatorManagerTest:test_registerValidator_active_succeeds() (gas: 288619) +ValidatorManagerTest:test_registerValidator_alreadyInitiated_reverts() (gas: 294768) +ValidatorManagerTest:test_registerValidator_differentOrigin_reverts() (gas: 22688) +ValidatorManagerTest:test_registerValidator_fromContract_reverts() (gas: 20537) +ValidatorManagerTest:test_registerValidator_largeCommissionRate_reverts() (gas: 54650) +ValidatorManagerTest:test_registerValidator_registered_succeeds() (gas: 189138) +ValidatorManagerTest:test_registerValidator_smallAsset_reverts() (gas: 54736) +ValidatorManagerTest:test_registerValidator_withdrawZeroAddr_reverts() (gas: 81333) +ValidatorManagerTest:test_revertSlash_notColosseum_reverts() (gas: 24296) +ValidatorManagerTest:test_revertSlash_succeeds() (gas: 1000696) +ValidatorManagerTest:test_slash_notColosseum_reverts() (gas: 26416) +ValidatorManagerTest:test_slash_succeeds() (gas: 1119547) +ValidatorManagerTest:test_tryActivateValidator_succeeds() (gas: 316724) +ValidatorManagerTest:test_tryUnjail_notInJail_reverts() (gas: 18008) +ValidatorManagerTest:test_tryUnjail_periodNotElapsed_reverts() (gas: 897197) +ValidatorManagerTest:test_tryUnjail_senderNotSelf_reverts() (gas: 899047) +ValidatorManagerTest:test_tryUnjail_succeeds() (gas: 976849) +ValidatorManagerTest:test_unbondValidatorKro_notColosseum_reverts() (gas: 435835) +ValidatorManagerTest:test_unbondValidatorKro_succeeds() (gas: 440912) +ValidatorPoolTest:test_addPendingBond_insufficientBalances_reverts() (gas: 301386) +ValidatorPoolTest:test_addPendingBond_noBond_reverts() (gas: 29957) +ValidatorPoolTest:test_addPendingBond_succeeds() (gas: 371365) +ValidatorPoolTest:test_balanceOf_succeeds() (gas: 67882) +ValidatorPoolTest:test_constructor_succeeds() (gas: 29787) +ValidatorPoolTest:test_createBond_existsBond_reverts() (gas: 370887) +ValidatorPoolTest:test_createBond_insufficientBalances_reverts() (gas: 139326) +ValidatorPoolTest:test_createBond_senderNotL2OO_reverts() (gas: 201596) +ValidatorPoolTest:test_createBond_succeeds() (gas: 290441) +ValidatorPoolTest:test_createBond_unbondBefore_succeeds() (gas: 541965) +ValidatorPoolTest:test_deposit_alreadyValidator_succeeds() (gas: 219837) ValidatorPoolTest:test_deposit_insufficientBalances_reverts() (gas: 19815) -ValidatorPoolTest:test_deposit_succeeds() (gas: 185466) -ValidatorPoolTest:test_getBond_noBond_reverts() (gas: 16932) -ValidatorPoolTest:test_getBond_succeeds() (gas: 291271) -ValidatorPoolTest:test_increaseBond_noBond_reverts() (gas: 29978) -ValidatorPoolTest:test_increaseBond_noPendingBond_reverts() (gas: 297018) -ValidatorPoolTest:test_increaseBond_succeeds() (gas: 406152) -ValidatorPoolTest:test_isValidator_succeeds() (gas: 139343) -ValidatorPoolTest:test_nextValidator_succeeds() (gas: 1539256) -ValidatorPoolTest:test_releasePendingBond_noPendingBond_succeeds() (gas: 30060) -ValidatorPoolTest:test_releasePendingBond_succeeds() (gas: 431258) -ValidatorPoolTest:test_securityCouncilCannotBeValidator_succeeds() (gas: 51211) -ValidatorPoolTest:test_unbond_maxUnbond_succeeds() (gas: 483534) -ValidatorPoolTest:test_unbond_multipleBonds_succeeds() (gas: 394058) -ValidatorPoolTest:test_unbond_noBond_reverts() (gas: 18083) -ValidatorPoolTest:test_unbond_notExpired_reverts() (gas: 289902) -ValidatorPoolTest:test_unbond_succeeds() (gas: 383073) -ValidatorPoolTest:test_validatorCount_succeeds() (gas: 208556) -ValidatorPoolTest:test_withdraw_all_succeeds() (gas: 167313) -ValidatorPoolTest:test_withdraw_loseValidatorEligibility_succeeds() (gas: 171876) -ValidatorPoolTest:test_withdraw_maintainValidatorEligibility_succeeds() (gas: 119422) -ValidatorPoolTest:test_withdraw_to_succeeds() (gas: 167576) -ValidatorPoolTest:test_withdraw_to_zero_address_reverts() (gas: 197802) +ValidatorPoolTest:test_deposit_succeeds() (gas: 196960) +ValidatorPoolTest:test_getBond_noBond_reverts() (gas: 16956) +ValidatorPoolTest:test_getBond_succeeds() (gas: 294321) +ValidatorPoolTest:test_increaseBond_noBond_reverts() (gas: 30000) +ValidatorPoolTest:test_increaseBond_noPendingBond_reverts() (gas: 299998) +ValidatorPoolTest:test_increaseBond_succeeds() (gas: 409866) +ValidatorPoolTest:test_isValidator_succeeds() (gas: 150837) +ValidatorPoolTest:test_nextValidator_succeeds() (gas: 1569094) +ValidatorPoolTest:test_releasePendingBond_noPendingBond_succeeds() (gas: 30148) +ValidatorPoolTest:test_releasePendingBond_succeeds() (gas: 434921) +ValidatorPoolTest:test_securityCouncilCannotBeValidator_succeeds() (gas: 61472) +ValidatorPoolTest:test_unbond_maxUnbond_succeeds() (gas: 512899) +ValidatorPoolTest:test_unbond_multipleBonds_succeeds() (gas: 422559) +ValidatorPoolTest:test_unbond_noBond_reverts() (gas: 18128) +ValidatorPoolTest:test_unbond_notExpired_reverts() (gas: 292816) +ValidatorPoolTest:test_unbond_succeeds() (gas: 411925) +ValidatorPoolTest:test_validatorCount_succeeds() (gas: 221297) +ValidatorPoolTest:test_withdraw_all_succeeds() (gas: 176508) +ValidatorPoolTest:test_withdraw_loseValidatorEligibility_succeeds() (gas: 183370) +ValidatorPoolTest:test_withdraw_maintainValidatorEligibility_succeeds() (gas: 129669) +ValidatorPoolTest:test_withdraw_to_succeeds() (gas: 176753) +ValidatorPoolTest:test_withdraw_to_zero_address_reverts() (gas: 209273) +ValidatorPool_SystemUpgrade_Test:test_deposit_afterSystemUpgrade_reverts() (gas: 539174) +ValidatorPool_SystemUpgrade_Test:test_isTerminated_succeeds() (gas: 526333) ValidatorRewardVault_Test:test_balanceOf_succeeds() (gas: 42735) -ValidatorRewardVault_Test:test_constructor_succeeds() (gas: 11335) +ValidatorRewardVault_Test:test_constructor_succeeds() (gas: 11378) ValidatorRewardVault_Test:test_minWithdrawalAmount_succeeds() (gas: 5498) ValidatorRewardVault_Test:test_receive_succeeds() (gas: 17409) ValidatorRewardVault_Test:test_reward_alreadyPaidBlockNumber_reverts() (gas: 41770) ValidatorRewardVault_Test:test_reward_senderNotValidatorPool_reverts() (gas: 8665) ValidatorRewardVault_Test:test_reward_succeeds() (gas: 49422) ValidatorRewardVault_Test:test_reward_zeroValidatorAddress_reverts() (gas: 11190) -ValidatorRewardVault_Test:test_withdrawL2_succeeds() (gas: 54256) +ValidatorRewardVault_Test:test_withdrawL2_succeeds() (gas: 54301) ValidatorRewardVault_Test:test_withdraw_succeeds() (gas: 154838) -ZKMerkleTrie_Test:test_verifyInclustionProof_valid_0() (gas: 140984) -ZKMerkleTrie_Test:test_verifyInclustionProof_valid_1() (gas: 76610) -ZKMerkleTrie_Test:test_verifyInclustionProof_valid_2() (gas: 347207) -ZKMerkleTrie_Test:test_verifyInclustionProof_valid_3() (gas: 289078) -ZKMerkleTrie_Test:test_verifyInclustionProof_valid_4() (gas: 519350) -ZKMerkleTrie_Test:test_verifyInclustionProof_valid_5() (gas: 450471) -ZKMerkleTrie_Test:test_verifyInclustionProof_valid_6() (gas: 312798) \ No newline at end of file +ZKMerkleTrie_Test:test_verifyInclustionProof_valid_0() (gas: 140954) +ZKMerkleTrie_Test:test_verifyInclustionProof_valid_1() (gas: 76602) +ZKMerkleTrie_Test:test_verifyInclustionProof_valid_2() (gas: 347199) +ZKMerkleTrie_Test:test_verifyInclustionProof_valid_3() (gas: 289070) +ZKMerkleTrie_Test:test_verifyInclustionProof_valid_4() (gas: 519342) +ZKMerkleTrie_Test:test_verifyInclustionProof_valid_5() (gas: 450441) +ZKMerkleTrie_Test:test_verifyInclustionProof_valid_6() (gas: 312790) \ No newline at end of file diff --git a/packages/contracts/.storage-layout b/packages/contracts/.storage-layout index 7fbb640332..b829e5a589 100644 --- a/packages/contracts/.storage-layout +++ b/packages/contracts/.storage-layout @@ -13,6 +13,7 @@ | segmentsLengths | mapping(uint256 => uint256) | 1 | 0 | 32 | contracts/L1/Colosseum.sol:Colosseum | | challenges | mapping(uint256 => mapping(address => struct Types.Challenge)) | 2 | 0 | 32 | contracts/L1/Colosseum.sol:Colosseum | | verifiedPublicInputs | mapping(bytes32 => bool) | 3 | 0 | 32 | contracts/L1/Colosseum.sol:Colosseum | +| deletedOutputs | mapping(uint256 => struct Types.CheckpointOutput) | 4 | 0 | 32 | contracts/L1/Colosseum.sol:Colosseum | ======================= ➡ contracts/L1/SecurityCouncil.sol:SecurityCouncil @@ -30,6 +31,26 @@ | transactionCount | uint256 | 56 | 0 | 32 | contracts/L1/SecurityCouncil.sol:SecurityCouncil | | outputsDeleteRequested | mapping(uint256 => bool) | 57 | 0 | 32 | contracts/L1/SecurityCouncil.sol:SecurityCouncil | +======================= +➡ contracts/L1/AssetManager.sol:AssetManager +======================= + +| Name | Type | Slot | Offset | Bytes | Contract | +|---------|------------------------------------------------|------|--------|-------|--------------------------------------------| +| _vaults | mapping(address => struct IAssetManager.Vault) | 0 | 0 | 32 | contracts/L1/AssetManager.sol:AssetManager | + +======================= +➡ contracts/L1/ValidatorManager.sol:ValidatorManager +======================= + +| Name | Type | Slot | Offset | Bytes | Contract | +|-------------------------|--------------------------------------------------------|------|--------|-------|----------------------------------------------------| +| _nextPriorityValidator | address | 0 | 0 | 20 | contracts/L1/ValidatorManager.sol:ValidatorManager | +| _validatorTree | struct BalancedWeightTree.Tree | 1 | 0 | 96 | contracts/L1/ValidatorManager.sol:ValidatorManager | +| _validatorInfo | mapping(address => struct IValidatorManager.Validator) | 4 | 0 | 32 | contracts/L1/ValidatorManager.sol:ValidatorManager | +| _jail | mapping(address => uint128) | 5 | 0 | 32 | contracts/L1/ValidatorManager.sol:ValidatorManager | +| _pendingChallengeReward | mapping(uint256 => uint128) | 6 | 0 | 32 | contracts/L1/ValidatorManager.sol:ValidatorManager | + ======================= ➡ contracts/L1/ValidatorPool.sol:ValidatorPool ======================= @@ -78,13 +99,14 @@ ➡ contracts/L1/L2OutputOracle.sol:L2OutputOracle ======================= -| Name | Type | Slot | Offset | Bytes | Contract | -|---------------------|---------------------------------|------|--------|-------|------------------------------------------------| -| _initialized | uint8 | 0 | 0 | 1 | contracts/L1/L2OutputOracle.sol:L2OutputOracle | -| _initializing | bool | 0 | 1 | 1 | contracts/L1/L2OutputOracle.sol:L2OutputOracle | -| startingBlockNumber | uint256 | 1 | 0 | 32 | contracts/L1/L2OutputOracle.sol:L2OutputOracle | -| startingTimestamp | uint256 | 2 | 0 | 32 | contracts/L1/L2OutputOracle.sol:L2OutputOracle | -| l2Outputs | struct Types.CheckpointOutput[] | 3 | 0 | 32 | contracts/L1/L2OutputOracle.sol:L2OutputOracle | +| Name | Type | Slot | Offset | Bytes | Contract | +|-------------------------|---------------------------------|------|--------|-------|------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | contracts/L1/L2OutputOracle.sol:L2OutputOracle | +| _initializing | bool | 0 | 1 | 1 | contracts/L1/L2OutputOracle.sol:L2OutputOracle | +| startingBlockNumber | uint256 | 1 | 0 | 32 | contracts/L1/L2OutputOracle.sol:L2OutputOracle | +| startingTimestamp | uint256 | 2 | 0 | 32 | contracts/L1/L2OutputOracle.sol:L2OutputOracle | +| l2Outputs | struct Types.CheckpointOutput[] | 3 | 0 | 32 | contracts/L1/L2OutputOracle.sol:L2OutputOracle | +| nextFinalizeOutputIndex | uint256 | 4 | 0 | 32 | contracts/L1/L2OutputOracle.sol:L2OutputOracle | ======================= ➡ contracts/L1/KromaPortal.sol:KromaPortal @@ -246,6 +268,22 @@ | Name | Type | Slot | Offset | Bytes | Contract | |------|------|------|--------|-------|----------| +======================= +➡ contracts/universal/KromaVestingWallet.sol:KromaVestingWallet +======================= + +| Name | Type | Slot | Offset | Bytes | Contract | +|----------------|-----------------------------|------|--------|-------|---------------------------------------------------------------| +| _initialized | uint8 | 0 | 0 | 1 | contracts/universal/KromaVestingWallet.sol:KromaVestingWallet | +| _initializing | bool | 0 | 1 | 1 | contracts/universal/KromaVestingWallet.sol:KromaVestingWallet | +| __gap | uint256[50] | 1 | 0 | 1600 | contracts/universal/KromaVestingWallet.sol:KromaVestingWallet | +| _released | uint256 | 51 | 0 | 32 | contracts/universal/KromaVestingWallet.sol:KromaVestingWallet | +| _erc20Released | mapping(address => uint256) | 52 | 0 | 32 | contracts/universal/KromaVestingWallet.sol:KromaVestingWallet | +| _beneficiary | address | 53 | 0 | 20 | contracts/universal/KromaVestingWallet.sol:KromaVestingWallet | +| _start | uint64 | 53 | 20 | 8 | contracts/universal/KromaVestingWallet.sol:KromaVestingWallet | +| _duration | uint64 | 54 | 0 | 8 | contracts/universal/KromaVestingWallet.sol:KromaVestingWallet | +| __gap | uint256[48] | 55 | 0 | 1536 | contracts/universal/KromaVestingWallet.sol:KromaVestingWallet | + ======================= ➡ contracts/governance/SecurityCouncilToken.sol:SecurityCouncilToken ======================= @@ -358,3 +396,22 @@ | _delegates | mapping(address => address) | 9 | 0 | 32 | contracts/governance/GovernanceToken.sol:GovernanceToken | | _checkpoints | mapping(address => struct ERC20Votes.Checkpoint[]) | 10 | 0 | 32 | contracts/governance/GovernanceToken.sol:GovernanceToken | | _totalSupplyCheckpoints | struct ERC20Votes.Checkpoint[] | 11 | 0 | 32 | contracts/governance/GovernanceToken.sol:GovernanceToken | +| _initialized | uint8 | 12 | 0 | 1 | contracts/governance/GovernanceToken.sol:GovernanceToken | +| _initializing | bool | 12 | 1 | 1 | contracts/governance/GovernanceToken.sol:GovernanceToken | +| __gap | uint256[50] | 13 | 0 | 1600 | contracts/governance/GovernanceToken.sol:GovernanceToken | +| _owner | address | 63 | 0 | 20 | contracts/governance/GovernanceToken.sol:GovernanceToken | +| __gap | uint256[49] | 64 | 0 | 1568 | contracts/governance/GovernanceToken.sol:GovernanceToken | +| _pendingOwner | address | 113 | 0 | 20 | contracts/governance/GovernanceToken.sol:GovernanceToken | +| __gap | uint256[49] | 114 | 0 | 1568 | contracts/governance/GovernanceToken.sol:GovernanceToken | + +======================= +➡ contracts/governance/MintManager.sol:MintManager +======================= + +| Name | Type | Slot | Offset | Bytes | Contract | +|---------------|-----------------------------|------|--------|-------|--------------------------------------------------| +| _owner | address | 0 | 0 | 20 | contracts/governance/MintManager.sol:MintManager | +| _pendingOwner | address | 1 | 0 | 20 | contracts/governance/MintManager.sol:MintManager | +| minted | bool | 1 | 20 | 1 | contracts/governance/MintManager.sol:MintManager | +| recipients | address[] | 2 | 0 | 32 | contracts/governance/MintManager.sol:MintManager | +| shareOf | mapping(address => uint256) | 3 | 0 | 32 | contracts/governance/MintManager.sol:MintManager | diff --git a/packages/contracts/contracts/L1/AssetManager.sol b/packages/contracts/contracts/L1/AssetManager.sol new file mode 100644 index 0000000000..b953336972 --- /dev/null +++ b/packages/contracts/contracts/L1/AssetManager.sol @@ -0,0 +1,897 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; +import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; +import { IERC721Receiver } from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; + +import { Uint128Math } from "../libraries/Uint128Math.sol"; +import { ISemver } from "../universal/ISemver.sol"; +import { IAssetManager } from "./interfaces/IAssetManager.sol"; +import { IValidatorManager } from "./interfaces/IValidatorManager.sol"; + +/** + * @title AssetManager + * @notice AssetManager is a contract that handles (un)delegations of KRO and KGH, and the + * distribution of rewards to the delegators and the validator. + */ +contract AssetManager is ISemver, IERC721Receiver, IAssetManager { + using SafeERC20 for IERC20; + using Uint128Math for uint128; + + /** + * @notice The numerator of the tax. + */ + uint128 public constant TAX_NUMERATOR = 20; + + /** + * @notice The denominator of the tax. + */ + uint128 public constant TAX_DENOMINATOR = 100; + + /** + * @notice Decimals offset for the KRO shares. + */ + uint128 public constant DECIMAL_OFFSET = 10 ** 6; + + /** + * @notice Address of the KRO token contract. + */ + IERC20 public immutable ASSET_TOKEN; + + /** + * @notice Address of the KGH token contract. + */ + IERC721 public immutable KGH; + + /** + * @notice The address of the SecurityCouncil contract. Can be updated via upgrade. + */ + address public immutable SECURITY_COUNCIL; + + /** + * @notice The address of Validator Reward Vault. Can be updated via upgrade. + */ + address public immutable VALIDATOR_REWARD_VAULT; + + /** + * @notice Address of ValidatorManager contract. Can be updated via upgrade. + */ + IValidatorManager public immutable VALIDATOR_MANAGER; + + /** + * @notice Minimum delegation period. Can be updated via upgrade. + */ + uint128 public immutable MIN_DELEGATION_PERIOD; + + /** + * @notice The amount to bond. + */ + uint128 public immutable BOND_AMOUNT; + + /** + * @notice A mapping of validator address to the vault. + */ + mapping(address => Vault) internal _vaults; + + /** + * @notice Modifier to check if the caller is the ValidatorManager contract. + */ + modifier onlyValidatorManager() { + if (msg.sender != address(VALIDATOR_MANAGER)) revert NotAllowedCaller(); + _; + } + + /** + * @notice Modifier to check if the validator is registered and not in jail. + */ + modifier isRegistered(address validator) { + if ( + VALIDATOR_MANAGER.getStatus(validator) < IValidatorManager.ValidatorStatus.REGISTERED || + VALIDATOR_MANAGER.inJail(validator) + ) revert ImproperValidatorStatus(); + _; + } + + /** + * @notice Modifier to check if the caller is the withdraw account of the validator. + */ + modifier onlyWithdrawAccount(address validator) { + if (msg.sender != _vaults[validator].withdrawAccount) revert NotAllowedCaller(); + _; + } + + /** + * @notice Semantic version. + * @custom:semver 1.0.0 + */ + string public constant version = "1.0.0"; + + /** + * @notice Constructs the AssetManager contract. + * + * @param _assetToken Address of the KRO token. + * @param _kgh Address of the KGH token. + * @param _securityCouncil Address of the SecurityCouncil contract. + * @param _validatorRewardVault Address of the Validator Reward Vault. + * @param _validatorManager Address of the ValidatorManager contract. + * @param _minDelegationPeriod Minimum delegation period. + * @param _bondAmount Amount to bond. + */ + constructor( + IERC20 _assetToken, + IERC721 _kgh, + address _securityCouncil, + address _validatorRewardVault, + IValidatorManager _validatorManager, + uint128 _minDelegationPeriod, + uint128 _bondAmount + ) { + ASSET_TOKEN = _assetToken; + KGH = _kgh; + SECURITY_COUNCIL = _securityCouncil; + VALIDATOR_REWARD_VAULT = _validatorRewardVault; + VALIDATOR_MANAGER = _validatorManager; + MIN_DELEGATION_PERIOD = _minDelegationPeriod; + BOND_AMOUNT = _bondAmount; + } + + /** + * @inheritdoc IAssetManager + */ + function getKroTotalShareBalance( + address validator, + address delegator + ) external view returns (uint128) { + return _vaults[validator].kroDelegators[delegator].shares; + } + + /** + * @inheritdoc IAssetManager + */ + function getKroAssets(address validator, address delegator) external view returns (uint128) { + return _convertToKroAssets(validator, _vaults[validator].kroDelegators[delegator].shares); + } + + /** + * @inheritdoc IAssetManager + */ + function getKghNum(address validator, address delegator) external view returns (uint128) { + return _vaults[validator].kghDelegators[delegator].kghNum; + } + + /** + * @inheritdoc IAssetManager + */ + function previewDelegate(address validator, uint128 assets) external view returns (uint128) { + return _convertToKroShares(validator, assets); + } + + /** + * @inheritdoc IAssetManager + */ + function previewUndelegate(address validator, uint128 shares) external view returns (uint128) { + return _convertToKroAssets(validator, shares); + } + + /** + * @inheritdoc IAssetManager + */ + function canUndelegateKroAt( + address validator, + address delegator + ) public view returns (uint128) { + return _vaults[validator].kroDelegators[delegator].lastDelegatedAt + MIN_DELEGATION_PERIOD; + } + + /** + * @inheritdoc IAssetManager + */ + function canUndelegateKghAt( + address validator, + address delegator, + uint256 tokenId + ) public view returns (uint128) { + return + _vaults[validator].kghDelegators[delegator].delegatedAt[tokenId] + + MIN_DELEGATION_PERIOD; + } + + /** + * @inheritdoc IAssetManager + */ + function canWithdrawAt(address validator) public view returns (uint128) { + return _vaults[validator].lastDepositedAt + MIN_DELEGATION_PERIOD; + } + + /** + * @inheritdoc IAssetManager + */ + function getKghReward(address validator, address delegator) external view returns (uint128) { + Vault storage vault = _vaults[validator]; + KghDelegator storage kghDelegator = vault.kghDelegators[delegator]; + + uint128 rewardPerKghStored = vault.asset.rewardPerKghStored; + uint128 totalBoostedReward = kghDelegator.kghNum * + (rewardPerKghStored - kghDelegator.rewardPerKghPaid); + + return totalBoostedReward; + } + + /** + * @inheritdoc IAssetManager + */ + function getWithdrawAccount(address validator) external view returns (address) { + return _vaults[validator].withdrawAccount; + } + + /** + * @inheritdoc IAssetManager + */ + function totalKroAssets(address validator) public view returns (uint128) { + return _vaults[validator].asset.totalKro; + } + + /** + * @inheritdoc IAssetManager + */ + function totalKghNum(address validator) external view returns (uint128) { + return _vaults[validator].asset.totalKgh; + } + + /** + * @inheritdoc IAssetManager + */ + function totalValidatorKro(address validator) external view returns (uint128) { + return _vaults[validator].asset.validatorKro; + } + + /** + * @inheritdoc IAssetManager + */ + function totalValidatorKroBonded(address validator) external view returns (uint128) { + return _vaults[validator].asset.validatorKroBonded; + } + + /** + * @inheritdoc IAssetManager + */ + function totalValidatorKroNotBonded(address validator) external view returns (uint128) { + return _vaults[validator].asset.validatorKro - _vaults[validator].asset.validatorKroBonded; + } + + /** + * @notice Returns the reflective weight of given validator. + * + * @param validator Address of the validator. + * + * @return The reflective weight of given validator. + */ + function reflectiveWeight(address validator) external view returns (uint128) { + return _vaults[validator].asset.totalKro + _vaults[validator].asset.validatorKro; + } + + /** + * @notice Deposit KRO to register as a validator. This function is only called by the + * ValidatorManager contract. + * + * @param validator Address of the validator. + * @param assets The amount of KRO to deposit. + * @param withdrawAccount An account where assets can be withdrawn to. Only this account can + * withdraw the assets. + */ + function depositToRegister( + address validator, + uint128 assets, + address withdrawAccount + ) external onlyValidatorManager { + if (withdrawAccount == address(0)) revert ZeroAddress(); + + _vaults[validator].withdrawAccount = withdrawAccount; + _deposit(validator, assets, false); + emit Deposited(validator, assets); + } + + /** + * @inheritdoc IAssetManager + */ + function deposit(uint128 assets) external { + if (assets == 0) revert NotAllowedZeroInput(); + if (VALIDATOR_MANAGER.getStatus(msg.sender) == IValidatorManager.ValidatorStatus.NONE) + revert ImproperValidatorStatus(); + + _deposit(msg.sender, assets, true); + emit Deposited(msg.sender, assets); + + VALIDATOR_MANAGER.tryActivateValidator(msg.sender); + } + + /** + * @inheritdoc IAssetManager + */ + function withdraw(address validator, uint128 assets) external onlyWithdrawAccount(validator) { + if (assets == 0) revert NotAllowedZeroInput(); + if (canWithdrawAt(validator) > block.timestamp) { + revert NotElapsedMinDelegationPeriod(); + } + if (VALIDATOR_MANAGER.jailExpiresAt(validator) > block.timestamp) + revert ImproperValidatorStatus(); + + _withdraw(validator, assets); + + VALIDATOR_MANAGER.updateValidatorTree(validator, true); + + ASSET_TOKEN.safeTransfer(_vaults[validator].withdrawAccount, assets); + + emit Withdrawn(validator, assets); + } + + /** + * @inheritdoc IAssetManager + */ + function delegate( + address validator, + uint128 assets + ) external isRegistered(validator) returns (uint128) { + if (assets == 0) revert NotAllowedZeroInput(); + + ASSET_TOKEN.safeTransferFrom(msg.sender, address(this), assets); + uint128 shares = _convertToKroShares(validator, assets); + _delegate(validator, msg.sender, assets, shares); + VALIDATOR_MANAGER.updateValidatorTree(validator, false); + + emit KroDelegated(validator, msg.sender, assets, shares); + return shares; + } + + /** + * @inheritdoc IAssetManager + */ + function delegateKgh(address validator, uint256 tokenId) external isRegistered(validator) { + // claim boosted reward + uint128 boostedReward = _claimBoostedReward(validator, msg.sender); + if (boostedReward > 0) { + ASSET_TOKEN.safeTransfer(msg.sender, boostedReward); + emit KghRewardClaimed(validator, msg.sender, boostedReward); + } + + KGH.safeTransferFrom(msg.sender, address(this), tokenId); + _delegateKgh(validator, msg.sender, tokenId); + + emit KghDelegated(validator, msg.sender, tokenId); + } + + /** + * @inheritdoc IAssetManager + */ + function delegateKghBatch( + address validator, + uint256[] calldata tokenIds + ) external isRegistered(validator) { + if (tokenIds.length == 0) revert NotAllowedZeroInput(); + + // claim boosted reward + uint128 boostedReward = _claimBoostedReward(validator, msg.sender); + if (boostedReward > 0) { + ASSET_TOKEN.safeTransfer(msg.sender, boostedReward); + emit KghRewardClaimed(validator, msg.sender, boostedReward); + } + + KghDelegator storage kghDelegator = _vaults[validator].kghDelegators[msg.sender]; + for (uint256 i = 0; i < tokenIds.length; ) { + KGH.safeTransferFrom(msg.sender, address(this), tokenIds[i]); + kghDelegator.delegatedAt[tokenIds[i]] = uint128(block.timestamp); + + unchecked { + ++i; + } + } + + _delegateKghBatch(validator, msg.sender, uint128(tokenIds.length)); + + emit KghBatchDelegated(validator, msg.sender, tokenIds); + } + + /** + * @inheritdoc IAssetManager + */ + function undelegate(address validator, uint128 assets) external { + if (assets == 0) revert NotAllowedZeroInput(); + + uint128 shares = _convertToKroShares(validator, assets); + if (shares == 0) revert InsufficientShare(); + if (shares > _vaults[validator].kroDelegators[msg.sender].shares) + revert InsufficientShare(); + + if (canUndelegateKroAt(validator, msg.sender) > block.timestamp) + revert NotElapsedMinDelegationPeriod(); + + _undelegate(validator, msg.sender, assets, shares); + VALIDATOR_MANAGER.updateValidatorTree(validator, true); + ASSET_TOKEN.safeTransfer(msg.sender, assets); + + emit KroUndelegated(validator, msg.sender, assets, shares); + } + + /** + * @inheritdoc IAssetManager + */ + function undelegateKgh(address validator, uint256 tokenId) external { + KghDelegator storage kghDelegator = _vaults[validator].kghDelegators[msg.sender]; + + if (kghDelegator.delegatedAt[tokenId] == 0) revert InvalidTokenIdsInput(); + if (canUndelegateKghAt(validator, msg.sender, tokenId) > block.timestamp) + revert NotElapsedMinDelegationPeriod(); + + // boosted reward of KGH + uint128 boostedReward = _claimBoostedReward(validator, msg.sender); + + // update storage + _undelegateKgh(validator, msg.sender, tokenId); + + // transfer KGH + KGH.safeTransferFrom(address(this), msg.sender, tokenId); + + // transfer KRO + if (boostedReward > 0) { + ASSET_TOKEN.safeTransfer(msg.sender, boostedReward); + } + + emit KghUndelegated(validator, msg.sender, tokenId, boostedReward); + } + + /** + * @inheritdoc IAssetManager + */ + function undelegateKghBatch(address validator, uint256[] calldata tokenIds) external { + if (tokenIds.length == 0) revert NotAllowedZeroInput(); + + KghDelegator storage kghDelegator = _vaults[validator].kghDelegators[msg.sender]; + + for (uint256 i = 0; i < tokenIds.length; ) { + if (kghDelegator.delegatedAt[tokenIds[i]] == 0) revert InvalidTokenIdsInput(); + if (canUndelegateKghAt(validator, msg.sender, tokenIds[i]) > block.timestamp) + revert NotElapsedMinDelegationPeriod(); + + delete kghDelegator.delegatedAt[tokenIds[i]]; + + unchecked { + ++i; + } + } + + // boosted reward of KGHs + uint128 boostedReward = _claimBoostedReward(validator, msg.sender); + + // update storage + _undelegateKghBatch(validator, msg.sender, uint128(tokenIds.length)); + + // transfer KGHs + for (uint256 i = 0; i < tokenIds.length; ) { + KGH.safeTransferFrom(address(this), msg.sender, tokenIds[i]); + + unchecked { + ++i; + } + } + + // transfer KRO + if (boostedReward > 0) { + ASSET_TOKEN.safeTransfer(msg.sender, boostedReward); + } + + emit KghBatchUndelegated(validator, msg.sender, tokenIds, boostedReward); + } + + /** + * @inheritdoc IAssetManager + */ + function claimKghReward(address validator) external { + uint128 boostedReward = _claimBoostedReward(validator, msg.sender); + if (boostedReward == 0) revert InsufficientAsset(); + + ASSET_TOKEN.safeTransfer(msg.sender, boostedReward); + + emit KghRewardClaimed(validator, msg.sender, boostedReward); + } + + /** + * @notice Bond KRO from validator KRO during output submission or challenge creation. This + * function is only called by the ValidatorManager contract. + * + * @param validator Address of the validator. + */ + function bondValidatorKro(address validator) external onlyValidatorManager { + Asset storage asset = _vaults[validator].asset; + uint128 remainder = asset.validatorKro - asset.validatorKroBonded; + if (remainder < BOND_AMOUNT) revert InsufficientAsset(); + + unchecked { + asset.validatorKroBonded += BOND_AMOUNT; + } + + emit ValidatorKroBonded(validator, BOND_AMOUNT, remainder - BOND_AMOUNT); + } + + /** + * @notice Unbond KRO from validator KRO during output finalization or challenge slashing. This + * function is only called by the ValidatorManager contract. + * + * @param validator Address of the validator. + */ + function unbondValidatorKro(address validator) external onlyValidatorManager { + Asset storage asset = _vaults[validator].asset; + + unchecked { + asset.validatorKroBonded -= BOND_AMOUNT; + } + + emit ValidatorKroUnbonded( + validator, + BOND_AMOUNT, + asset.validatorKro - asset.validatorKroBonded + ); + } + + /** + * @notice Update the vault of validator with the distributed reward. This function is only + * called by the ValidatorManager contract. + * + * @param validator Address of the validator. + * @param baseReward The base reward to distribute. + * @param boostedReward The boosted reward to distribute. + * @param validatorReward The validator reward to distribute. + */ + function increaseBalanceWithReward( + address validator, + uint128 baseReward, + uint128 boostedReward, + uint128 validatorReward + ) external onlyValidatorManager { + // Distribute the reward from a designated vault to the AssetManager contract. + ASSET_TOKEN.safeTransferFrom( + VALIDATOR_REWARD_VAULT, + address(this), + baseReward + boostedReward + validatorReward + ); + + // If reward is distributed to SECURITY_COUNCIL, transfer it directly. + if (validator == SECURITY_COUNCIL) { + ASSET_TOKEN.safeTransfer( + SECURITY_COUNCIL, + baseReward + boostedReward + validatorReward + ); + } else { + Asset storage asset = _vaults[validator].asset; + unchecked { + asset.totalKro += baseReward; + asset.validatorKro += validatorReward; + if (asset.totalKgh != 0) { + asset.rewardPerKghStored += boostedReward / asset.totalKgh; + } + asset.validatorKroBonded -= BOND_AMOUNT; + } + + emit ValidatorKroUnbonded( + validator, + BOND_AMOUNT, + asset.validatorKro - asset.validatorKroBonded + ); + } + } + + /** + * @notice Update the vault of challenge winner with the challenge reward. This function is only + * called by the ValidatorManager contract. + * + * @param winner Address of the challenge winner. + * @param challengeReward The challenge reward to be added to the winner's asset after excluding + * tax. + * + * @return The challenge reward added to winner's asset. + */ + function increaseBalanceWithChallenge( + address winner, + uint128 challengeReward + ) external onlyValidatorManager returns (uint128) { + Asset storage asset = _vaults[winner].asset; + + // If challenge reward is distributed to SECURITY_COUNCIL, transfer it directly. + if (winner == SECURITY_COUNCIL) { + ASSET_TOKEN.safeTransfer(SECURITY_COUNCIL, challengeReward); + return challengeReward; + } + + uint128 tax = challengeReward.mulDiv(TAX_NUMERATOR, TAX_DENOMINATOR); + ASSET_TOKEN.safeTransfer(SECURITY_COUNCIL, tax); + + unchecked { + challengeReward -= tax; + asset.validatorKro += challengeReward; + } + + return challengeReward; + } + + /** + * @notice Update the vault of challenge loser with the challenge reward. This function is only + * called by the ValidatorManager contract. + * + * @param loser Address of the challenge loser. + * + * @return The challenge reward slashed from loser's asset. + */ + function decreaseBalanceWithChallenge( + address loser + ) external onlyValidatorManager returns (uint128) { + Asset storage asset = _vaults[loser].asset; + + unchecked { + asset.validatorKroBonded -= BOND_AMOUNT; + asset.validatorKro -= BOND_AMOUNT; + } + + return BOND_AMOUNT; + } + + /** + * @notice Revert the changes of decreaseBalanceWithChallenge. This function is only called by + * the ValidatorManager contract. + * + * @param loser Address of the challenge original loser. + * + * @return The challenge reward refunded to loser's asset. + */ + function revertDecreaseBalanceWithChallenge( + address loser + ) external onlyValidatorManager returns (uint128) { + Asset storage asset = _vaults[loser].asset; + + unchecked { + asset.validatorKroBonded += BOND_AMOUNT; + asset.validatorKro += BOND_AMOUNT; + } + + return BOND_AMOUNT; + } + + /** + * @notice Returns the total amount of KRO shares held by the vault. + * + * @param validator Address of the validator. + * + * @return The total amount of shares held by the validator vault. + */ + function _totalKroShares(address validator) internal view returns (uint128) { + return _vaults[validator].asset.totalKroShares; + } + + /** + * @notice Internal conversion function for KRO (from assets to shares). + * + * @param validator Address of the validator. + * @param assets The amount of assets to convert to shares. + */ + function _convertToKroShares( + address validator, + uint128 assets + ) internal view returns (uint128) { + return + assets.mulDiv( + _totalKroShares(validator) + DECIMAL_OFFSET, + totalKroAssets(validator) + 1 + ); + } + + /** + * @notice Internal conversion function for KRO (from shares to assets). + * + * @param validator Address of the validator. + * @param shares The amount of shares to convert to assets. + */ + function _convertToKroAssets( + address validator, + uint128 shares + ) internal view returns (uint128) { + return + shares.mulDiv( + totalKroAssets(validator) + 1, + _totalKroShares(validator) + DECIMAL_OFFSET + ); + } + + /** + * @notice Internal function to deposit KRO by the validator. + * + * @param validator Address of the validator. + * @param assets The amount of KRO to deposit. + * @param updateTree Flag to update the validator tree. + */ + function _deposit(address validator, uint128 assets, bool updateTree) internal { + Vault storage vault = _vaults[validator]; + ASSET_TOKEN.safeTransferFrom(validator, address(this), assets); + + unchecked { + vault.asset.validatorKro += assets; + vault.lastDepositedAt = uint128(block.timestamp); + } + + if (updateTree) { + VALIDATOR_MANAGER.updateValidatorTree(validator, false); + } + } + + /** + * @notice Internal function to withdraw KRO by the validator. + * + * @param validator Address of the validator. + * @param assets The amount of KRO to withdraw. + */ + function _withdraw(address validator, uint128 assets) internal { + Asset storage asset = _vaults[validator].asset; + if (assets > asset.validatorKro - asset.validatorKroBonded) revert InsufficientAsset(); + + unchecked { + asset.validatorKro -= assets; + } + } + + /** + * @notice Internal function to delegate KRO to the validator. + * + * @param validator Address of the validator. + * @param delegator Address of the delegator. + * @param assets The amount of KRO to delegate. + * @param shares The amount of shares to delegate. + */ + function _delegate( + address validator, + address delegator, + uint128 assets, + uint128 shares + ) internal { + Vault storage vault = _vaults[validator]; + + unchecked { + vault.asset.totalKro += assets; + vault.asset.totalKroShares += shares; + vault.kroDelegators[delegator].shares += shares; + vault.kroDelegators[delegator].lastDelegatedAt = uint128(block.timestamp); + } + } + + /** + * @notice Internal function to delegate KGH to the validator. + * + * @param validator Address of the validator. + * @param delegator Address of the delegator. + * @param tokenId Token Id of the KGH. + */ + function _delegateKgh(address validator, address delegator, uint256 tokenId) internal { + Vault storage vault = _vaults[validator]; + KghDelegator storage kghDelegator = vault.kghDelegators[delegator]; + + unchecked { + vault.asset.totalKgh += 1; + + ++kghDelegator.kghNum; + kghDelegator.delegatedAt[tokenId] = uint128(block.timestamp); + } + } + + /** + * @notice Internal function to delegate KGHs to the validator. + * + * @param validator Address of the validator. + * @param delegator Address of the delegator. + * @param kghCount The number of KGHs to delegate. + */ + function _delegateKghBatch(address validator, address delegator, uint128 kghCount) internal { + Vault storage vault = _vaults[validator]; + + unchecked { + // asset + vault.asset.totalKgh += kghCount; + + // delegator + vault.kghDelegators[delegator].kghNum += kghCount; + } + } + + /** + * @notice Internal function to undelegate KRO from the validator. + * + * @param validator Address of the validator. + * @param delegator Address of the delegator. + * @param assets The amount of KRO to undelegate. + * @param shares The amount of shares to undelegate. + */ + function _undelegate( + address validator, + address delegator, + uint128 assets, + uint128 shares + ) internal { + Vault storage vault = _vaults[validator]; + + unchecked { + vault.asset.totalKroShares -= shares; + vault.asset.totalKro -= assets; + vault.kroDelegators[delegator].shares -= shares; + } + } + + /** + * @notice Internal function to undelegate KGH from the validator. + * + * @param validator Address of the validator. + * @param delegator Address of the delegator. + * @param tokenId Token Id of the KGH. + */ + function _undelegateKgh(address validator, address delegator, uint256 tokenId) internal { + Vault storage vault = _vaults[validator]; + KghDelegator storage kghDelegator = vault.kghDelegators[delegator]; + + unchecked { + // asset + vault.asset.totalKgh -= 1; + + // delegator + kghDelegator.kghNum -= 1; + delete kghDelegator.delegatedAt[tokenId]; + } + } + + /** + * @notice Internal function to undelegate KGHs from the validator. + * + * @param validator Address of the validator. + * @param delegator Address of the delegator. + * @param kghCount The number of KGH token to undelegate. + */ + function _undelegateKghBatch(address validator, address delegator, uint128 kghCount) internal { + Vault storage vault = _vaults[validator]; + + unchecked { + // asset + vault.asset.totalKgh -= kghCount; + + // delegator + vault.kghDelegators[delegator].kghNum -= kghCount; + } + } + + /** + * @notice Internal function to claim the boosted reward of the delegator. + * + * @param validator Address of the validator. + * @param delegator Address of the delegator. + * + * @return The amount of the claimed boosted reward. + */ + function _claimBoostedReward(address validator, address delegator) internal returns (uint128) { + Vault storage vault = _vaults[validator]; + KghDelegator storage kghDelegator = vault.kghDelegators[delegator]; + + uint128 rewardPerKghStored = vault.asset.rewardPerKghStored; + uint128 totalBoostedReward = kghDelegator.kghNum * + (rewardPerKghStored - kghDelegator.rewardPerKghPaid); + + kghDelegator.rewardPerKghPaid = rewardPerKghStored; + + return totalBoostedReward; + } + + /** + * @inheritdoc IERC721Receiver + */ + function onERC721Received( + address /* operator */, + address /* from */, + uint256 /* tokenId */, + bytes calldata /* data */ + ) external pure returns (bytes4) { + return IERC721Receiver.onERC721Received.selector; + } +} diff --git a/packages/contracts/contracts/L1/Colosseum.sol b/packages/contracts/contracts/L1/Colosseum.sol index 5c3e5d495f..3fe7133060 100644 --- a/packages/contracts/contracts/L1/Colosseum.sol +++ b/packages/contracts/contracts/L1/Colosseum.sol @@ -2,13 +2,12 @@ pragma solidity 0.8.15; import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable.sol"; -import { Math } from "@openzeppelin/contracts/utils/math/Math.sol"; import { Hashing } from "../libraries/Hashing.sol"; import { Predeploys } from "../libraries/Predeploys.sol"; import { Types } from "../libraries/Types.sol"; import { ISemver } from "../universal/ISemver.sol"; -import { IZKMerkleTrie } from "./IZKMerkleTrie.sol"; +import { IZKMerkleTrie } from "./interfaces/IZKMerkleTrie.sol"; import { L2OutputOracle } from "./L2OutputOracle.sol"; import { SecurityCouncil } from "./SecurityCouncil.sol"; import { ZKVerifier } from "./ZKVerifier.sol"; @@ -27,7 +26,7 @@ contract Colosseum is Initializable, ISemver { /** * @notice Enum of the challenge status. * - * See the https://github.com/kroma-network/kroma/blob/dev/specs/challenge.md#state-diagram + * See the https://specs.kroma.network/fault-proof/challenge.html#state-diagram * for more details. * * Belows are possible state transitions at current implementation. @@ -122,7 +121,7 @@ contract Colosseum is Initializable, ISemver { /** * @notice Length of segment array for each turn. */ - mapping(uint256 => uint256) internal segmentsLengths; + mapping(uint256 => uint256) public segmentsLengths; /** * @notice A mapping of the challenge. @@ -134,6 +133,11 @@ contract Colosseum is Initializable, ISemver { */ mapping(bytes32 => bool) public verifiedPublicInputs; + /** + * @notice A mapping of deleted output index to the deleted output. + */ + mapping(uint256 => Types.CheckpointOutput) public deletedOutputs; + /** * @notice Emitted when the challenge is created. * @@ -194,6 +198,19 @@ contract Colosseum is Initializable, ISemver { uint256 timestamp ); + /** + * @notice Emitted when challenge is deleted forcefully. + * + * @param outputIndex Index of the L2 checkpoint output. + * @param asseter Address of the asseter. + * @param timestamp The timestamp when output deleted. + */ + event OutputForceDeleted( + uint256 indexed outputIndex, + address indexed asseter, + uint256 timestamp + ); + /** * @notice Emitted when challenge is canceled. * @@ -221,25 +238,125 @@ contract Colosseum is Initializable, ISemver { ); /** - * @notice A modifier that only allows the security council to call + * @notice Reverts when caller is not allowed. */ - modifier onlySecurityCouncil() { - require(msg.sender == SECURITY_COUNCIL, "Colosseum: sender is not the security council"); - _; - } + error NotAllowedCaller(); /** - * @notice Reverts if the output of given index is already finalized. - * - * @param _outputIndex Index of the L2 checkpoint output. + * @notice Reverts when a non-challenger calls cancel challenge. */ - modifier outputNotFinalized(uint256 _outputIndex) { - require( - !L2_ORACLE.isFinalized(_outputIndex), - "Colosseum: cannot progress challenge process about already finalized output" - ); - _; - } + error OnlyChallengerCanCancel(); + + /** + * @notice Reverts when output is already finalized. + */ + error OutputAlreadyFinalized(); + + /** + * @notice Reverts when output is already deleted. + */ + error OutputAlreadyDeleted(); + + /** + * @notice Reverts when the status of validator is improper. + */ + error ImproperValidatorStatus(); + + /** + * @notice Reverts when output is not deleted. + */ + error OutputNotDeleted(); + + /** + * @notice Reverts when given output is invalid. + */ + error InvalidOutputGiven(); + + /** + * @notice Reverts when given address is invalid. + */ + error InvalidAddressGiven(); + + /** + * @notice Reverts when output is genesis output. + */ + error NotAllowedGenesisOutput(); + + /** + * @notice Reverts when the status of challenge is improper. + */ + error ImproperChallengeStatus(); + + /** + * @notice Reverts when the status of challenge is improper to cancel challenge. + */ + error ImproperChallengeStatusToCancel(); + + /** + * @notice Reverts when the creation period is already passed. + */ + error CreationPeriodPassed(); + + /** + * @notice Reverts when L1 is reorged. + */ + error L1Reorged(); + + /** + * @notice Reverts when the public input is invalid. + */ + error InvalidPublicInput(); + + /** + * @notice Reverts when the ZK proof is invalid. + */ + error InvalidZKProof(); + + /** + * @notice Reverts when the inclusion proof is invalid. + */ + error InvalidInclusionProof(); + + /** + * @notice Reverts when segments length is invalid. + */ + error InvalidSegmentsLength(); + + /** + * @notice Reverts when the first segment is mismatched. + */ + error FirstSegmentMismatched(); + + /** + * @notice Reverts when the last segment is matched. + */ + error LastSegmentMatched(); + + /** + * @notice Reverts when the block hash is mismatched between source and destination output root + * proof. + */ + error BlockHashMismatchedBtwSrcAndDst(); + + /** + * @notice Reverts when the block hash is mismatched. + */ + error BlockHashMismatched(); + + /** + * @notice Reverts when the state root is mismatched. + */ + error StateRootMismatched(); + + /** + * @notice Reverts when turn is invalid. + */ + error InvalidTurn(); + + /** + * @notice Reverts when challenge cannot be cancelled. + */ + error CannotCancelChallenge(); /** * @notice Semantic version. @@ -292,7 +409,21 @@ contract Colosseum is Initializable, ISemver { * @notice Initializer. */ function initialize(uint256[] memory _segmentsLengths) public initializer { - _setSegmentsLengths(_segmentsLengths); + // _segmentsLengths length should be an even number in order to let challenger submit + // invalidity proof at the last turn. + if (_segmentsLengths.length % 2 != 0) revert InvalidSegmentsLength(); + + uint256 sum = 1; + for (uint256 i = 0; i < _segmentsLengths.length; ) { + segmentsLengths[i] = _segmentsLengths[i]; + sum = sum * (_segmentsLengths[i] - 1); + + unchecked { + ++i; + } + } + + if (sum != L2_ORACLE_SUBMISSION_INTERVAL) revert InvalidSegmentsLength(); } /** @@ -308,44 +439,37 @@ contract Colosseum is Initializable, ISemver { bytes32 _l1BlockHash, uint256 _l1BlockNumber, bytes32[] calldata _segments - ) external outputNotFinalized(_outputIndex) { - require(_outputIndex > 0, "Colosseum: challenge for genesis output is not allowed"); + ) external { + if (_outputIndex == 0) revert NotAllowedGenesisOutput(); + + // Switch validator system after validator pool contract terminated. + if (L2_ORACLE.VALIDATOR_POOL().isTerminated(_outputIndex)) { + // Only the validators whose status is active can create challenge. + if (!L2_ORACLE.VALIDATOR_MANAGER().isActive(msg.sender)) + revert ImproperValidatorStatus(); + } Types.Challenge storage challenge = challenges[_outputIndex][msg.sender]; if (challenge.turn >= TURN_INIT) { - ChallengeStatus status = _challengeStatus(challenge); - require( - status == ChallengeStatus.CHALLENGER_TIMEOUT, - "Colosseum: the challenge for given output index is already in progress" - ); + if (_challengeStatus(challenge) != ChallengeStatus.CHALLENGER_TIMEOUT) + revert ImproperChallengeStatus(); _challengerTimeout(_outputIndex, msg.sender); } Types.CheckpointOutput memory targetOutput = L2_ORACLE.getL2Output(_outputIndex); - require( - targetOutput.timestamp + CREATION_PERIOD_SECONDS >= block.timestamp, - "Colosseum: cannot create a challenge after the creation period" - ); + if (targetOutput.timestamp + CREATION_PERIOD_SECONDS < block.timestamp) + revert CreationPeriodPassed(); - require( - targetOutput.outputRoot != DELETED_OUTPUT_ROOT, - "Colosseum: challenge for deleted output is not allowed" - ); + if (targetOutput.outputRoot == DELETED_OUTPUT_ROOT) revert OutputAlreadyDeleted(); - require( - msg.sender != targetOutput.submitter, - "Colosseum: the asserter and challenger must be different" - ); + if (msg.sender == targetOutput.submitter) revert NotAllowedCaller(); if (_l1BlockHash != bytes32(0) && blockhash(_l1BlockNumber) != bytes32(0)) { // Like L2OutputOracle, it reverts transactions when L1 reorged. - require( - blockhash(_l1BlockNumber) == _l1BlockHash, - "Colosseum: block hash does not match the hash at the expected height" - ); + if (blockhash(_l1BlockNumber) != _l1BlockHash) revert L1Reorged(); } Types.CheckpointOutput memory prevOutput = L2_ORACLE.getL2Output(_outputIndex - 1); @@ -357,7 +481,13 @@ contract Colosseum is Initializable, ISemver { _validateSegments(TURN_INIT, prevOutput.outputRoot, targetOutput.outputRoot, _segments); } - L2_ORACLE.VALIDATOR_POOL().addPendingBond(_outputIndex, msg.sender); + // Switch validator system after validator pool contract terminated. + if (L2_ORACLE.VALIDATOR_POOL().isTerminated(_outputIndex)) { + // Bond validator KRO to reserve slashing amount. + L2_ORACLE.VALIDATOR_MANAGER().bondValidatorKro(msg.sender); + } else { + L2_ORACLE.VALIDATOR_POOL().addPendingBond(_outputIndex, msg.sender); + } _updateSegments( challenge, @@ -386,7 +516,9 @@ contract Colosseum is Initializable, ISemver { address _challenger, uint256 _pos, bytes32[] calldata _segments - ) external outputNotFinalized(_outputIndex) { + ) external { + _checkOutputNotFinalized(_outputIndex); + Types.Challenge storage challenge = challenges[_outputIndex][_challenger]; ChallengeStatus status = _challengeStatus(challenge); @@ -400,7 +532,7 @@ contract Colosseum is Initializable, ISemver { } else if (status == ChallengeStatus.ASSERTER_TURN) { expectedSender = challenge.asserter; } - require(msg.sender == expectedSender, "Colosseum: not your turn"); + if (msg.sender != expectedSender) revert NotAllowedCaller(); uint8 newTurn = challenge.turn + 1; @@ -412,9 +544,7 @@ contract Colosseum is Initializable, ISemver { ); uint256 segSize = _nextSegSize(challenge); - uint256 segStart = challenge.segStart + _pos * segSize; - - _updateSegments(challenge, _segments, segStart, segSize); + _updateSegments(challenge, _segments, challenge.segStart + _pos * segSize, segSize); challenge.turn = newTurn; _updateTimeout(challenge); @@ -443,7 +573,9 @@ contract Colosseum is Initializable, ISemver { Types.PublicInputProof calldata _proof, uint256[] calldata _zkproof, uint256[] calldata _pair - ) external outputNotFinalized(_outputIndex) { + ) external { + _checkOutputNotFinalized(_outputIndex); + Types.Challenge storage challenge = challenges[_outputIndex][msg.sender]; ChallengeStatus status = _challengeStatus(challenge); @@ -451,19 +583,14 @@ contract Colosseum is Initializable, ISemver { return; } - require( - status == ChallengeStatus.READY_TO_PROVE || status == ChallengeStatus.ASSERTER_TIMEOUT, - "Colosseum: impossible to prove the fault in current status" - ); - - bytes32 srcOutputRoot = Hashing.hashOutputRootProof(_proof.srcOutputRootProof); - bytes32 dstOutputRoot = Hashing.hashOutputRootProof(_proof.dstOutputRootProof); + if (status != ChallengeStatus.READY_TO_PROVE && status != ChallengeStatus.ASSERTER_TIMEOUT) + revert ImproperChallengeStatus(); _validateOutputRootProof( _pos, challenge, - srcOutputRoot, - dstOutputRoot, + Hashing.hashOutputRootProof(_proof.srcOutputRootProof), + Hashing.hashOutputRootProof(_proof.dstOutputRootProof), _proof.srcOutputRootProof, _proof.dstOutputRootProof ); @@ -486,12 +613,9 @@ contract Colosseum is Initializable, ISemver { _proof.publicInput ); - require( - !verifiedPublicInputs[publicInputHash], - "Colosseum: public input that has already been validated cannot be used again" - ); + if (verifiedPublicInputs[publicInputHash]) revert InvalidPublicInput(); - require(ZK_VERIFIER.verify(_zkproof, _pair, publicInputHash), "Colosseum: invalid proof"); + if (!ZK_VERIFIER.verify(_zkproof, _pair, publicInputHash)) revert InvalidZKProof(); emit Proven(_outputIndex, msg.sender, block.timestamp); // Scope to call the security council, to avoid stack too deep. @@ -513,6 +637,17 @@ contract Colosseum is Initializable, ISemver { output.l2BlockNumber, callbackData ); + + deletedOutputs[_outputIndex] = output; + } + + // Switch validator system after validator pool contract terminated. + if (L2_ORACLE.VALIDATOR_POOL().isTerminated(_outputIndex)) { + // Slash the asseter's asset and move it to pending challenge reward for the output. + L2_ORACLE.VALIDATOR_MANAGER().slash(_outputIndex, msg.sender, challenge.asserter); + } else { + // The challenger's bond is also included in the bond for that output. + L2_ORACLE.VALIDATOR_POOL().increaseBond(_outputIndex, msg.sender); } verifiedPublicInputs[publicInputHash] = true; @@ -520,8 +655,6 @@ contract Colosseum is Initializable, ISemver { // Delete output root. L2_ORACLE.replaceL2Output(_outputIndex, DELETED_OUTPUT_ROOT, msg.sender); - // The challenger's bond is also included in the bond for that output. - L2_ORACLE.VALIDATOR_POOL().increaseBond(_outputIndex, msg.sender); } /** @@ -532,13 +665,10 @@ contract Colosseum is Initializable, ISemver { * @param _challenger Address of the challenger. */ function challengerTimeout(uint256 _outputIndex, address _challenger) external { - Types.Challenge storage challenge = challenges[_outputIndex][_challenger]; - ChallengeStatus status = _challengeStatus(challenge); - - require( - status == ChallengeStatus.CHALLENGER_TIMEOUT, - "Colosseum: can only be called if the challenger is in timout" - ); + if ( + _challengeStatus(challenges[_outputIndex][_challenger]) != + ChallengeStatus.CHALLENGER_TIMEOUT + ) revert ImproperChallengeStatus(); _challengerTimeout(_outputIndex, _challenger); } @@ -551,14 +681,10 @@ contract Colosseum is Initializable, ISemver { */ function cancelChallenge(uint256 _outputIndex) external { Types.Challenge storage challenge = challenges[_outputIndex][msg.sender]; - ChallengeStatus status = _challengeStatus(challenge); - require(status != ChallengeStatus.NONE, "Colosseum: the challenge does not exist"); - - require( - _cancelIfOutputDeleted(_outputIndex, challenge.challenger, status), - "Colosseum: challenge cannot be cancelled" - ); + if ( + !_cancelIfOutputDeleted(_outputIndex, challenge.challenger, _challengeStatus(challenge)) + ) revert CannotCancelChallenge(); } /** @@ -577,20 +703,33 @@ contract Colosseum is Initializable, ISemver { address _asserter, bytes32 _outputRoot, bytes32 _publicInputHash - ) external onlySecurityCouncil { - require( - _outputRoot != DELETED_OUTPUT_ROOT, - "Colosseum: cannot rollback output to zero hash" - ); - require( - L2_ORACLE.getL2Output(_outputIndex).outputRoot == DELETED_OUTPUT_ROOT, - "Colosseum: only can rollback if the output has been deleted" - ); + ) external { + _checkSecurityCouncil(); + _checkOutputNotFinalized(_outputIndex); + + if (L2_ORACLE.getL2Output(_outputIndex).outputRoot != DELETED_OUTPUT_ROOT) + revert OutputNotDeleted(); + if (_outputRoot != deletedOutputs[_outputIndex].outputRoot) revert InvalidOutputGiven(); + if ( + _challenger != L2_ORACLE.getSubmitter(_outputIndex) || + _asserter != deletedOutputs[_outputIndex].submitter + ) revert InvalidAddressGiven(); + if (!verifiedPublicInputs[_publicInputHash]) revert InvalidPublicInput(); + verifiedPublicInputs[_publicInputHash] = false; + delete deletedOutputs[_outputIndex]; // Rollback output root. L2_ORACLE.replaceL2Output(_outputIndex, _outputRoot, _asserter); + // Switch validator system after validator pool contract terminated. + if (L2_ORACLE.VALIDATOR_POOL().isTerminated(_outputIndex)) { + // Revert slash asserter. + L2_ORACLE.VALIDATOR_MANAGER().revertSlash(_outputIndex, _asserter); + // Slash challenger. + L2_ORACLE.VALIDATOR_MANAGER().slash(_outputIndex, _asserter, _challenger); + } + emit ChallengeDismissed(_outputIndex, _challenger, block.timestamp); } @@ -600,18 +739,40 @@ contract Colosseum is Initializable, ISemver { * * @param _outputIndex Index of the L2 checkpoint output. */ - function forceDeleteOutput( - uint256 _outputIndex - ) external onlySecurityCouncil outputNotFinalized(_outputIndex) { + function forceDeleteOutput(uint256 _outputIndex) external { + _checkSecurityCouncil(); + _checkOutputNotFinalized(_outputIndex); + // Check if the output is deleted. Types.CheckpointOutput memory output = L2_ORACLE.getL2Output(_outputIndex); - require( - output.outputRoot != DELETED_OUTPUT_ROOT, - "Colosseum: the output has already been deleted" - ); + if (output.outputRoot == DELETED_OUTPUT_ROOT) revert OutputAlreadyDeleted(); // Delete output root. L2_ORACLE.replaceL2Output(_outputIndex, DELETED_OUTPUT_ROOT, SECURITY_COUNCIL); + + // Switch validator system after validator pool contract terminated. + if (L2_ORACLE.VALIDATOR_POOL().isTerminated(_outputIndex)) { + // Slash the asserter's asset and move it to pending challenge reward for the output. + L2_ORACLE.VALIDATOR_MANAGER().slash(_outputIndex, SECURITY_COUNCIL, output.submitter); + } + + emit OutputForceDeleted(_outputIndex, output.submitter, block.timestamp); + } + + /** + * @notice Reverts if the caller is not security council. + */ + function _checkSecurityCouncil() internal view { + if (msg.sender != SECURITY_COUNCIL) revert NotAllowedCaller(); + } + + /** + * @notice Reverts if the output of given index is already finalized. + * + * @param _outputIndex Index of the L2 checkpoint output. + */ + function _checkOutputNotFinalized(uint256 _outputIndex) internal view { + if (L2_ORACLE.isFinalized(_outputIndex)) revert OutputAlreadyFinalized(); } /** @@ -627,15 +788,10 @@ contract Colosseum is Initializable, ISemver { bytes32 _prevFirst, bytes32 _prevLast, bytes32[] memory _segments - ) private view { - uint256 segLen = _segments.length; - - require(getSegmentsLength(_turn) == segLen, "Colosseum: invalid segments length"); - require(_prevFirst == _segments[0], "Colosseum: the first segment must be matched"); - require( - _prevLast != _segments[segLen - 1], - "Colosseum: the last segment must not be matched" - ); + ) internal view { + if (segmentsLengths[_turn - 1] != _segments.length) revert InvalidSegmentsLength(); + if (_prevFirst != _segments[0]) revert FirstSegmentMismatched(); + if (_prevLast == _segments[_segments.length - 1]) revert LastSegmentMatched(); } /** @@ -670,32 +826,6 @@ contract Colosseum is Initializable, ISemver { } } - /** - * @notice Validates and updates the lengths of segments. - * - * @param _segmentsLengths Lengths of segments. - */ - function _setSegmentsLengths(uint256[] memory _segmentsLengths) private { - // _segmentsLengths length should be an even number in order to let challenger submit - // invalidity proof at the last turn. - require( - _segmentsLengths.length % 2 == 0, - "Colosseum: length of segments lengths cannot be odd number" - ); - - uint256 sum = 1; - for (uint256 i = 0; i < _segmentsLengths.length; ) { - segmentsLengths[i] = _segmentsLengths[i]; - sum = sum * (_segmentsLengths[i] - 1); - - unchecked { - ++i; - } - } - - require(sum == L2_ORACLE_SUBMISSION_INTERVAL, "Colosseum: invalid segments lengths"); - } - /** * @notice Checks if the L2ToL1MesagePasser account is included in the given state root. * @@ -711,7 +841,7 @@ contract Colosseum is Initializable, ISemver { bytes32 _l2ToL1MessagePasserCodeHash, bytes32 _messagePasserStorageRoot, bytes32 _stateRoot - ) private view { + ) internal view { // TODO(chokobole): Can we fix the codeHash? bytes memory l2ToL1MessagePasserAccount = abi.encodePacked( uint256(0), // nonce @@ -720,15 +850,14 @@ contract Colosseum is Initializable, ISemver { _messagePasserStorageRoot // storage root ); - require( - IZKMerkleTrie(ZK_MERKLE_TRIE).verifyInclusionProof( + if ( + !IZKMerkleTrie(ZK_MERKLE_TRIE).verifyInclusionProof( bytes32(bytes20(Predeploys.L2_TO_L1_MESSAGE_PASSER)), l2ToL1MessagePasserAccount, _merkleProof, _stateRoot - ), - "Colosseum: invalid L2ToL1MessagePasser inclusion proof" - ); + ) + ) revert InvalidInclusionProof(); } /** @@ -748,25 +877,17 @@ contract Colosseum is Initializable, ISemver { bytes32 _dstOutputRoot, Types.OutputRootProof calldata _srcOutputRootProof, Types.OutputRootProof calldata _dstOutputRootProof - ) private view { - require( - _challenge.segments[_pos] == _srcOutputRoot, - "Colosseum: the source segment must be matched" - ); + ) internal view { + if (_challenge.segments[_pos] != _srcOutputRoot) revert FirstSegmentMismatched(); // If asserter timeout, the bisection of segments may not have ended. // Therefore, segment validation only proceeds when bisection is not possible. if (!_isAbleToBisect(_challenge)) { - require( - _challenge.segments[_pos + 1] != _dstOutputRoot, - "Colosseum: the destination segment must not be matched" - ); + if (_challenge.segments[_pos + 1] == _dstOutputRoot) revert LastSegmentMatched(); } - require( - _srcOutputRootProof.nextBlockHash == _dstOutputRootProof.blockHash, - "Colosseum: the block hash must be matched" - ); + if (_srcOutputRootProof.nextBlockHash != _dstOutputRootProof.blockHash) + revert BlockHashMismatchedBtwSrcAndDst(); } /** @@ -783,27 +904,22 @@ contract Colosseum is Initializable, ISemver { Types.OutputRootProof calldata _dstOutputRootProof, Types.PublicInput calldata _publicInput, Types.BlockHeaderRLP calldata _rlps - ) private pure { + ) internal pure { // TODO(chokobole): check withdrawal storage root of _dstOutputRootProof against state root of _dstOutputRootProof. - require( - _publicInput.stateRoot == _dstOutputRootProof.stateRoot, - "Colosseum: the state root must be matched" - ); + if (_publicInput.stateRoot != _dstOutputRootProof.stateRoot) revert StateRootMismatched(); // parentBeaconRoot is non-zero for Cancun block bytes32 blockHash = _publicInput.parentBeaconRoot != bytes32(0) ? Hashing.hashBlockHeaderCancun(_publicInput, _rlps) : Hashing.hashBlockHeaderShanghai(_publicInput, _rlps); - require( - _srcOutputRootProof.nextBlockHash == blockHash, - "Colosseum: the block hash from public input must be matched" - ); + if (_srcOutputRootProof.nextBlockHash != blockHash) revert BlockHashMismatched(); } /** * @notice Cancels the challenge if the output root to be challenged has already been deleted. - * If the output root has been deleted, delete the challenge and refund the challenger's pending bond. + * If the output root has been deleted, delete the challenge. Note that before validator + * system upgrade, also refund the challenger's pending bond in validator pool. * Reverts when challenger is timed out or called by non-challenger. * * @param _outputIndex Index of the L2 checkpoint output. @@ -817,30 +933,32 @@ contract Colosseum is Initializable, ISemver { address _challenger, ChallengeStatus _status ) private returns (bool) { - bytes32 outputRoot = L2_ORACLE.getL2Output(_outputIndex).outputRoot; - if (outputRoot != DELETED_OUTPUT_ROOT) { + if (L2_ORACLE.getL2Output(_outputIndex).outputRoot != DELETED_OUTPUT_ROOT) { return false; } // If the output is deleted, the asserter does not need to do anything further. - require(msg.sender == _challenger, "Colosseum: sender is not a challenger"); + if (msg.sender != _challenger) revert OnlyChallengerCanCancel(); - require( - _status != ChallengeStatus.CHALLENGER_TIMEOUT, - "Colosseum: challenge cannot be cancelled if challenger timed out" - ); + if (_status == ChallengeStatus.NONE || _status == ChallengeStatus.CHALLENGER_TIMEOUT) + revert ImproperChallengeStatusToCancel(); delete challenges[_outputIndex][msg.sender]; emit ChallengeCanceled(_outputIndex, msg.sender, block.timestamp); - L2_ORACLE.VALIDATOR_POOL().releasePendingBond(_outputIndex, msg.sender, msg.sender); + // Switch validator system after validator pool contract terminated. + if (L2_ORACLE.VALIDATOR_POOL().isTerminated(_outputIndex)) { + L2_ORACLE.VALIDATOR_MANAGER().unbondValidatorKro(msg.sender); + } else { + L2_ORACLE.VALIDATOR_POOL().releasePendingBond(_outputIndex, msg.sender, msg.sender); + } return true; } /** * @notice Deletes the challenge because the challenger timed out. - * The winner is the asserter, and challenger loses the bond. + * The winner is the asserter, and challenger loses their asset. * * @param _outputIndex Index of the L2 checkpoint output. * @param _challenger Address of the challenger. @@ -849,13 +967,22 @@ contract Colosseum is Initializable, ISemver { delete challenges[_outputIndex][_challenger]; emit ChallengerTimedOut(_outputIndex, _challenger, block.timestamp); + // Switch validator system after validator pool contract terminated. + if (L2_ORACLE.VALIDATOR_POOL().isTerminated(_outputIndex)) { + L2_ORACLE.VALIDATOR_MANAGER().slash( + _outputIndex, + L2_ORACLE.getSubmitter(_outputIndex), + _challenger + ); + return; + } + // After output is finalized, the challenger's bond is included in the balance of output submitter. if (L2_ORACLE.isFinalized(_outputIndex)) { - Types.CheckpointOutput memory targetOutput = L2_ORACLE.getL2Output(_outputIndex); L2_ORACLE.VALIDATOR_POOL().releasePendingBond( _outputIndex, _challenger, - targetOutput.submitter + L2_ORACLE.getSubmitter(_outputIndex) ); } else { // Because the challenger lost, the challenger's bond is included in the bond for that output. @@ -874,7 +1001,7 @@ contract Colosseum is Initializable, ISemver { function _hashPublicInput( bytes32 _prevStateRoot, Types.PublicInput calldata _publicInput - ) private view returns (bytes32) { + ) internal view returns (bytes32) { bytes32[] memory dummyHashes; if (_publicInput.txHashes.length < MAX_TXS) { dummyHashes = Hashing.generateDummyHashes( @@ -899,20 +1026,8 @@ contract Colosseum is Initializable, ISemver { * * @return The number of L2 blocks for the next turn. */ - function _nextSegSize(Types.Challenge storage _challenge) private view returns (uint256) { - uint8 turn = _challenge.turn; - return _challenge.segSize / (getSegmentsLength(turn) - 1); - } - - /** - * @notice Determines whether a given timestamp is past. - * - * @param _sec The timestamp to check. - * - * @return Whether it's in the past. - */ - function _isPast(uint256 _sec) private view returns (bool) { - return block.timestamp > _sec; + function _nextSegSize(Types.Challenge storage _challenge) internal view returns (uint256) { + return _challenge.segSize / (segmentsLengths[_challenge.turn - 1] - 1); } /** @@ -922,24 +1037,10 @@ contract Colosseum is Initializable, ISemver { * * @return Whether bisection is possible. */ - function _isAbleToBisect(Types.Challenge storage _challenge) private view returns (bool) { + function _isAbleToBisect(Types.Challenge storage _challenge) internal view returns (bool) { return _nextSegSize(_challenge) > 1; } - /** - * @notice Determines if the next turn is the challenger's turn. - * Note that challenger turns are odd numbers and asserter turns are even numbers. - * - * @param _turn The current turn. - * - * @return Whether the next turn is the challenger's turn. - */ - function _isNextForChallenger(uint8 _turn) private pure returns (bool) { - // If the _turn value is even, it means that the asserter has completed its turn, - // so the next turn will be the challenger's turn. - return _turn % 2 == 0; - } - /** * @notice Returns status of a given challenge. * @@ -949,15 +1050,17 @@ contract Colosseum is Initializable, ISemver { */ function _challengeStatus( Types.Challenge storage _challenge - ) private view returns (ChallengeStatus) { + ) internal view returns (ChallengeStatus) { if (_challenge.turn < TURN_INIT) { return ChallengeStatus.NONE; } - bool isChallengerTurn = _isNextForChallenger(_challenge.turn); + // If the turn is even, it means that the asserter has completed its turn, + // so the next turn will be the challenger's turn. + bool isChallengerTurn = _challenge.turn % 2 == 0; // Check if it's a timed out challenge. - if (_isPast(_challenge.timeoutAt)) { + if (block.timestamp > _challenge.timeoutAt) { // timeout on challenger turn if (isChallengerTurn) { return ChallengeStatus.CHALLENGER_TIMEOUT; @@ -965,7 +1068,7 @@ contract Colosseum is Initializable, ISemver { // If the asserter times out and the challenger does not prove fault, // the challenger is assumed to have timed out. - if (_isPast(_challenge.timeoutAt + PROVING_TIMEOUT)) { + if (block.timestamp > _challenge.timeoutAt + PROVING_TIMEOUT) { return ChallengeStatus.CHALLENGER_TIMEOUT; } @@ -982,18 +1085,18 @@ contract Colosseum is Initializable, ISemver { } /** - * @notice Returns the challenge corresponding to the given L2 output index. + * @notice Returns the challenge segments corresponding to the given L2 output index and challenger. * * @param _outputIndex Index of the L2 checkpoint output. * @param _challenger Address of the challenger. * - * @return The challenge data. + * @return The challenge segments data. */ - function getChallenge( + function getSegments( uint256 _outputIndex, address _challenger - ) external view returns (Types.Challenge memory) { - return challenges[_outputIndex][_challenger]; + ) external view returns (bytes32[] memory) { + return challenges[_outputIndex][_challenger].segments; } /** @@ -1008,34 +1111,7 @@ contract Colosseum is Initializable, ISemver { uint256 _outputIndex, address _challenger ) external view returns (ChallengeStatus) { - Types.Challenge storage challenge = challenges[_outputIndex][_challenger]; - return _challengeStatus(challenge); - } - - /** - * @notice Returns the segment length required for that turn. - * - * @param _turn The challenge turn. - * - * @return The segments length. - */ - function getSegmentsLength(uint8 _turn) public view returns (uint256) { - require(_turn >= TURN_INIT, "Colosseum: invalid turn"); - return segmentsLengths[_turn - 1]; - } - - /** - * @notice Determines whether bisection is possible in the challenge corresponding to the given - * L2 output index. - * - * @param _outputIndex Index of the L2 checkpoint output. - * @param _challenger Address of the challenger. - * - * @return Whether bisection is possible. - */ - function isAbleToBisect(uint256 _outputIndex, address _challenger) public view returns (bool) { - Types.Challenge storage challenge = challenges[_outputIndex][_challenger]; - return _isAbleToBisect(challenge); + return _challengeStatus(challenges[_outputIndex][_challenger]); } /** @@ -1046,7 +1122,8 @@ contract Colosseum is Initializable, ISemver { * @return Whether current timestamp is in challenge creation period. */ function isInCreationPeriod(uint256 _outputIndex) external view returns (bool) { - Types.CheckpointOutput memory targetOutput = L2_ORACLE.getL2Output(_outputIndex); - return targetOutput.timestamp + CREATION_PERIOD_SECONDS >= block.timestamp; + return + L2_ORACLE.getL2Output(_outputIndex).timestamp + CREATION_PERIOD_SECONDS >= + block.timestamp; } } diff --git a/packages/contracts/contracts/L1/L2OutputOracle.sol b/packages/contracts/contracts/L1/L2OutputOracle.sol index fe3b2391ce..075769133a 100644 --- a/packages/contracts/contracts/L1/L2OutputOracle.sol +++ b/packages/contracts/contracts/L1/L2OutputOracle.sol @@ -6,6 +6,7 @@ import { Initializable } from "@openzeppelin/contracts/proxy/utils/Initializable import { Constants } from "../libraries/Constants.sol"; import { Types } from "../libraries/Types.sol"; import { ISemver } from "../universal/ISemver.sol"; +import { IValidatorManager } from "./interfaces/IValidatorManager.sol"; import { ValidatorPool } from "./ValidatorPool.sol"; /** @@ -21,6 +22,11 @@ contract L2OutputOracle is Initializable, ISemver { */ ValidatorPool public immutable VALIDATOR_POOL; + /** + * @notice The address of the validator manager contract. Can be updated via upgrade. + */ + IValidatorManager public immutable VALIDATOR_MANAGER; + /** * @notice The address of the colosseum contract. Can be updated via upgrade. */ @@ -58,6 +64,11 @@ contract L2OutputOracle is Initializable, ISemver { */ Types.CheckpointOutput[] internal l2Outputs; + /** + * @notice The output index of the next finalization target output. + */ + uint256 public nextFinalizeOutputIndex; + /** * @notice Emitted when an output is submitted. * @@ -77,20 +88,26 @@ contract L2OutputOracle is Initializable, ISemver { * @notice Emitted when an output is replaced. * * @param outputIndex Replaced L2 output index. + * @param newSubmitter Output submitter after replacement. * @param newOutputRoot L2 output root after replacement. */ - event OutputReplaced(uint256 indexed outputIndex, bytes32 newOutputRoot); + event OutputReplaced( + uint256 indexed outputIndex, + address indexed newSubmitter, + bytes32 newOutputRoot + ); /** * @notice Semantic version. - * @custom:semver 1.0.0 + * @custom:semver 1.1.0 */ - string public constant version = "1.0.0"; + string public constant version = "1.1.0"; /** * @notice Constructs the L2OutputOracle contract. * * @param _validatorPool The address of the ValidatorPool contract. + * @param _validatorManager The address of the ValidatorManager contract. * @param _colosseum The address of the Colosseum contract. * @param _submissionInterval Interval in blocks at which checkpoints must be submitted. * @param _l2BlockTime The time per L2 block, in seconds. @@ -100,6 +117,7 @@ contract L2OutputOracle is Initializable, ISemver { */ constructor( ValidatorPool _validatorPool, + IValidatorManager _validatorManager, address _colosseum, uint256 _submissionInterval, uint256 _l2BlockTime, @@ -114,6 +132,7 @@ contract L2OutputOracle is Initializable, ISemver { ); VALIDATOR_POOL = _validatorPool; + VALIDATOR_MANAGER = _validatorManager; COLOSSEUM = _colosseum; SUBMISSION_INTERVAL = _submissionInterval; L2_BLOCK_TIME = _l2BlockTime; @@ -128,10 +147,10 @@ contract L2OutputOracle is Initializable, ISemver { * @param _startingBlockNumber Block number for the first recorded L2 block. * @param _startingTimestamp Timestamp for the first recorded L2 block. */ - function initialize(uint256 _startingBlockNumber, uint256 _startingTimestamp) - public - initializer - { + function initialize( + uint256 _startingBlockNumber, + uint256 _startingTimestamp + ) public initializer { require( _startingTimestamp <= block.timestamp, "L2OutputOracle: starting L2 timestamp must be less than current time" @@ -177,7 +196,7 @@ contract L2OutputOracle is Initializable, ISemver { output.outputRoot = _newOutputRoot; output.submitter = _submitter; - emit OutputReplaced(_l2OutputIndex, _newOutputRoot); + emit OutputReplaced(_l2OutputIndex, _submitter, _newOutputRoot); } /** @@ -196,9 +215,21 @@ contract L2OutputOracle is Initializable, ISemver { bytes32 _l1BlockHash, uint256 _l1BlockNumber ) external payable { - address nextValidator = VALIDATOR_POOL.nextValidator(); + uint256 outputIndex = nextOutputIndex(); + + // Upgrade validator system after validator pool contract is terminated. + bool isValidatorPoolTerminated = VALIDATOR_POOL.isTerminated(outputIndex); + address nextValidator; + if (isValidatorPoolTerminated) { + VALIDATOR_MANAGER.checkSubmissionEligibility(msg.sender); + } else { + nextValidator = VALIDATOR_POOL.nextValidator(); + } + // If it's not a public round, only selected validators can submit output. - if (nextValidator != Constants.VALIDATOR_PUBLIC_ROUND_ADDRESS) { + if ( + !isValidatorPoolTerminated && nextValidator != Constants.VALIDATOR_PUBLIC_ROUND_ADDRESS + ) { require( msg.sender == nextValidator, "L2OutputOracle: only the next selected validator can submit output" @@ -211,7 +242,7 @@ contract L2OutputOracle is Initializable, ISemver { ); require( - computeL2Timestamp(_l2BlockNumber) < block.timestamp, + nextOutputMinL2Timestamp() <= block.timestamp, "L2OutputOracle: cannot submit L2 output in the future" ); @@ -231,8 +262,6 @@ contract L2OutputOracle is Initializable, ISemver { ); } - uint256 outputIndex = nextOutputIndex(); - l2Outputs.push( Types.CheckpointOutput({ submitter: msg.sender, @@ -244,10 +273,37 @@ contract L2OutputOracle is Initializable, ISemver { emit OutputSubmitted(_outputRoot, outputIndex, _l2BlockNumber, block.timestamp); - VALIDATOR_POOL.createBond( - outputIndex, - uint128(block.timestamp + FINALIZATION_PERIOD_SECONDS) - ); + if (isValidatorPoolTerminated) { + VALIDATOR_MANAGER.afterSubmitL2Output(outputIndex); + } else { + VALIDATOR_POOL.createBond( + outputIndex, + uint128(block.timestamp + FINALIZATION_PERIOD_SECONDS) + ); + } + } + + /** + * @notice Updates the next output index to be finalized. This function may only be called by + * the validator pool contract before terminated, after that by the validator manager + * contract. + * + * @param _outputIndex Index of the next output to be finalized. + */ + function setNextFinalizeOutputIndex(uint256 _outputIndex) external { + if (VALIDATOR_POOL.isTerminated(_outputIndex - 1)) { + require( + msg.sender == address(VALIDATOR_MANAGER), + "L2OutputOracle: only the validator manager contract can set next finalize output index" + ); + } else { + require( + msg.sender == address(VALIDATOR_POOL), + "L2OutputOracle: only the validator pool contract can set next finalize output index" + ); + } + + nextFinalizeOutputIndex = _outputIndex; } /** @@ -257,11 +313,9 @@ contract L2OutputOracle is Initializable, ISemver { * * @return The output at the given index. */ - function getL2Output(uint256 _l2OutputIndex) - external - view - returns (Types.CheckpointOutput memory) - { + function getL2Output( + uint256 _l2OutputIndex + ) external view returns (Types.CheckpointOutput memory) { return l2Outputs[_l2OutputIndex]; } @@ -308,11 +362,9 @@ contract L2OutputOracle is Initializable, ISemver { * * @return First checkpoint that commits to the given L2 block number. */ - function getL2OutputAfter(uint256 _l2BlockNumber) - external - view - returns (Types.CheckpointOutput memory) - { + function getL2OutputAfter( + uint256 _l2BlockNumber + ) external view returns (Types.CheckpointOutput memory) { return l2Outputs[getL2OutputIndexAfter(_l2BlockNumber)]; } @@ -371,6 +423,17 @@ contract L2OutputOracle is Initializable, ISemver { return startingTimestamp + ((_l2BlockNumber - startingBlockNumber) * L2_BLOCK_TIME); } + /** + * @notice Returns the L2 timestamp corresponding to the right next block of the block that + * needs to be checkpointed. + * Note that the added one is because of the existence of next block hash in the output. + * + * @return L2 timestamp of the right next block of the block that needs to be checkpointed. + */ + function nextOutputMinL2Timestamp() public view returns (uint256) { + return computeL2Timestamp(nextBlockNumber() + 1); + } + /** * @notice Returns the address of the L2 output submitter. * @@ -390,7 +453,7 @@ contract L2OutputOracle is Initializable, ISemver { * @return If the given output is finalized or not. */ function isFinalized(uint256 _outputIndex) external view returns (bool) { - return l2Outputs[_outputIndex].timestamp + FINALIZATION_PERIOD_SECONDS < block.timestamp; + return finalizedAt(_outputIndex) <= block.timestamp; } /** @@ -400,7 +463,7 @@ contract L2OutputOracle is Initializable, ISemver { * * @return The finalization time of given output index. */ - function finalizedAt(uint256 _outputIndex) external view returns (uint256) { + function finalizedAt(uint256 _outputIndex) public view returns (uint256) { return l2Outputs[_outputIndex].timestamp + FINALIZATION_PERIOD_SECONDS; } } diff --git a/packages/contracts/contracts/L1/ValidatorManager.sol b/packages/contracts/contracts/L1/ValidatorManager.sol new file mode 100644 index 0000000000..a28ba3b596 --- /dev/null +++ b/packages/contracts/contracts/L1/ValidatorManager.sol @@ -0,0 +1,739 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { Math } from "@openzeppelin/contracts/utils/math/Math.sol"; + +import { Atan2 } from "../libraries/Atan2.sol"; +import { BalancedWeightTree } from "../libraries/BalancedWeightTree.sol"; +import { Constants } from "../libraries/Constants.sol"; +import { Types } from "../libraries/Types.sol"; +import { Uint128Math } from "../libraries/Uint128Math.sol"; +import { ISemver } from "../universal/ISemver.sol"; +import { AssetManager } from "./AssetManager.sol"; +import { IValidatorManager } from "./interfaces/IValidatorManager.sol"; +import { L2OutputOracle } from "./L2OutputOracle.sol"; + +/** + * @custom:proxied + * @title ValidatorManager + * @notice The ValidatorManager manages validator set and determines the next validator who can + * submit the checkpoint output to L2OutputOracle. + */ +contract ValidatorManager is ISemver, IValidatorManager { + using BalancedWeightTree for BalancedWeightTree.Tree; + using Uint128Math for uint128; + using Math for uint256; + + /** + * @notice The denominator for the commission rate. + */ + uint128 public constant COMMISSION_RATE_DENOM = 100; + + /** + * @notice The numerator for the boosted reward. + */ + uint128 public constant BOOSTED_REWARD_NUMERATOR = 40; + + /** + * @notice The denominator for the boosted reward. + */ + uint128 public constant BOOSTED_REWARD_DENOM = 100; + + /** + * @notice Address of the L2OutputOracle contract. Can be updated via upgrade. + */ + L2OutputOracle public immutable L2_ORACLE; + + /** + * @notice The address of AssetManager contract. Can be updated via upgrade. + */ + AssetManager public immutable ASSET_MANAGER; + + /** + * @notice The address of the trusted validator. + */ + address public immutable TRUSTED_VALIDATOR; + + /** + * @notice Minimum amount to register as a validator. It should be equal or more than + * ASSET_MANAGER.BOND_AMOUNT. + */ + uint128 public immutable MIN_REGISTER_AMOUNT; + + /** + * @notice Minimum amount to activate a validator and add it to the validator tree. + * Note that only the active validators can submit outputs. + */ + uint128 public immutable MIN_ACTIVATE_AMOUNT; + + /** + * @notice The delay to finalize the commission rate change of the validator (in seconds). + */ + uint128 public immutable COMMISSION_CHANGE_DELAY_SECONDS; + + /** + * @notice The duration of a submission round for one output (in seconds). + * Note that there are two submission rounds for an output: PRIORITY ROUND and PUBLIC + * ROUND. + */ + uint128 public immutable ROUND_DURATION_SECONDS; + + /** + * @notice The minimum duration to get out of jail in output non-submissions penalty (in seconds). + */ + uint128 public immutable SOFT_JAIL_PERIOD_SECONDS; + + /** + * @notice The maximum duration to get out of jail in slashing penalty (in seconds). + */ + uint128 public immutable HARD_JAIL_PERIOD_SECONDS; + + /** + * @notice Maximum allowed number of output non-submissions in priority round before the + * validator goes to jail. + */ + uint128 public immutable JAIL_THRESHOLD; + + /** + * @notice The max number of outputs to be finalized at once when distributing rewards. + */ + uint128 public immutable MAX_OUTPUT_FINALIZATIONS; + + /** + * @notice Amount of base reward for the validator. + */ + uint128 public immutable BASE_REWARD; + + /** + * @notice Address of the next validator with priority for submitting output. + */ + address internal _nextPriorityValidator; + + /** + * @notice Weighted tree to store and calculate the probability to be selected as an output submitter. + */ + BalancedWeightTree.Tree internal _validatorTree; + + /** + * @notice A mapping of the validator to the validator information. + */ + mapping(address => Validator) internal _validatorInfo; + + /** + * @notice A mapping of the jailed validator to the jail expiration timestamp. + */ + mapping(address => uint128) internal _jail; + + /** + * @notice A mapping of output index challenged successfully to pending challenge rewards. + */ + mapping(uint256 => uint128) internal _pendingChallengeReward; + + /** + * @notice A modifier that only allows L2OutputOracle contract to call. + */ + modifier onlyL2OutputOracle() { + if (msg.sender != address(L2_ORACLE)) revert NotAllowedCaller(); + _; + } + + /** + * @notice A modifier that only allows Colosseum contract to call. + */ + modifier onlyColosseum() { + if (msg.sender != L2_ORACLE.COLOSSEUM()) revert NotAllowedCaller(); + _; + } + + /** + * @notice A modifier that only allows AssetManager contract to call. + */ + modifier onlyAssetManager() { + if (msg.sender != address(ASSET_MANAGER)) revert NotAllowedCaller(); + _; + } + + /** + * @notice Semantic version. + * @custom:semver 1.0.0 + */ + string public constant version = "1.0.0"; + + /** + * @notice Constructs the ValidatorManager contract. + * + * @param _constructorParams The constructor parameters. + */ + constructor(ConstructorParams memory _constructorParams) { + if (_constructorParams._minRegisterAmount > _constructorParams._minActivateAmount) + revert InvalidConstructorParams(); + + L2_ORACLE = _constructorParams._l2Oracle; + ASSET_MANAGER = _constructorParams._assetManager; + TRUSTED_VALIDATOR = _constructorParams._trustedValidator; + MIN_REGISTER_AMOUNT = _constructorParams._minRegisterAmount; + MIN_ACTIVATE_AMOUNT = _constructorParams._minActivateAmount; + COMMISSION_CHANGE_DELAY_SECONDS = _constructorParams._commissionChangeDelaySeconds; + // Note that this value MUST be (SUBMISSION_INTERVAL * L2_BLOCK_TIME) / 2. + ROUND_DURATION_SECONDS = _constructorParams._roundDurationSeconds; + SOFT_JAIL_PERIOD_SECONDS = _constructorParams._softJailPeriodSeconds; + HARD_JAIL_PERIOD_SECONDS = _constructorParams._hardJailPeriodSeconds; + JAIL_THRESHOLD = _constructorParams._jailThreshold; + MAX_OUTPUT_FINALIZATIONS = _constructorParams._maxOutputFinalizations; + BASE_REWARD = _constructorParams._baseReward; + } + + /** + * @inheritdoc IValidatorManager + */ + function registerValidator( + uint128 assets, + uint8 commissionRate, + address withdrawAccount + ) external { + if (msg.sender.code.length > 0 || msg.sender != tx.origin) revert NotAllowedCaller(); + if (getStatus(msg.sender) != ValidatorStatus.NONE) revert ImproperValidatorStatus(); + if (assets < MIN_REGISTER_AMOUNT) revert InsufficientAsset(); + if (commissionRate > COMMISSION_RATE_DENOM) revert MaxCommissionRateExceeded(); + + Validator storage validatorInfo = _validatorInfo[msg.sender]; + validatorInfo.isInitiated = true; + validatorInfo.commissionRate = commissionRate; + + ASSET_MANAGER.depositToRegister(msg.sender, assets, withdrawAccount); + + bool ready = assets >= MIN_ACTIVATE_AMOUNT; + if (ready) { + _activateValidator(msg.sender); + } + + emit ValidatorRegistered(msg.sender, ready, commissionRate, assets); + } + + /** + * @inheritdoc IValidatorManager + */ + function activateValidator() external { + if (getStatus(msg.sender) != ValidatorStatus.READY || inJail(msg.sender)) + revert ImproperValidatorStatus(); + + _activateValidator(msg.sender); + } + + /** + * @inheritdoc IValidatorManager + */ + function tryActivateValidator(address validator) external onlyAssetManager { + if (getStatus(validator) == ValidatorStatus.READY && !inJail(validator)) + _activateValidator(validator); + } + + /** + * @inheritdoc IValidatorManager + */ + function afterSubmitL2Output(uint256 outputIndex) external onlyL2OutputOracle { + _distributeReward(); + + // Bond validator KRO to reserve slashing amount. + address submitter = L2_ORACLE.getSubmitter(outputIndex); + ASSET_MANAGER.bondValidatorKro(submitter); + + if (submitter == _nextPriorityValidator) { + _resetNoSubmissionCount(submitter); + } else { + _tryJail(); + } + + // Select the next priority validator. + _updatePriorityValidator(); + } + + /** + * @inheritdoc IValidatorManager + */ + function initCommissionChange(uint8 newCommissionRate) external { + if (getStatus(msg.sender) < ValidatorStatus.REGISTERED || inJail(msg.sender)) + revert ImproperValidatorStatus(); + + if (newCommissionRate > COMMISSION_RATE_DENOM) revert MaxCommissionRateExceeded(); + + Validator storage validatorInfo = _validatorInfo[msg.sender]; + uint8 oldCommissionRate = validatorInfo.commissionRate; + if (newCommissionRate == oldCommissionRate) revert SameCommissionRate(); + + validatorInfo.pendingCommissionRate = newCommissionRate; + validatorInfo.commissionChangeInitiatedAt = uint128(block.timestamp); + + emit ValidatorCommissionChangeInitiated(msg.sender, oldCommissionRate, newCommissionRate); + } + + /** + * @inheritdoc IValidatorManager + */ + function finalizeCommissionChange() external { + if (getStatus(msg.sender) < ValidatorStatus.REGISTERED || inJail(msg.sender)) + revert ImproperValidatorStatus(); + + uint128 canFinalizeAt = canFinalizeCommissionChangeAt(msg.sender); + if (canFinalizeAt == COMMISSION_CHANGE_DELAY_SECONDS) revert NotInitiatedCommissionChange(); + if (block.timestamp < canFinalizeAt) revert NotElapsedCommissionChangeDelay(); + + Validator storage validatorInfo = _validatorInfo[msg.sender]; + uint8 oldCommissionRate = validatorInfo.commissionRate; + uint8 newCommissionRate = validatorInfo.pendingCommissionRate; + + validatorInfo.commissionRate = newCommissionRate; + validatorInfo.pendingCommissionRate = 0; + validatorInfo.commissionChangeInitiatedAt = 0; + + emit ValidatorCommissionChangeFinalized(msg.sender, oldCommissionRate, newCommissionRate); + } + + /** + * @inheritdoc IValidatorManager + */ + function tryUnjail() external { + if (!inJail(msg.sender)) revert ImproperValidatorStatus(); + if (_jail[msg.sender] > block.timestamp) revert NotElapsedJailPeriod(); + + _resetNoSubmissionCount(msg.sender); + delete _jail[msg.sender]; + + emit ValidatorUnjailed(msg.sender); + + if (getStatus(msg.sender) == ValidatorStatus.READY) { + _activateValidator(msg.sender); + } + } + + /** + * @inheritdoc IValidatorManager + */ + function bondValidatorKro(address validator) external onlyColosseum { + ASSET_MANAGER.bondValidatorKro(validator); + } + + /** + * @inheritdoc IValidatorManager + */ + function unbondValidatorKro(address validator) external onlyColosseum { + ASSET_MANAGER.unbondValidatorKro(validator); + } + + /** + * @inheritdoc IValidatorManager + */ + function slash(uint256 outputIndex, address winner, address loser) external onlyColosseum { + uint128 challengeReward = ASSET_MANAGER.decreaseBalanceWithChallenge(loser); + + emit Slashed(outputIndex, loser, challengeReward); + + _sendToJail(loser, false); + + if (L2_ORACLE.nextFinalizeOutputIndex() <= outputIndex) { + // If output is not rewarded yet, add slashing asset to the pending challenge reward. + unchecked { + _pendingChallengeReward[outputIndex] += challengeReward; + } + } else { + // If output is already rewarded, add slashing asset to the winner's asset directly. + challengeReward = ASSET_MANAGER.increaseBalanceWithChallenge(winner, challengeReward); + updateValidatorTree(winner, false); + + emit ChallengeRewardDistributed(outputIndex, winner, challengeReward); + } + } + + /** + * @inheritdoc IValidatorManager + */ + function revertSlash(uint256 outputIndex, address loser) external onlyColosseum { + uint128 challengeReward = ASSET_MANAGER.revertDecreaseBalanceWithChallenge(loser); + unchecked { + _pendingChallengeReward[outputIndex] -= challengeReward; + } + + emit SlashReverted(outputIndex, loser, challengeReward); + + if (inJail(loser)) { + // Revert jail expiration timestamp of the original loser. + uint128 expiresAt = _jail[loser] - HARD_JAIL_PERIOD_SECONDS; + if (block.timestamp < expiresAt) { + _jail[loser] = expiresAt; + + emit ValidatorJailed(loser, expiresAt); + } else { + delete _jail[loser]; + + emit ValidatorUnjailed(loser); + + if (getStatus(loser) == ValidatorStatus.READY) { + _activateValidator(loser); + } + } + } + } + + /** + * @inheritdoc IValidatorManager + */ + function checkSubmissionEligibility(address validator) external view onlyL2OutputOracle { + address _nextValidator = nextValidator(); + if ( + _nextValidator != Constants.VALIDATOR_PUBLIC_ROUND_ADDRESS && + validator != _nextValidator + ) revert NotSelectedPriorityValidator(); + + if (!isActive(validator)) revert ImproperValidatorStatus(); + } + + /** + * @inheritdoc IValidatorManager + */ + function getCommissionRate(address validator) external view returns (uint8) { + return _validatorInfo[validator].commissionRate; + } + + /** + * @inheritdoc IValidatorManager + */ + function getPendingCommissionRate(address validator) external view returns (uint8) { + return _validatorInfo[validator].pendingCommissionRate; + } + + /** + * @inheritdoc IValidatorManager + */ + function activatedValidatorCount() external view returns (uint32) { + return _validatorTree.counter - _validatorTree.removed; + } + + /** + * @inheritdoc IValidatorManager + */ + function getWeight(address validator) external view returns (uint120) { + return _validatorTree.nodes[_validatorTree.nodeMap[validator]].weight; + } + + /** + * @inheritdoc IValidatorManager + */ + function jailExpiresAt(address validator) external view returns (uint128) { + return _jail[validator]; + } + + /** + * @inheritdoc IValidatorManager + */ + function updateValidatorTree(address validator, bool tryRemove) public { + ValidatorStatus status = getStatus(validator); + if (tryRemove && (status == ValidatorStatus.EXITED || status == ValidatorStatus.INACTIVE)) { + if (_validatorTree.remove(validator)) emit ValidatorStopped(validator, block.timestamp); + } else if (status >= ValidatorStatus.INACTIVE) { + _validatorTree.update(validator, uint120(ASSET_MANAGER.reflectiveWeight(validator))); + } + } + + /** + * @inheritdoc IValidatorManager + */ + function nextValidator() public view returns (address) { + if (_nextPriorityValidator != address(0)) { + uint256 l2Timestamp = L2_ORACLE.nextOutputMinL2Timestamp(); + if (block.timestamp >= l2Timestamp) { + uint256 elapsed = block.timestamp - l2Timestamp; + // If the current time exceeds one round time, it is a public round. + if (elapsed > ROUND_DURATION_SECONDS) { + return Constants.VALIDATOR_PUBLIC_ROUND_ADDRESS; + } + } + + return _nextPriorityValidator; + } else { + return TRUSTED_VALIDATOR; + } + } + + /** + * @inheritdoc IValidatorManager + */ + function getStatus(address validator) public view returns (ValidatorStatus) { + if (!_validatorInfo[validator].isInitiated) { + return ValidatorStatus.NONE; + } + + if (ASSET_MANAGER.totalValidatorKro(validator) < MIN_REGISTER_AMOUNT) { + return ValidatorStatus.EXITED; + } + + bool activated = _validatorTree.nodeMap[validator] > 0; + + if (ASSET_MANAGER.reflectiveWeight(validator) < MIN_ACTIVATE_AMOUNT) { + if (!activated) { + return ValidatorStatus.REGISTERED; + } + return ValidatorStatus.INACTIVE; + } + + if (!activated) { + return ValidatorStatus.READY; + } + return ValidatorStatus.ACTIVE; + } + + /** + * @inheritdoc IValidatorManager + */ + function inJail(address validator) public view returns (bool) { + return _jail[validator] != 0; + } + + /** + * @inheritdoc IValidatorManager + */ + function isActive(address validator) public view returns (bool) { + if (getStatus(validator) == ValidatorStatus.ACTIVE) return true; + return false; + } + + /** + * @inheritdoc IValidatorManager + */ + function noSubmissionCount(address validator) public view returns (uint8) { + return _validatorInfo[validator].noSubmissionCount; + } + + /** + * @inheritdoc IValidatorManager + */ + function canFinalizeCommissionChangeAt(address validator) public view returns (uint128) { + return + _validatorInfo[validator].commissionChangeInitiatedAt + COMMISSION_CHANGE_DELAY_SECONDS; + } + + /** + * @inheritdoc IValidatorManager + */ + function activatedValidatorTotalWeight() public view returns (uint120) { + return _validatorTree.nodes[_validatorTree.root].weightSum; + } + + /** + * @notice Private function to activate a validator and adds the validator to validator tree. + * + * @param validator Address of the validator. + */ + function _activateValidator(address validator) private { + _validatorTree.insert(validator, uint120(ASSET_MANAGER.reflectiveWeight(validator))); + + emit ValidatorActivated(validator, block.timestamp); + } + + /** + * @notice Private function to add output submission rewards to the vaults of finalized output + * submitters. + * + * @return Whether the reward distribution is done at least once or not. + */ + function _distributeReward() private returns (bool) { + uint256 outputIndex = L2_ORACLE.nextFinalizeOutputIndex(); + uint256 latestOutputIndex = L2_ORACLE.latestOutputIndex(); + + if (!L2_ORACLE.VALIDATOR_POOL().isTerminated(outputIndex)) { + return false; + } + + uint128 finalizedOutputNum = 0; + address submitter; + + while (finalizedOutputNum < MAX_OUTPUT_FINALIZATIONS && outputIndex <= latestOutputIndex) { + if (L2_ORACLE.isFinalized(outputIndex)) { + submitter = L2_ORACLE.getSubmitter(outputIndex); + + ( + uint128 baseReward, + uint128 boostedReward, + uint128 validatorReward + ) = _calculateReward(submitter); + + ASSET_MANAGER.increaseBalanceWithReward( + submitter, + baseReward, + boostedReward, + validatorReward + ); + + emit RewardDistributed( + outputIndex, + submitter, + validatorReward, + baseReward, + boostedReward + ); + + uint128 challengeReward = _pendingChallengeReward[outputIndex]; + if (challengeReward > 0) { + challengeReward = ASSET_MANAGER.increaseBalanceWithChallenge( + submitter, + challengeReward + ); + delete _pendingChallengeReward[outputIndex]; + + emit ChallengeRewardDistributed(outputIndex, submitter, challengeReward); + } + + updateValidatorTree(submitter, false); + + unchecked { + ++outputIndex; + ++finalizedOutputNum; + } + } else { + break; + } + } + + if (finalizedOutputNum > 0) { + L2_ORACLE.setNextFinalizeOutputIndex(outputIndex); + + return true; + } + + return false; + } + + /** + * @notice Internal function to get the boosted reward with the number of KGH. + * + * @param validator Address of the validator. + * + * @return The boosted reward with the number of KGH. + */ + function _getBoostedReward(address validator) internal view returns (uint128) { + uint128 numKgh = ASSET_MANAGER.totalKghNum(validator); + uint128 coefficient = BASE_REWARD.mulDiv(BOOSTED_REWARD_NUMERATOR, BOOSTED_REWARD_DENOM); + return uint128(Atan2.atan2(numKgh, 100).mulDiv(coefficient, 1 << 40)); + } + + /** + * @notice Internal function to calculate the reward of the validator when distributing reward. + * + * @param validator Address of the validator. + * + * @return The amount of base reward, excluding base reward for the validator. + * @return The amount of boosted reward. + * @return The amount of reward from commission and base reward for the validator. + */ + function _calculateReward(address validator) internal view returns (uint128, uint128, uint128) { + if (validator == ASSET_MANAGER.SECURITY_COUNCIL()) { + return (0, 0, BASE_REWARD); + } + + uint128 commissionRate = _validatorInfo[validator].commissionRate; + uint128 boostedReward = _getBoostedReward(validator); + uint128 baseReward; + uint128 validatorReward; + + unchecked { + validatorReward = (BASE_REWARD + boostedReward).mulDiv( + commissionRate, + COMMISSION_RATE_DENOM + ); + baseReward = BASE_REWARD.mulDiv( + COMMISSION_RATE_DENOM - commissionRate, + COMMISSION_RATE_DENOM + ); + boostedReward = boostedReward.mulDiv( + COMMISSION_RATE_DENOM - commissionRate, + COMMISSION_RATE_DENOM + ); + + uint128 validatorKro = ASSET_MANAGER.totalValidatorKro(validator); + uint128 totalKro = ASSET_MANAGER.totalKroAssets(validator); + uint128 validatorBaseReward = baseReward.mulDiv(validatorKro, totalKro + validatorKro); + // Exclude the base reward for the validator from total base reward given to KRO delegators. + baseReward -= validatorBaseReward; + validatorReward += validatorBaseReward; + } + + return (baseReward, boostedReward, validatorReward); + } + + /** + * @notice Updates next priority validator address. Validators with more delegation tokens have + * a higher probability of being selected. The random weight selection is based on the + * last finalized output root. + */ + function _updatePriorityValidator() private { + uint120 weightSum = activatedValidatorTotalWeight(); + uint256 nextFinalizeOutputIndex = L2_ORACLE.nextFinalizeOutputIndex(); + + if (weightSum > 0 && nextFinalizeOutputIndex > 0) { + Types.CheckpointOutput memory output = L2_ORACLE.getL2Output( + nextFinalizeOutputIndex - 1 + ); + + uint120 weight = uint120( + uint256( + keccak256( + abi.encodePacked( + output.outputRoot, + block.number, + block.coinbase, + block.difficulty, + blockhash(block.number - 1) + ) + ) + ) + ) % weightSum; + + _nextPriorityValidator = _validatorTree.select(weight); + } else { + _nextPriorityValidator = address(0); + } + } + + /** + * @notice Attempts to jail a validator who was selected as a priority validator for this + * submission round but did not submit the output. The period to get out of jail is + * SOFT_JAIL_PERIOD_SECONDS. + */ + function _tryJail() private { + if (_nextPriorityValidator == address(0)) return; + + if (_validatorInfo[_nextPriorityValidator].noSubmissionCount >= JAIL_THRESHOLD) { + _sendToJail(_nextPriorityValidator, true); + } else { + unchecked { + _validatorInfo[_nextPriorityValidator].noSubmissionCount++; + } + } + } + + /** + * @notice Send the given validator to the jail and remove from the validator tree. + * + * @param validator Address of the validator. + * @param isSoft Whether the jail is soft or hard. + */ + function _sendToJail(address validator, bool isSoft) private { + uint128 jailSeconds = isSoft ? SOFT_JAIL_PERIOD_SECONDS : HARD_JAIL_PERIOD_SECONDS; + uint128 expiresAt = _jail[validator].max(uint128(block.timestamp)) + jailSeconds; + _jail[validator] = expiresAt; + + emit ValidatorJailed(validator, expiresAt); + + if (_validatorTree.remove(validator)) emit ValidatorStopped(validator, block.timestamp); + } + + /** + * @notice Attempts to reset non-submission count of a validator. + * + * @param validator Address of the validator. + */ + function _resetNoSubmissionCount(address validator) private { + if (noSubmissionCount(validator) > 0) { + _validatorInfo[validator].noSubmissionCount = 0; + } + } +} diff --git a/packages/contracts/contracts/L1/ValidatorPool.sol b/packages/contracts/contracts/L1/ValidatorPool.sol index afe034017c..398d006806 100644 --- a/packages/contracts/contracts/L1/ValidatorPool.sol +++ b/packages/contracts/contracts/L1/ValidatorPool.sol @@ -4,7 +4,6 @@ pragma solidity 0.8.15; import { ReentrancyGuardUpgradeable } from "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; -import { Math } from "@openzeppelin/contracts/utils/math/Math.sol"; import { Constants } from "../libraries/Constants.sol"; import { Predeploys } from "../libraries/Predeploys.sol"; @@ -73,6 +72,12 @@ contract ValidatorPool is ReentrancyGuardUpgradeable, ISemver { */ uint256 public immutable ROUND_DURATION; + /** + * @notice The output index where ValidatorPool is terminated after. Validator system is + * upgraded to ValidatorManager. + */ + uint256 public immutable TERMINATE_OUTPUT_INDEX; + /** * @notice A mapping of balances. */ @@ -174,20 +179,21 @@ contract ValidatorPool is ReentrancyGuardUpgradeable, ISemver { } /** * @notice Semantic version. - * @custom:semver 1.0.1 + * @custom:semver 1.1.0 */ - string public constant version = "1.0.1"; + string public constant version = "1.1.0"; /** * @notice Constructs the ValidatorPool contract. * - * @param _l2OutputOracle Address of the L2OutputOracle. - * @param _portal Address of the KromaPortal. - * @param _securityCouncil Address of the security council. - * @param _trustedValidator Address of the trusted validator. - * @param _requiredBondAmount The required bond amount. - * @param _maxUnbond The max number of unbonds when trying unbond. - * @param _roundDuration The duration of one submission round in seconds. + * @param _l2OutputOracle Address of the L2OutputOracle. + * @param _portal Address of the KromaPortal. + * @param _securityCouncil Address of the security council. + * @param _trustedValidator Address of the trusted validator. + * @param _requiredBondAmount The required bond amount. + * @param _maxUnbond The max number of unbonds when trying unbond. + * @param _roundDuration The duration of one submission round in seconds. + * @param _terminateOutputIndex The output index where ValidatorPool is terminated after. */ constructor( L2OutputOracle _l2OutputOracle, @@ -196,7 +202,8 @@ contract ValidatorPool is ReentrancyGuardUpgradeable, ISemver { address _trustedValidator, uint256 _requiredBondAmount, uint256 _maxUnbond, - uint256 _roundDuration + uint256 _roundDuration, + uint256 _terminateOutputIndex ) { L2_ORACLE = _l2OutputOracle; PORTAL = _portal; @@ -204,6 +211,7 @@ contract ValidatorPool is ReentrancyGuardUpgradeable, ISemver { TRUSTED_VALIDATOR = _trustedValidator; REQUIRED_BOND_AMOUNT = uint128(_requiredBondAmount); MAX_UNBOND = _maxUnbond; + TERMINATE_OUTPUT_INDEX = _terminateOutputIndex; // Note that this value MUST be (SUBMISSION_INTERVAL * L2_BLOCK_TIME) / 2. ROUND_DURATION = _roundDuration; @@ -219,9 +227,14 @@ contract ValidatorPool is ReentrancyGuardUpgradeable, ISemver { } /** - * @notice Deposit ETH to be used as bond. + * @notice Deposit ETH to be used as bond. Note that deposit after termination is not allowed. */ function deposit() external payable { + require( + L2_ORACLE.nextOutputIndex() < TERMINATE_OUTPUT_INDEX + 1, + "ValidatorPool: only can deposit to ValidatorPool before terminated" + ); + _increaseBalance(msg.sender, msg.value); } @@ -402,6 +415,10 @@ contract ValidatorPool is ReentrancyGuardUpgradeable, ISemver { unchecked { nextUnbondOutputIndex = outputIndex; } + + // Set the next output index to be finalized in L2OutputOracle. + L2_ORACLE.setNextFinalizeOutputIndex(outputIndex); + return true; } @@ -522,11 +539,10 @@ contract ValidatorPool is ReentrancyGuardUpgradeable, ISemver { * * @return Amount of the pending bond. */ - function getPendingBond(uint256 _outputIndex, address _challenger) - external - view - returns (uint128) - { + function getPendingBond( + uint256 _outputIndex, + address _challenger + ) external view returns (uint128) { uint128 pendingBond = pendingBonds[_outputIndex][_challenger]; require(pendingBond > 0, "ValidatorPool: the pending bond does not exist"); return pendingBond; @@ -577,8 +593,7 @@ contract ValidatorPool is ReentrancyGuardUpgradeable, ISemver { */ function nextValidator() public view returns (address) { if (nextPriorityValidator != address(0)) { - uint256 l2BlockNumber = L2_ORACLE.nextBlockNumber(); - uint256 l2Timestamp = L2_ORACLE.computeL2Timestamp(l2BlockNumber + 1); + uint256 l2Timestamp = L2_ORACLE.nextOutputMinL2Timestamp(); if (block.timestamp >= l2Timestamp) { uint256 elapsed = block.timestamp - l2Timestamp; // If the current time exceeds one round time, it is a public round. @@ -592,4 +607,15 @@ contract ValidatorPool is ReentrancyGuardUpgradeable, ISemver { return TRUSTED_VALIDATOR; } } + + /** + * @notice Determines whether the given output index must not interact with ValidatorPool. + * + * @param _outputIndex Index of the L2 checkpoint output. + * + * @return Whether the given output index must not interact with ValidatorPool. + */ + function isTerminated(uint256 _outputIndex) external view returns (bool) { + return _outputIndex > TERMINATE_OUTPUT_INDEX; + } } diff --git a/packages/contracts/contracts/L1/ZKMerkleTrie.sol b/packages/contracts/contracts/L1/ZKMerkleTrie.sol index ece8ccd006..2538f9a7e4 100644 --- a/packages/contracts/contracts/L1/ZKMerkleTrie.sol +++ b/packages/contracts/contracts/L1/ZKMerkleTrie.sol @@ -3,7 +3,7 @@ pragma solidity 0.8.15; import { Bytes } from "../libraries/Bytes.sol"; import { NodeReader } from "../libraries/NodeReader.sol"; -import { IZKMerkleTrie } from "./IZKMerkleTrie.sol"; +import { IZKMerkleTrie } from "./interfaces/IZKMerkleTrie.sol"; import { ZKTrieHasher } from "./ZKTrieHasher.sol"; /** @@ -93,10 +93,7 @@ contract ZKMerkleTrie is IZKMerkleTrie, ZKTrieHasher { } else { require(computedKey == currentNode.childR, "ZKMerkleTrie: invalid key R"); } - computedKey = _hashFixed2Elems( - currentNode.childL, - currentNode.childR - ); + computedKey = _hashFixed2Elems(currentNode.childL, currentNode.childR); } else if (currentNode.nodeType == NodeReader.NodeType.LEAF) { require(!exists && !empty, "ZKMerkleTrie: duplicated terminal node"); exists = currentNode.nodeKey == key; diff --git a/packages/contracts/contracts/L1/interfaces/IAssetManager.sol b/packages/contracts/contracts/L1/interfaces/IAssetManager.sol new file mode 100644 index 0000000000..f8680e57cf --- /dev/null +++ b/packages/contracts/contracts/L1/interfaces/IAssetManager.sol @@ -0,0 +1,479 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +/** + * @title IAssetManager + * @notice Interface for AssetManager contract. + */ +interface IAssetManager { + /** + * @notice Represents the asset information of the vault of a validator. + * + * @custom:field validatorKro Total amount of KRO that deposited by the validator and + * accumulated as validator reward (including validatorKroBonded). + * @custom:field validatorKroBonded Total amount of validator KRO that bonded during output + * submission or challenge creation. + * @custom:field totalKro Total amount of KRO that delegated by the delegators and + * accumulated as KRO delegation reward. + * @custom:field totalKroShares Total shares for KRO delegation in the vault. + * @custom:field totalKgh Total number of KGH in the vault. + * @custom:field rewardPerKghStored Accumulated boosted reward per 1 KGH. + */ + struct Asset { + uint128 validatorKro; + uint128 validatorKroBonded; + uint128 totalKro; + uint128 totalKroShares; + uint128 totalKgh; + uint128 rewardPerKghStored; + } + + /** + * @notice Constructs the delegator of KRO in the vault of a validator. + * + * @custom:field shares Amount of shares for KRO delegation. + * @custom:field lastDelegatedAt Last timestamp when the delegator delegated. The delegator can + * undelegate after MIN_DELEGATION_PERIOD elapsed. + */ + struct KroDelegator { + uint128 shares; + uint128 lastDelegatedAt; + } + + /** + * @notice Constructs the delegator of KGH in the vault of a validator. + * + * @custom:field rewardPerKghPaid Accumulated paid boosted reward per 1 KGH. + * @custom:field kghNum Total number of KGH delegated. + * @custom:field delegatedAt A mapping of tokenId to the delegation timestamp. The + * delegator can undelegate after MIN_DELEGATION_PERIOD + * elapsed from each delegation timestamp. + */ + struct KghDelegator { + uint128 rewardPerKghPaid; + uint128 kghNum; + mapping(uint256 => uint128) delegatedAt; + } + + /** + * @notice Constructs the vault of a validator. + * + * @custom:field withdrawAccount An account where assets can be withdrawn to. Only this account + * can withdraw the assets. + * @custom:field lastDepositedAt Last timestamp when the validator deposited. The validator can + * withdraw after MIN_DELEGATION_PERIOD elapsed. + * @custom:field asset Asset information of the vault. + * @custom:field kroDelegators A mapping of validator address to KRO delegator struct. + * @custom:field kghDelegators A mapping of validator address to KGH delegator struct. + */ + struct Vault { + address withdrawAccount; + uint128 lastDepositedAt; + Asset asset; + mapping(address => KroDelegator) kroDelegators; + mapping(address => KghDelegator) kghDelegators; + } + + /** + * @notice Emitted when validator deposited KROs. + * + * @param validator Address of the validator. + * @param amount The amount of KRO deposited. + */ + event Deposited(address indexed validator, uint128 amount); + + /** + * @notice Emitted when KROs are delegated. + * + * @param validator Address of the validator. + * @param delegator Address of the delegator. + * @param amount The amount of KRO delegated. + * @param shares The amount of shares received. + */ + event KroDelegated( + address indexed validator, + address indexed delegator, + uint128 amount, + uint128 shares + ); + + /** + * @notice Emitted when a KGH is delegated. + * + * @param validator Address of the validator. + * @param delegator Address of the delegator. + * @param tokenId Token id of the KGH. + */ + event KghDelegated(address indexed validator, address indexed delegator, uint256 tokenId); + + /** + * @notice Emitted when KGHs are delegated in batch. + * + * @param validator Address of the validator. + * @param delegator Address of the delegator. + * @param tokenIds Array of token ids of the KGHs. + */ + event KghBatchDelegated( + address indexed validator, + address indexed delegator, + uint256[] tokenIds + ); + + /** + * @notice Emitted when validator withdrew KRO. + * + * @param validator Address of the validator. + * @param amount The amount of KRO the validator withdrew. + */ + event Withdrawn(address indexed validator, uint128 amount); + + /** + * @notice Emitted when KRO is undelegated. + * + * @param validator Address of the validator. + * @param delegator Address of the delegator. + * @param amount The amount of KRO to undelegate. + * @param shares The amount of shares to be burnt. + */ + event KroUndelegated( + address indexed validator, + address indexed delegator, + uint128 amount, + uint128 shares + ); + + /** + * @notice Emitted when KGH is undelegated. + * + * @param validator Address of the validator. + * @param delegator Address of the delegator. + * @param tokenId Token id of the KGH. + * @param amount The amount of KRO claimed as boosted reward. + */ + event KghUndelegated( + address indexed validator, + address indexed delegator, + uint256 tokenId, + uint128 amount + ); + + /** + * @notice Emitted when KGHs are undelegated in batch. + * + * @param validator Address of the validator. + * @param delegator Address of the delegator. + * @param tokenIds Array of token ids of the KGHs. + * @param amount The amount of KRO claimed as boosted reward. + */ + event KghBatchUndelegated( + address indexed validator, + address indexed delegator, + uint256[] tokenIds, + uint128 amount + ); + + /** + * @notice Emitted when accumulated rewards of KGH delegation are claimed. + * + * @param validator Address of the validator. + * @param delegator Address of the delegator. + * @param amount The amount of KRO claimed as boosted reward. + */ + event KghRewardClaimed(address indexed validator, address indexed delegator, uint128 amount); + + /** + * @notice Emitted when validator KRO is bonded during output submission or challenge creation. + * + * @param validator Address of the validator. + * @param amount The amount of KRO bonded. + * @param remainder The remaining amount of validator KRO excluding bonded KRO. + */ + event ValidatorKroBonded(address indexed validator, uint128 amount, uint128 remainder); + + /** + * @notice Emitted when validator KRO is unbonded during output finalization or slashing. + * + * @param validator Address of the validator. + * @param amount The amount of KRO unbonded. + * @param remainder The remaining amount of validator KRO excluding bonded KRO. + */ + event ValidatorKroUnbonded(address indexed validator, uint128 amount, uint128 remainder); + + /** + * @notice Reverts when caller is not allowed. + */ + error NotAllowedCaller(); + + /** + * @notice Reverts when the status of validator is improper. + */ + error ImproperValidatorStatus(); + + /** + * @notice Reverts when try to input zero. + */ + error NotAllowedZeroInput(); + + /** + * @notice Reverts when the address is zero address. + */ + error ZeroAddress(); + + /** + * @notice Reverts when the asset is insufficient. + */ + error InsufficientAsset(); + + /** + * @notice Reverts when the share is insufficient. + */ + error InsufficientShare(); + + /** + * @notice Reverts when the minimum delegation period is not elapsed. + */ + error NotElapsedMinDelegationPeriod(); + + /** + * @notice Reverts when the given token ids are invalid. + */ + error InvalidTokenIdsInput(); + + /** + * @notice Returns the address of withdraw account of given validator. + * + * @param validator Address of the validator. + * + * @return The address of withdraw account of given validator. + */ + function getWithdrawAccount(address validator) external view returns (address); + + /** + * @notice Returns when the validator can withdraw KRO. The validator can withdraw after + * MIN_DELEGATION_PERIOD elapsed from lastDepositedAt. + * + * @param validator Address of the validator. + * + * @return When the validator can withdraw KRO. + */ + function canWithdrawAt(address validator) external view returns (uint128); + + /** + * @notice Returns the total amount of KRO a validator has deposited and been rewarded. + * + * @param validator Address of the validator. + * + * @return The total amount of KRO a validator has deposited and been rewarded. + */ + function totalValidatorKro(address validator) external view returns (uint128); + + /** + * @notice Returns the total amount of validator KRO that bonded during output submission or + * challenge creation. + * + * @param validator Address of the validator. + * + * @return The total amount of validator KRO bonded. + */ + function totalValidatorKroBonded(address validator) external view returns (uint128); + + /** + * @notice Returns the total amount of validator balance excluding the bond amount. + * + * @param validator Address of the validator. + * + * @return The total amount of validator balance excluding the bond amount. + */ + function totalValidatorKroNotBonded(address validator) external view returns (uint128); + + /** + * @notice Returns the total amount of KRO that delegated by the delegators and accumulated as + * KRO delegation reward. + * + * @param validator Address of the validator. + * + * @return The total amount of KRO that delegated by the delegators and accumulated as KRO + * delegation reward. + */ + function totalKroAssets(address validator) external view returns (uint128); + + /** + * @notice Returns the total number of KGHs held by the vault. + * + * @param validator Address of the validator. + * + * @return The total number of KGHs held by the vault. + */ + function totalKghNum(address validator) external view returns (uint128); + + /** + * @notice Returns the amount of KRO shares that the KRO delegator has. + * + * @param validator Address of the validator. + * @param delegator Address of the delegator. + * + * @return The amount of KRO shares that the KRO delegator has. + */ + function getKroTotalShareBalance( + address validator, + address delegator + ) external view returns (uint128); + + /** + * @notice Returns the amount of KRO assets delegated to the given validator by the delegator. + * + * @param validator Address of the validator. + * @param delegator Address of the delegator. + * + * @return The amount of KRO assets that the delegator delegated to the validator. + */ + function getKroAssets(address validator, address delegator) external view returns (uint128); + + /** + * @notice Returns when the KRO delegators can undelegate KRO. The delegators can undelegate + * after MIN_DELEGATION_PERIOD elapsed from lastDelegatedAt. + * + * @param validator Address of the validator. + * @param delegator Address of the KRO delegator. + * + * @return When the KRO delegators can undelegate KRO. + */ + function canUndelegateKroAt( + address validator, + address delegator + ) external view returns (uint128); + + /** + * @notice Returns the number of KGH delegated by the given delegator. + * + * @param validator Address of the validator. + * @param delegator Address of the delegator. + * + * @return The number of KGH delegated by the given delegator. + */ + function getKghNum(address validator, address delegator) external view returns (uint128); + + /** + * @notice Returns when the KGH delegators can undelegate KGH. The delegators can undelegate KGH + * for the given token id after MIN_DELEGATION_PERIOD elapsed from delegation + * timestamp. + * + * @param validator Address of the validator. + * @param delegator Address of the KGH delegator. + * @param tokenId The token id of KGH to undelegate. + * + * @return When the KGH delegators can undelegate KGH for the given token id. + */ + function canUndelegateKghAt( + address validator, + address delegator, + uint256 tokenId + ) external view returns (uint128); + + /** + * @notice Allows an on-chain or off-chain user to simulate the effects of their KRO delegation + * at the current block. + * + * @param validator Address of the validator. + * @param assets The amount of assets to delegate. + * + * @return The amount of shares that the Vault would exchange for the amount of assets provided. + */ + function previewDelegate(address validator, uint128 assets) external view returns (uint128); + + /** + * @notice Allows an on-chain or off-chain user to simulate the effects of their KRO + * undelegation at the current block. + * + * @param validator The address of the validator. + * @param shares The amount of shares to undelegate. + * + * @return The amount of assets that the Vault would exchange for the amount of shares provided. + */ + function previewUndelegate(address validator, uint128 shares) external view returns (uint128); + + /** + * @notice Returns the claimable reward of KGH delegation. + * + * @param validator The address of the validator. + * @param delegator The address of the delegator. + * + * @return The amount of claimable reward of KGH delegation. + */ + function getKghReward(address validator, address delegator) external view returns (uint128); + + /** + * @notice Deposit KRO. To deposit KRO, the validator should be initiated. + * + * @param assets The amount of KRO to deposit. + */ + function deposit(uint128 assets) external; + + /** + * @notice Withdraw KRO. To withdraw KRO, the validator should be initiated and MIN_DELEGATION_PERIOD + * should be passed after the last deposit time. Only withdrawAccount of the validator can call + * this function. + * + * @param validator Address of the validator. + * @param assets The amount of KRO to withdraw. + */ + function withdraw(address validator, uint128 assets) external; + + /** + * @notice Delegate KRO to the validator and returns the amount of shares that the vault would + * exchange. + * + * @param validator Address of the validator. + * @param assets The amount of KRO to delegate. + * + * @return The amount of shares that the Vault would exchange for the amount of assets provided. + */ + function delegate(address validator, uint128 assets) external returns (uint128); + + /** + * @notice Delegate KGH to the validator. + * + * @param validator Address of the validator. + * @param tokenId The token id of KGH to delegate. + */ + function delegateKgh(address validator, uint256 tokenId) external; + + /** + * @notice Delegate KGHs to the validator. + * + * @param validator Address of the validator. + * @param tokenIds The token ids of KGHs to delegate. + */ + function delegateKghBatch(address validator, uint256[] calldata tokenIds) external; + + /** + * @notice Undelegate the KRO of given assets for the given validator. + * + * @param validator Address of the validator. + * @param assets The amount of assets to undelegate. + */ + function undelegate(address validator, uint128 assets) external; + + /** + * @notice Undelegate KGH for given validator and tokenId. + * + * @param validator Address of the validator. + * @param tokenId Token id of KGH to undelegate. + */ + function undelegateKgh(address validator, uint256 tokenId) external; + + /** + * @notice Undelegate KGHs for given validator and token ids. + * + * @param validator Address of the validator. + * @param tokenIds Array of token ids of KGHs to undelegate. + */ + function undelegateKghBatch(address validator, uint256[] calldata tokenIds) external; + + /** + * @notice Claim the boosted reward of the KGH delegator from the given validator vault. + * + * @param validator Address of the validator. + */ + function claimKghReward(address validator) external; +} diff --git a/packages/contracts/contracts/L1/interfaces/IValidatorManager.sol b/packages/contracts/contracts/L1/interfaces/IValidatorManager.sol new file mode 100644 index 0000000000..de5cc71e23 --- /dev/null +++ b/packages/contracts/contracts/L1/interfaces/IValidatorManager.sol @@ -0,0 +1,481 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { AssetManager } from "../AssetManager.sol"; +import { L2OutputOracle } from "../L2OutputOracle.sol"; + +/** + * @title IValidatorManager + * @notice Interface for ValidatorManager contract. + */ +interface IValidatorManager { + /** + * @notice Enum of the status of a validator. + * + * Below is the possible conditions of each status. "initiated" means the validator has been + * initiated at least once, "activated" means the validator has been activated and added to the + * validator tree. "MIN_REGISTER_AMOUNT" means the total assets of the validator exceeds + * MIN_REGISTER_AMOUNT, "MIN_ACTIVATE_AMOUNT" means the same. + * + * +------------+-----------+-----------+---------------------+---------------------+ + * | Status | initiated | activated | MIN_REGISTER_AMOUNT | MIN_ACTIVATE_AMOUNT | + * +------------+-----------+-----------+---------------------+---------------------+ + * | NONE | X | X | X | X | + * | EXITED | O | O/X | X | O/X | + * | REGISTERED | O | X | O | X | + * | READY | O | X | O | O | + * | INACTIVE | O | O | O | X | + * | ACTIVE | O | O | O | O | + * +------------+-----------+-----------+---------------------+---------------------+ + */ + enum ValidatorStatus { + NONE, + EXITED, + REGISTERED, + READY, + INACTIVE, + ACTIVE + } + + /** + * @notice Constructs the constructor parameters of ValidatorManager contract. + * + * @custom:field _l2Oracle Address of the L2OutputOracle contract. + * @custom:field _assetManager Address of the AssetManager contract. + * @custom:field _trustedValidator Address of the trusted validator. + * @custom:field _commissionChangeDelaySeconds The delay to finalize the commission rate change + * in seconds. + * @custom:field _roundDurationSeconds The duration of one submission round in seconds. + * @custom:field _softJailPeriodSeconds The minimum duration to get out of jail in + * seconds in output non-submissions penalty. + * @custom:field _hardJailPeriodSeconds The minimum duration to get out of jail in + * seconds in slashing penalty. + * @custom:field _jailThreshold The maximum allowed number of output + * non-submissions before jailed. + * @custom:field _maxOutputFinalizations Max number of finalized outputs. + * @custom:field _baseReward Base reward for the validator. + * @custom:field _minRegisterAmount Minimum amount to register as a validator. + * @custom:field _minActivateAmount Minimum amount to activate a validator. + */ + struct ConstructorParams { + L2OutputOracle _l2Oracle; + AssetManager _assetManager; + address _trustedValidator; + uint128 _commissionChangeDelaySeconds; + uint128 _roundDurationSeconds; + uint128 _softJailPeriodSeconds; + uint128 _hardJailPeriodSeconds; + uint128 _jailThreshold; + uint128 _maxOutputFinalizations; + uint128 _baseReward; + uint128 _minRegisterAmount; + uint128 _minActivateAmount; + } + + /** + * @notice Constructs the information of a validator. + * + * @custom:field isInitiated Whether the validator is initiated. + * @custom:field noSubmissionCount Number of counts that the validator did not submit + * the output in priority round. + * @custom:field commissionRate Commission rate of validator. + * @custom:field pendingCommissionRate Pending commission rate of validator. + * @custom:field commissionChangeInitiatedAt Timestamp of commission change initialization. + */ + struct Validator { + bool isInitiated; + uint8 noSubmissionCount; + uint8 commissionRate; + uint8 pendingCommissionRate; + uint128 commissionChangeInitiatedAt; + } + + /** + * @notice Emitted when registers as a validator. + * + * @param validator Address of the validator. + * @param activated If the validator is activated or not. + * @param commissionRate The commission rate the validator sets. + * @param assets The number of assets the validator deposits. + */ + event ValidatorRegistered( + address indexed validator, + bool activated, + uint8 commissionRate, + uint128 assets + ); + + /** + * @notice Emitted when a validator activated, which means added to the validator tree. + * + * @param validator Address of the validator. + * @param activatedAt The timestamp when the validator activated. + */ + event ValidatorActivated(address indexed validator, uint256 activatedAt); + + /** + * @notice Emitted when a validator stops, which means removed from the validator tree. + * + * @param validator Address of the validator. + * @param stopsAt The timestamp when the validator stops. + */ + event ValidatorStopped(address indexed validator, uint256 stopsAt); + + /** + * @notice Emitted when a validator initiated commission rate change. + * + * @param validator Address of the validator. + * @param oldCommissionRate The old commission rate. + * @param newCommissionRate The new commission rate. + */ + event ValidatorCommissionChangeInitiated( + address indexed validator, + uint8 oldCommissionRate, + uint8 newCommissionRate + ); + + /** + * @notice Emitted when a validator finalized commission rate change. + * + * @param validator Address of the validator. + * @param oldCommissionRate The old commission rate. + * @param newCommissionRate The new commission rate. + */ + event ValidatorCommissionChangeFinalized( + address indexed validator, + uint8 oldCommissionRate, + uint8 newCommissionRate + ); + + /** + * @notice Emitted when a validator is jailed. + * + * @param validator Address of the validator. + * @param expiresAt The expiration timestamp of the jail. + */ + event ValidatorJailed(address indexed validator, uint128 expiresAt); + + /** + * @notice Emitted when a validator is unjailed. + * + * @param validator Address of the validator. + */ + event ValidatorUnjailed(address indexed validator); + + /** + * @notice Emitted when the output reward is distributed. + * + * @param outputIndex Index of the L2 checkpoint output. + * @param validator Address of the validator whose vault is rewarded. + * @param validatorReward The amount of validator reward. + * @param baseReward The amount of base reward for KRO delegators. + * @param boostedReward The amount of boosted reward for KGH delegators. + */ + event RewardDistributed( + uint256 indexed outputIndex, + address indexed validator, + uint128 validatorReward, + uint128 baseReward, + uint128 boostedReward + ); + + /** + * @notice Emitted when challenge reward for challenge winner is distributed. + * + * @param outputIndex Index of the L2 checkpoint output. + * @param recipient Address of the reward recipient. + * @param amount The amount of challenge reward. + */ + event ChallengeRewardDistributed( + uint256 indexed outputIndex, + address indexed recipient, + uint128 amount + ); + + /** + * @notice Emitted when the validator is slashed. + * + * @param outputIndex Index of the L2 checkpoint output. + * @param loser Address of the challenge loser. + * @param amount The amount of KRO slashed. + */ + event Slashed(uint256 indexed outputIndex, address indexed loser, uint128 amount); + + /** + * @notice Emitted when the slash is reverted. + * + * @param outputIndex Index of the L2 checkpoint output. + * @param loser Address of the challenge original loser. + * @param amount The amount of KRO refunded to the loser. + */ + event SlashReverted(uint256 indexed outputIndex, address indexed loser, uint128 amount); + + /** + * @notice Reverts when caller is not allowed. + */ + error NotAllowedCaller(); + + /** + * @notice Reverts when constructor parameters are invalid. + */ + error InvalidConstructorParams(); + + /** + * @notice Reverts when the status of validator is improper. + */ + error ImproperValidatorStatus(); + + /** + * @notice Reverts when the asset is insufficient. + */ + error InsufficientAsset(); + + /** + * @notice Reverts when the commission rate exceeds the max value. + */ + error MaxCommissionRateExceeded(); + + /** + * @notice Reverts when try to change commission rate with same value as previous. + */ + error SameCommissionRate(); + + /** + * @notice Reverts when the commission rate change has not been initiated. + */ + error NotInitiatedCommissionChange(); + + /** + * @notice Reverts when the delay of commission rate change finalization has not elapsed. + */ + error NotElapsedCommissionChangeDelay(); + + /** + * @notice Reverts when try to unjail before jail period elapsed. + */ + error NotElapsedJailPeriod(); + + /** + * @notice Reverts if the validator is not selected priority validator. + */ + error NotSelectedPriorityValidator(); + + /** + * @notice Registers as a validator with assets at least MIN_REGISTER_AMOUNT. The validator with + * assets more than MIN_ACTIVATE_AMOUNT can be activated at the same time. + * + * @param assets The amount of assets to deposit. + * @param commissionRate The commission rate the validator sets. + * @param withdrawAccount An account where assets can be withdrawn to. Only this account can + * withdraw the assets. + */ + function registerValidator( + uint128 assets, + uint8 commissionRate, + address withdrawAccount + ) external; + + /** + * @notice Activates a validator and adds the validator to validator tree. To submit outputs, + * the validator should be activated. + */ + function activateValidator() external; + + /** + * @notice Tries to activate a validator and adds the validator to validator tree. To submit + * outputs, the validator should be activated. This function can only be called by + * AssetManager. + * + * @param validator Address of the validator. + */ + function tryActivateValidator(address validator) external; + + /** + * @notice Handles some essential actions such as reward distribution, jail handling, next + * priority validator selection after output submission. This function can only be + * called by L2OutputOracle. + * + * @param outputIndex Index of the L2 checkpoint output submitted. + */ + function afterSubmitL2Output(uint256 outputIndex) external; + + /** + * @notice Initiates the commission rate change of a validator. An exited or jailed validator + * cannot initiate it. + * + * @param newCommissionRate The new commission rate to apply. + */ + function initCommissionChange(uint8 newCommissionRate) external; + + /** + * @notice Finalizes the commission rate change of a validator. An exited or jailed validator + * cannot finalize it, and a validator can finalize it after + * COMMISION_CHANGE_DELAY_SECONDS elapsed since the initialization of commission change. + */ + function finalizeCommissionChange() external; + + /** + * @notice Attempts to unjail a validator. Only the validator who wants to unjail can call + * itself. + */ + function tryUnjail() external; + + /** + * @notice Call ASSET_MANAGER.bondValidatorKro(). This function is only called by the Colosseum + * contract. + * + * @param validator Address of the validator. + */ + function bondValidatorKro(address validator) external; + + /** + * @notice Call ASSET_MANAGER.unbondValidatorKro(). This function is only called by the + * Colosseum contract. + * + * @param validator Address of the validator. + */ + function unbondValidatorKro(address validator) external; + + /** + * @notice Slash KRO from the vault of the challenge loser and move the slashing asset to + * pending challenge reward before output rewarded, after directly to winner's asset. + * Since the behavior could threaten the security of the chain, the loser is sent to + * jail for HARD_JAIL_PERIOD_SECONDS. This function is only called by the Colosseum + * contract. + * + * @param outputIndex The index of output challenged. + * @param winner Address of the challenge winner. + * @param loser Address of the challenge loser. + */ + function slash(uint256 outputIndex, address winner, address loser) external; + + /** + * @notice Revert slash. This function is only called by the Colosseum contract. + * + * @param outputIndex The index of output challenged. + * @param loser Address of the challenge loser. + */ + function revertSlash(uint256 outputIndex, address loser) external; + + /** + * @notice Updates the validator tree. + * + * @param validator Address of the validator. + * @param tryRemove Flag to try remove the validator from validator tree. + */ + function updateValidatorTree(address validator, bool tryRemove) external; + + /** + * @notice Returns the no submission count of given validator. + * + * @param validator Address of the validator. + * + * @return The no submission count of given validator. + */ + function noSubmissionCount(address validator) external view returns (uint8); + + /** + * @notice Returns the commission rate of given validator. + * + * @param validator Address of the validator. + * + * @return The commission rate of given validator. + */ + function getCommissionRate(address validator) external view returns (uint8); + + /** + * @notice Returns the pending commission rate of given validator. + * + * @param validator Address of the validator. + * + * @return The pending commission rate of given validator. + */ + function getPendingCommissionRate(address validator) external view returns (uint8); + + /** + * @notice Returns when commission change of given validator can be finalized. + * + * @param validator Address of the validator. + * + * @return When commission change of given validator can be finalized. + */ + function canFinalizeCommissionChangeAt(address validator) external view returns (uint128); + + /** + * @notice Checks the eligibility to submit L2 checkpoint output during output submission. + * Note that only the validator whose status is ACTIVE can submit output. This function + * can only be called by L2OutputOracle during output submission. + * + * @param validator Address of the output submitter. + */ + function checkSubmissionEligibility(address validator) external view; + + /** + * @notice Determines who can submit the L2 checkpoint output for the current round. + * + * @return Address of the validator who can submit the L2 checkpoint output for the current + * round. + */ + function nextValidator() external view returns (address); + + /** + * @notice Returns the status of the validator corresponding to the given address. + * + * @param validator Address of the validator. + * + * @return The status of the validator corresponding to the given address. + */ + function getStatus(address validator) external view returns (ValidatorStatus); + + /** + * @notice Returns if the given validator is in jail or not. + * + * @param validator Address of the validator. + * + * @return If the given validator is in jail or not. + */ + function inJail(address validator) external view returns (bool); + + /** + * @notice Returns the jail expiration timestamp of given validator. + * + * @param validator Address of the jailed validator. + * + * @return The jail expiration timestamp of given validator. + */ + function jailExpiresAt(address validator) external view returns (uint128); + + /** + * @notice Returns if the status of the given validator is active. + * + * @param validator Address of the validator. + * + * @return If the status of the given validator is active. + */ + function isActive(address validator) external view returns (bool); + + /** + * @notice Returns the weight of given validator. It not activated, returns 0. + * Note that `weight / activatedValidatorTotalWeight()` is the probability that the + * validator is selected as a priority validator. + * + * @param validator Address of the validator. + * + * @return The weight of given validator. + */ + function getWeight(address validator) external view returns (uint120); + + /** + * @notice Returns the number of activated validators. + * + * @return The number of activated validators. + */ + function activatedValidatorCount() external view returns (uint32); + + /** + * @notice Returns the total weight of activated validators. + * + * @return The total weight of activated validators. + */ + function activatedValidatorTotalWeight() external view returns (uint120); +} diff --git a/packages/contracts/contracts/L1/IZKMerkleTrie.sol b/packages/contracts/contracts/L1/interfaces/IZKMerkleTrie.sol similarity index 100% rename from packages/contracts/contracts/L1/IZKMerkleTrie.sol rename to packages/contracts/contracts/L1/interfaces/IZKMerkleTrie.sol diff --git a/packages/contracts/contracts/governance/GovernanceToken.sol b/packages/contracts/contracts/governance/GovernanceToken.sol index 14633f5ac1..253576bae5 100644 --- a/packages/contracts/contracts/governance/GovernanceToken.sol +++ b/packages/contracts/contracts/governance/GovernanceToken.sol @@ -1,50 +1,60 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol"; +import "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol"; import { KromaMintableERC20 } from "../universal/KromaMintableERC20.sol"; /** * @custom:proxied - * @custom:predeploy 0x42000000000000000000000000000000000000ff * @title GovernanceToken * @notice The KRO token used in governance, supporting voting and delegation. Implements - * EIP 2612 allowing signed approvals. It can be bridged to other specified chain. + * EIP 2612 allowing signed approvals. `mint` function is only allowed to the owner or + * `Bridge`, and the total supply amount is minted at once (TGE). `Bridge` has the + * permission to `mint` and `burn`, for the purpose of bridging KRO to the remote chain. */ -contract GovernanceToken is KromaMintableERC20, ERC20Burnable, ERC20Votes { +contract GovernanceToken is KromaMintableERC20, ERC20Votes, Ownable2StepUpgradeable { /** * @notice Constructs the GovernanceToken contract. * - * @param _bridge Address of the StandardBridge on this network. + * @param _bridge Address of the StandardBridge contract on this network. * @param _remoteToken Address of the corresponding token on the remote chain. */ constructor( address _bridge, address _remoteToken - ) KromaMintableERC20(_bridge, _remoteToken, "", "") ERC20Permit("Kroma") {} + ) KromaMintableERC20(_bridge, _remoteToken, "", "") ERC20Permit("Kroma") { + _disableInitializers(); + } + + /** + * @notice Initializer. + * + * @param _owner The owner of this contract. + */ + function initialize(address _owner) public initializer { + __Ownable2Step_init(); + transferOwnership(_owner); + } /** - * @notice Allows the owner to mint tokens. + * @notice Allows StandardBridge or the owner to mint tokens. * - * @param _account The account receiving minted tokens. - * @param _amount The amount of tokens to mint. + * @param _to Address to mint tokens to. + * @param _amount Amount of tokens to mint. */ - function mint(address _account, uint256 _amount) external override { + function mint(address _to, uint256 _amount) external override { require( - msg.sender == BRIDGE, - "GovernanceToken: only minter can mint" + msg.sender == BRIDGE || msg.sender == owner(), + "GovernanceToken: only bridge or owner can mint" ); - _mint(_account, _amount); + _mint(_to, _amount); } /** - * @notice Allows the StandardBridge on this network to burn tokens. - * - * @param _from Address to burn tokens from. - * @param _amount Amount of tokens to burn. + * @inheritdoc KromaMintableERC20 */ function burn(address _from, uint256 _amount) external override onlyBridge { _burn(_from, _amount); @@ -67,35 +77,56 @@ contract GovernanceToken is KromaMintableERC20, ERC20Burnable, ERC20Votes { /** * @notice Callback called after a token transfer. * - * @param _from The account sending tokens. - * @param _to The account receiving tokens. - * @param _amount The amount of tokens being transferred. + * @param from The account sending tokens. + * @param to The account receiving tokens. + * @param amount The amount of tokens being transferred. */ function _afterTokenTransfer( - address _from, - address _to, - uint256 _amount + address from, + address to, + uint256 amount ) internal override(ERC20, ERC20Votes) { - super._afterTokenTransfer(_from, _to, _amount); + super._afterTokenTransfer(from, to, amount); } /** * @notice Internal mint function. * - * @param _account The account receiving minted tokens. - * @param _amount The amount of tokens to mint. + * @param account The account receiving minted tokens. + * @param amount The amount of tokens to mint. */ - function _mint(address _account, uint256 _amount) internal override(ERC20, ERC20Votes) { - super._mint(_account, _amount); + function _mint(address account, uint256 amount) internal override(ERC20, ERC20Votes) { + super._mint(account, amount); + emit Mint(account, amount); } /** * @notice Internal burn function. * - * @param _account The account that tokens will be burned from. - * @param _amount The amount of tokens that will be burned. + * @param account The account that tokens will be burned from. + * @param amount The amount of tokens that will be burned. + */ + function _burn(address account, uint256 amount) internal override(ERC20, ERC20Votes) { + super._burn(account, amount); + emit Burn(account, amount); + } + + /** + * @notice Override function. + */ + function _msgSender() internal view override(Context, ContextUpgradeable) returns (address) { + return super._msgSender(); + } + + /** + * @notice Override function. */ - function _burn(address _account, uint256 _amount) internal override(ERC20, ERC20Votes) { - super._burn(_account, _amount); + function _msgData() + internal + view + override(Context, ContextUpgradeable) + returns (bytes calldata) + { + return super._msgData(); } } diff --git a/packages/contracts/contracts/governance/MintManager.sol b/packages/contracts/contracts/governance/MintManager.sol new file mode 100644 index 0000000000..0c815e232d --- /dev/null +++ b/packages/contracts/contracts/governance/MintManager.sol @@ -0,0 +1,144 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { Ownable2Step } from "@openzeppelin/contracts/access/Ownable2Step.sol"; + +import { GovernanceToken } from "./GovernanceToken.sol"; + +/** + * @title MintManager + * @notice MintManager issues mint cap amount of GovernanceToken at once (TGE) and distributes the + * tokens to specified recipients. + */ +contract MintManager is Ownable2Step { + /** + * @notice The amount of tokens that can be minted. + */ + uint256 public constant MINT_CAP = 1_000_000_000; + + /** + * @notice The denominator of each recipient's share. + */ + uint256 public constant SHARE_DENOMINATOR = 10 ** 5; + + /** + * @notice The GovernanceToken that the MintManager can mint. + */ + GovernanceToken public immutable GOVERNANCE_TOKEN; + + /** + * @notice True when already minted on this chain. MintManager can mint only once on each chain. + */ + bool public minted; + + /** + * @notice A list of recipient addresses that will receive tokens to be distributed. + */ + address[] public recipients; + + /** + * @notice A mapping of the recipient's address to share. + */ + mapping(address => uint256) public shareOf; + + /** + * @notice Constructs the MintManager contract. + * + * @param _governanceToken The GovernanceToken this contract can mint tokens of. + * @param _owner The owner of this contract. + * @param _recipients List of the recipients. + * @param _shares List of token distribution ratios for each recipient. + */ + constructor( + address _governanceToken, + address _owner, + address[] memory _recipients, + uint256[] memory _shares + ) { + GOVERNANCE_TOKEN = GovernanceToken(_governanceToken); + + transferOwnership(_owner); + + require(_recipients.length == _shares.length, "MintManager: invalid length of array"); + + uint256 totalShares = 0; + for (uint256 i = 0; i < _recipients.length; i++) { + address recipient = _recipients[i]; + require(recipient != address(0), "MintManager: recipient address cannot be 0"); + + uint256 share = _shares[i]; + require(share != 0, "MintManager: share cannot be 0"); + + if (shareOf[recipient] == 0) { + recipients.push(recipient); + } + shareOf[recipient] += share; + totalShares += share; + } + + require( + totalShares <= SHARE_DENOMINATOR, + "MintManager: max total share is equal or less than SHARE_DENOMINATOR" + ); + } + + /** + * @notice Only the owner is allowed to mint mint cap amount of the GovernanceToken at once. + */ + function mint() external onlyOwner { + require(!minted, "MintManager: already minted on this chain"); + + uint256 mintCap = MINT_CAP * 10 ** GOVERNANCE_TOKEN.decimals(); + + uint256 totalAmount; + for (uint256 i = 0; i < recipients.length; i++) { + address recipient = recipients[i]; + uint256 share = shareOf[recipient]; + uint256 amount = (mintCap * share) / SHARE_DENOMINATOR; + totalAmount += amount; + } + + GOVERNANCE_TOKEN.mint(address(this), totalAmount); + + minted = true; + } + + /** + * @notice Only the owner is allowed to distribute the GovernanceToken to specified recipients. + */ + function distribute() external onlyOwner { + uint256 mintCap = MINT_CAP * 10 ** GOVERNANCE_TOKEN.decimals(); + + for (uint256 i = 0; i < recipients.length; i++) { + address recipient = recipients[i]; + uint256 share = shareOf[recipient]; + uint256 amount = (mintCap * share) / SHARE_DENOMINATOR; + GOVERNANCE_TOKEN.transfer(recipient, amount); + } + } + + /** + * @notice Only the owner is allowed to renounce the ownership of the GovernanceToken. + */ + function renounceOwnershipOfToken() external onlyOwner { + require(minted, "MintManager: not minted before renounce ownership"); + + GOVERNANCE_TOKEN.renounceOwnership(); + } + + /** + * @notice Only the owner is allowed to transfer the ownership of the GovernanceToken. + * + * @param newMintManager The new MintManager to own the GovernanceToken. + */ + function transferOwnershipOfToken(address newMintManager) external onlyOwner { + GOVERNANCE_TOKEN.transferOwnership(newMintManager); + } + + /** + * @notice Only the owner is allowed to accept the ownership of the GovernanceToken. + */ + function acceptOwnershipOfToken() external onlyOwner { + GOVERNANCE_TOKEN.acceptOwnership(); + } +} diff --git a/packages/contracts/contracts/libraries/Atan2.sol b/packages/contracts/contracts/libraries/Atan2.sol new file mode 100644 index 0000000000..c77277f993 --- /dev/null +++ b/packages/contracts/contracts/libraries/Atan2.sol @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +/** + * @title Atan2 + * @notice A library for calculating the arctangent of a fraction y / x. Based on fixed-point + * math library, it provides 1E-12 precision with 40 fractional bits. + * Originally from https://github.com/NovakDistributed/macroverse. + */ +library Atan2 { + /** + * @notice The value of pi/2 in radians, represented as a fixed-point number. + */ + uint256 internal constant REAL_HALF_PI = 1727108826179; + + /** + * @notice Calculate atan(y / x). + * @dev Uses the Chebyshev polynomial approach to approximate arctan(x) where x is [0, 1]. + * @dev 0.999974x-0.332568x^3+0.193235x^5-0.115729x^7+0.0519505x^9-0.0114658x^11 + * + * @param real_y The numerator of the fraction y / x. + * @param real_x The denominator of the fraction y / x. + * + * @return result The angle in radians of the fraction y / x. + */ + function atan2(uint256 real_y, uint256 real_x) internal pure returns (uint256 result) { + assembly { + let frac + + switch lt(real_x, real_y) + case 0 { + frac := div(mul(real_y, shl(40, 1)), real_x) + } + case 1 { + frac := div(mul(real_x, shl(40, 1)), real_y) + } + + // Initialize variables to be used in the polynomial. + let frac_squared := shr(40, mul(frac, frac)) + let frac_cubed := shr(40, mul(frac_squared, frac)) + let frac_five_squared := shr(40, mul(frac_squared, frac_cubed)) + let frac_seven_squared := shr(40, mul(frac_squared, frac_five_squared)) + let frac_nine_squared := shr(40, mul(frac_squared, frac_seven_squared)) + let frac_eleven_squared := shr(40, mul(frac_squared, frac_nine_squared)) + + // Calculate the polynomial using unsigned integers. + // Start with the x^1 term, and then subtract or add the other terms based on the coefficient signs. + result := shr(40, mul(1099483040474, frac)) // x^1 term + + // x^5 term + result := add(result, shr(40, mul(212464129393, frac_five_squared))) + + // x^9 term + result := add(result, shr(40, mul(57120178819, frac_nine_squared))) + + // x^3 term, subtract because original coefficient is negative + result := sub(result, shr(40, mul(365662383026, frac_cubed))) + + // x^7 term, subtract because original coefficient is negative + result := sub(result, shr(40, mul(127245381171, frac_seven_squared))) + + // x^11 term, subtract because original coefficient is negative + result := sub(result, shr(40, mul(12606780422, frac_eleven_squared))) + + if gt(real_y, real_x) { + result := sub(REAL_HALF_PI, result) + } + } + } +} diff --git a/packages/contracts/contracts/libraries/BalancedWeightTree.sol b/packages/contracts/contracts/libraries/BalancedWeightTree.sol new file mode 100644 index 0000000000..44f744aae2 --- /dev/null +++ b/packages/contracts/contracts/libraries/BalancedWeightTree.sol @@ -0,0 +1,410 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +/** + * @title BalancedWeightTree + * @notice A self-balancing tree (balancing the weights) holds the keys and their weights and the + * weight sum of each child. A random integer smaller than the weight sum is taken and the + * tree is traversed to find the matching key. + * See https://github.com/yasharpm/Solidity-Weighted-Random-List. + */ +library BalancedWeightTree { + /** + * @notice Struct representing a node that constructs the tree. + * + * @custom:field addr The address that owns the node. + * @custom:field parent The index of parent node. + * @custom:field leftChild The index of left child node. + * @custom:field rightChild The index of right child node. + * @custom:field isLeftChild If the node is left child node of its parent node. + * @custom:field weight The weight of the node. + * @custom:field weightSum The weight sum of the node and its child nodes. + */ + struct Node { + address addr; + uint32 parent; + uint32 leftChild; + uint32 rightChild; + bool isLeftChild; + uint120 weight; + uint120 weightSum; + } + + /** + * @notice Struct representing a tree. + * + * @custom:field counter A counter used to assign a unique index to each node. The node index + * starts with 1 and counter only increments. + * @custom:field removed The cumulative number of removed nodes. + * @custom:field root The index of root node. + * @custom:field nodes A mapping of node index to node struct. + * @custom:field nodeMap A mapping of owner address to node index. + */ + struct Tree { + uint32 counter; + uint32 removed; + uint32 root; + mapping(uint32 => Node) nodes; + mapping(address => uint32) nodeMap; + } + + /** + * @notice Inserts new node with the specified address and weight inside the tree. + * + * @param _tree The tree to insert the new node. + * @param _addr The address that owns the new node. + * @param _weight The weight of the new node. + */ + function insert(Tree storage _tree, address _addr, uint120 _weight) internal { + require(_addr != address(0), "BalancedWeightTree: zero address not allowed"); + require(_tree.nodeMap[_addr] == 0, "BalancedWeightTree: node already existing"); + + Node memory newNode = Node({ + addr: _addr, + weight: _weight, + weightSum: _weight, + parent: 0, + leftChild: 0, + rightChild: 0, + isLeftChild: true + }); + + unchecked { + _tree.counter++; + } + + uint32 newNodeIndex = _tree.counter; + _tree.nodes[newNodeIndex] = newNode; + _tree.nodeMap[_addr] = newNodeIndex; + + if (_tree.root == 0) { + _tree.root = newNodeIndex; + return; + } + + uint32 index = _tree.root; + while (true) { + Node storage node = _tree.nodes[index]; + + unchecked { + node.weightSum += _weight; + } + + if (node.leftChild == 0) { + _tree.nodes[newNodeIndex].parent = index; + node.leftChild = newNodeIndex; + + _promote(_tree, newNodeIndex); + + return; + } else if (node.rightChild == 0) { + _tree.nodes[newNodeIndex].parent = index; + _tree.nodes[newNodeIndex].isLeftChild = false; + node.rightChild = newNodeIndex; + + _promote(_tree, newNodeIndex); + + return; + } else if ( + _tree.nodes[node.leftChild].weightSum > _tree.nodes[node.rightChild].weightSum + ) { + index = node.rightChild; + } else { + index = node.leftChild; + } + } + } + + /** + * @notice Updates the weight of the node with the specified address. Returns true if the weight + * is updated, false if the node with specified address doesn't exist. + * + * @param _tree The tree that includes the node to update. + * @param _addr The address that owns the node to update. + * @param _weight The new weight to be assigned. + * + * @return If the weight is updated. + */ + function update(Tree storage _tree, address _addr, uint120 _weight) internal returns (bool) { + uint32 index = _tree.nodeMap[_addr]; + + if (index == 0) { + return false; + } + + uint120 oldWeight = _tree.nodes[index].weight; + _tree.nodes[index].weight = _weight; + + uint32 parentIndex = _tree.nodes[index].parent; + if (_weight > oldWeight) { + unchecked { + uint120 weightDiff = _weight - oldWeight; + _tree.nodes[index].weightSum += weightDiff; + + while (parentIndex != 0) { + _tree.nodes[parentIndex].weightSum += weightDiff; + parentIndex = _tree.nodes[parentIndex].parent; + } + } + + _promote(_tree, index); + } else { + unchecked { + uint120 weightDiff = oldWeight - _weight; + _tree.nodes[index].weightSum -= weightDiff; + + while (parentIndex != 0) { + _tree.nodes[parentIndex].weightSum -= weightDiff; + parentIndex = _tree.nodes[parentIndex].parent; + } + } + + _demote(_tree, index); + } + + return true; + } + + /** + * @notice Removes the node with specified address from the tree. Returns true is the node is + * removed, false if it doesn't exist in the tree. + * + * @param _tree The tree that includes the node to remove. + * @param _addr The address that owns the node to remove. + * + * @return If the node is removed. + */ + function remove(Tree storage _tree, address _addr) internal returns (bool) { + uint32 index = _tree.nodeMap[_addr]; + + if (index == 0) { + return false; + } + + delete _tree.nodeMap[_addr]; + + uint32 parentIndex = _tree.nodes[index].parent; + uint120 weight = _tree.nodes[index].weight; + while (parentIndex != 0) { + unchecked { + _tree.nodes[parentIndex].weightSum -= weight; + } + parentIndex = _tree.nodes[parentIndex].parent; + } + + _pullUp(_tree, index); + + unchecked { + ++_tree.removed; + } + + return true; + } + + /** + * @notice Performs a weighted selection among the stored nodes. Returns the address of the + * selected node. If _weight is equal or greater than the weight sum of the tree, it + * returns zero address. + * + * @param _tree The tree that includes the nodes to select. + * @param _weight The random weight to be used for selection. + * + * @return The address of the selected node. + */ + function select(Tree storage _tree, uint120 _weight) internal view returns (address) { + uint32 index = _tree.root; + while (true) { + if (_tree.nodes[_tree.nodes[index].leftChild].weightSum > _weight) { + index = _tree.nodes[index].leftChild; + continue; + } + + unchecked { + _weight -= _tree.nodes[_tree.nodes[index].leftChild].weightSum; + } + + if (_tree.nodes[index].weight > _weight) { + return _tree.nodes[index].addr; + } + + unchecked { + _weight -= _tree.nodes[index].weight; + } + + if (_tree.nodes[_tree.nodes[index].rightChild].weightSum > _weight) { + index = _tree.nodes[index].rightChild; + } else { + return address(0); + } + } + + return address(0); + } + + /** + * @notice Promotes the node with higher weight to higher level of the tree. It is because to + * reduce the average number of traverses required since these nodes are more likely to + * be randomly selected. + * + * @param _tree The tree that includes the node to promote. + * @param _index The initial index of the target node to promote. + */ + function _promote(Tree storage _tree, uint32 _index) private { + Node storage node = _tree.nodes[_index]; + Node storage parentNode = _tree.nodes[node.parent]; + + while (node.parent != 0 && node.weight > parentNode.weight) { + address nodeAddr = node.addr; + node.addr = parentNode.addr; + parentNode.addr = nodeAddr; + + uint120 nodeWeight = node.weight; + uint120 parentWeight = parentNode.weight; + node.weight = parentWeight; + parentNode.weight = nodeWeight; + + unchecked { + node.weightSum -= nodeWeight - parentWeight; + } + + _tree.nodeMap[node.addr] = _index; + _tree.nodeMap[parentNode.addr] = node.parent; + + _index = node.parent; + node = _tree.nodes[_index]; + parentNode = _tree.nodes[node.parent]; + } + } + + /** + * @notice Demotes the node with lower weight to lower level of the tree. It is because to + * reduce the average number of traverses required since these nodes are less likely to + * be randomly selected. + * + * @param _tree The tree that includes the node to demote. + * @param _index The initial index of the target node to demote. + */ + function _demote(Tree storage _tree, uint32 _index) private { + while (true) { + Node storage node = _tree.nodes[_index]; + + if (_tree.nodes[node.leftChild].weight > _tree.nodes[node.rightChild].weight) { + if (_tree.nodes[node.leftChild].weight > node.weight) { + address nodeAddr = node.addr; + node.addr = _tree.nodes[node.leftChild].addr; + _tree.nodes[node.leftChild].addr = nodeAddr; + + uint120 nodeWeight = node.weight; + uint120 leftChildWeight = _tree.nodes[node.leftChild].weight; + node.weight = leftChildWeight; + _tree.nodes[node.leftChild].weight = nodeWeight; + + unchecked { + _tree.nodes[node.leftChild].weightSum -= leftChildWeight - nodeWeight; + } + + _tree.nodeMap[node.addr] = _index; + _tree.nodeMap[_tree.nodes[node.leftChild].addr] = node.leftChild; + + _index = node.leftChild; + + continue; + } + + return; + } else if (_tree.nodes[node.rightChild].weight > node.weight) { + address nodeAddr = node.addr; + node.addr = _tree.nodes[node.rightChild].addr; + _tree.nodes[node.rightChild].addr = nodeAddr; + + uint120 nodeWeight = node.weight; + uint120 rightChildWeight = _tree.nodes[node.rightChild].weight; + node.weight = rightChildWeight; + _tree.nodes[node.rightChild].weight = nodeWeight; + + unchecked { + _tree.nodes[node.rightChild].weightSum -= rightChildWeight - nodeWeight; + } + + _tree.nodeMap[node.addr] = _index; + _tree.nodeMap[_tree.nodes[node.rightChild].addr] = node.rightChild; + + _index = node.rightChild; + + continue; + } + + return; + } + } + + /** + * @notice When removing a node, pulls up the remaining nodes with higher weight to higher level + * of the tree. + * + * @param _tree The tree that includes the node to remove. + * @param _index The initial index of the target node to remove. + */ + function _pullUp(Tree storage _tree, uint32 _index) private { + while (true) { + Node storage node = _tree.nodes[_index]; + require(node.addr != address(0), "BalancedWeightTree: node not exists"); + + if (node.leftChild == 0) { + if (node.rightChild == 0) { + if (node.parent == 0) { + _tree.root = 0; + } else if (node.isLeftChild) { + _tree.nodes[node.parent].leftChild = 0; + } else { + _tree.nodes[node.parent].rightChild = 0; + } + + delete _tree.nodes[_index]; + + return; + } else { + node.addr = _tree.nodes[node.rightChild].addr; + node.weight = _tree.nodes[node.rightChild].weight; + node.weightSum = _tree.nodes[node.rightChild].weightSum; + + _tree.nodeMap[_tree.nodes[node.rightChild].addr] = _index; + + _index = node.rightChild; + } + } else if (node.rightChild == 0) { + node.addr = _tree.nodes[node.leftChild].addr; + node.weight = _tree.nodes[node.leftChild].weight; + node.weightSum = _tree.nodes[node.leftChild].weightSum; + + _tree.nodeMap[_tree.nodes[node.leftChild].addr] = _index; + + _index = node.leftChild; + } else if (_tree.nodes[node.leftChild].weight > _tree.nodes[node.rightChild].weight) { + node.addr = _tree.nodes[node.leftChild].addr; + node.weight = _tree.nodes[node.leftChild].weight; + unchecked { + node.weightSum = + _tree.nodes[node.leftChild].weightSum + + _tree.nodes[node.rightChild].weightSum; + } + + _tree.nodeMap[_tree.nodes[node.leftChild].addr] = _index; + + _index = node.leftChild; + } else { + node.addr = _tree.nodes[node.rightChild].addr; + node.weight = _tree.nodes[node.rightChild].weight; + unchecked { + node.weightSum = + _tree.nodes[node.leftChild].weightSum + + _tree.nodes[node.rightChild].weightSum; + } + + _tree.nodeMap[_tree.nodes[node.rightChild].addr] = _index; + + _index = node.rightChild; + } + } + } +} diff --git a/packages/contracts/contracts/libraries/Predeploys.sol b/packages/contracts/contracts/libraries/Predeploys.sol index b5c31d1058..44b5afe9fb 100644 --- a/packages/contracts/contracts/libraries/Predeploys.sol +++ b/packages/contracts/contracts/libraries/Predeploys.sol @@ -69,9 +69,4 @@ library Predeploys { */ address internal constant KROMA_MINTABLE_ERC721_FACTORY = 0x420000000000000000000000000000000000000c; - - /** - * @notice Address of the GovernanceToken predeploy. - */ - address internal constant GOVERNANCE_TOKEN = 0x42000000000000000000000000000000000000fF; } diff --git a/packages/contracts/contracts/libraries/Uint128Math.sol b/packages/contracts/contracts/libraries/Uint128Math.sol new file mode 100644 index 0000000000..1c94088745 --- /dev/null +++ b/packages/contracts/contracts/libraries/Uint128Math.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +/** + * @title Uint128Math + * @notice A library for handling overflow-safe math on uint128, especially for mulDiv operations. + * This library is motivated from the open-source Openzeppelin's Math library. + */ +library Uint128Math { + /** + * @dev Returns the largest of two numbers. + */ + function max(uint128 a, uint128 b) internal pure returns (uint128) { + return a > b ? a : b; + } + + /** + * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint128 or denominator == 0 + * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) + * with further edits by Uniswap Labs and Openzeppelin also under MIT license. + */ + function mulDiv( + uint128 x, + uint128 y, + uint128 denominator + ) internal pure returns (uint128 result) { + unchecked { + uint256 prod; + assembly { + prod := mul(x, y) + } + + // Make sure the result is less than 2^128. + require(denominator > (prod >> 128), "Uint128Math: mulDiv overflow"); + + // Direct division as fallback since we can't guarantee not exceeding 128 bits without further checks. + result = uint128(prod / uint256(denominator)); + return result; + } + } +} diff --git a/packages/contracts/contracts/test/AssetManager.t.sol b/packages/contracts/contracts/test/AssetManager.t.sol new file mode 100644 index 0000000000..63f44702dc --- /dev/null +++ b/packages/contracts/contracts/test/AssetManager.t.sol @@ -0,0 +1,903 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; + +import { AssetManager } from "../L1/AssetManager.sol"; +import { ValidatorManager } from "../L1/ValidatorManager.sol"; +import { IAssetManager } from "../L1/interfaces/IAssetManager.sol"; +import { IValidatorManager } from "../L1/interfaces/IValidatorManager.sol"; +import { Proxy } from "../universal/Proxy.sol"; +import { ValidatorSystemUpgrade_Initializer } from "./CommonTest.t.sol"; +import { MockL2OutputOracle } from "./ValidatorManager.t.sol"; + +contract MockAssetManager is AssetManager { + constructor( + IERC20 _assetToken, + IERC721 _kgh, + address _securityCouncil, + address _validatorRewardVault, + IValidatorManager _validatorManager, + uint128 _minDelegationPeriod, + uint128 _bondAmount + ) + AssetManager( + _assetToken, + _kgh, + _securityCouncil, + _validatorRewardVault, + _validatorManager, + _minDelegationPeriod, + _bondAmount + ) + {} + + function increaseRewardPerKgh(address validator, uint128 amount) external { + _vaults[validator].asset.rewardPerKghStored += amount; + } + + function increaseBaseReward(address validator, uint128 amount) external { + _vaults[validator].asset.totalKro += amount; + } +} + +contract MockValidatorManager is ValidatorManager { + constructor(ConstructorParams memory _constructorParams) ValidatorManager(_constructorParams) {} + + function sendToJail(address validator) external { + _jail[validator] = uint128(block.timestamp) + HARD_JAIL_PERIOD_SECONDS; + } + + function calculateBoostedReward(address validator) external view returns (uint128) { + return _getBoostedReward(validator); + } +} + +// Tests the implementations of the AssetManager +contract AssetManagerTest is ValidatorSystemUpgrade_Initializer { + MockAssetManager public mockAssetMgr; + MockValidatorManager public mockValMgr; + MockL2OutputOracle public mockOracle; + address public validator = trusted; + + function setUp() public override { + super.setUp(); + + MockL2OutputOracle mockOracleImpl = new MockL2OutputOracle( + pool, + valMgr, + address(colosseum), + submissionInterval, + l2BlockTime, + startingBlockNumber, + startingTimestamp, + finalizationPeriodSeconds + ); + vm.prank(multisig); + Proxy(payable(address(oracle))).upgradeTo(address(mockOracleImpl)); + mockOracle = MockL2OutputOracle(address(oracle)); + + MockAssetManager assetManagerImpl = new MockAssetManager( + IERC20(assetToken), + IERC721(kgh), + guardian, + validatorRewardVault, + valMgr, + minDelegationPeriod, + bondAmount + ); + vm.prank(multisig); + Proxy(payable(address(assetMgr))).upgradeTo(address(assetManagerImpl)); + mockAssetMgr = MockAssetManager(address(assetMgr)); + + MockValidatorManager mockValMgrImpl = new MockValidatorManager(constructorParams); + vm.prank(multisig); + Proxy(payable(address(valMgr))).upgradeTo(address(mockValMgrImpl)); + mockValMgr = MockValidatorManager(address(valMgr)); + + // Submit until terminateOutputIndex and set next output index to be finalized after it + for (uint256 i = oracle.nextOutputIndex(); i <= terminateOutputIndex; i++) { + _submitOutputRoot(pool.nextValidator()); + } + vm.warp(oracle.finalizedAt(terminateOutputIndex)); + mockOracle.mockSetNextFinalizeOutputIndex(terminateOutputIndex + 1); + } + + function _submitOutputRoot(address _validator) internal { + uint256 nextBlockNumber = oracle.nextBlockNumber(); + warpToSubmitTime(); + vm.prank(_validator); + mockOracle.addOutput(nextBlockNumber); + } + + function _registerValidator(uint128 amount) internal { + vm.startPrank(validator, validator); + assetToken.approve(address(assetMgr), amount); + valMgr.registerValidator(amount, 0, withdrawAcc); + vm.stopPrank(); + } + + function _delegate(address _delegator, uint128 amount) internal { + vm.startPrank(_delegator); + assetToken.approve(address(assetMgr), amount); + assetMgr.delegate(validator, amount); + vm.stopPrank(); + } + + function _delegateKgh(address _delegator, uint256 tokenId) internal { + kgh.mint(_delegator, tokenId); + vm.startPrank(_delegator); + kgh.approve(address(assetMgr), tokenId); + assetMgr.delegateKgh(validator, tokenId); + vm.stopPrank(); + } + + function _delegateKghBatch(uint256 kghCount) internal { + uint256[] memory tokenIds = new uint256[](kghCount); + for (uint256 i = 1; i < kghCount + 1; i++) { + kgh.mint(delegator, i); + vm.prank(delegator); + kgh.approve(address(assetMgr), i); + tokenIds[i - 1] = i; + } + + vm.prank(delegator); + assetMgr.delegateKghBatch(validator, tokenIds); + } + + function _undelegate(address _delegator) internal returns (uint128) { + uint128 delegatorKro = assetMgr.getKroAssets(validator, _delegator); + vm.warp(assetMgr.canUndelegateKroAt(validator, _delegator)); + vm.prank(_delegator); + assetMgr.undelegate(validator, delegatorKro); + + return delegatorKro; + } + + function _undelegateKgh(address _delegator, uint256 tokenId) internal { + vm.warp(assetMgr.canUndelegateKghAt(validator, _delegator, tokenId)); + vm.prank(_delegator); + assetMgr.undelegateKgh(validator, tokenId); + } + + function _undelegateKghBatch(uint256 kghCount) internal { + uint256[] memory tokenIds = new uint256[](kghCount); + for (uint256 i = 1; i < kghCount + 1; i++) { + tokenIds[i - 1] = i; + } + + vm.warp(assetMgr.canUndelegateKghAt(validator, delegator, tokenIds[0])); + vm.prank(delegator); + assetMgr.undelegateKghBatch(validator, tokenIds); + } + + function test_constructor_succeeds() external { + assertEq(address(assetMgr.ASSET_TOKEN()), address(assetToken)); + assertEq(address(assetMgr.KGH()), address(kgh)); + assertEq(assetMgr.SECURITY_COUNCIL(), guardian); + assertEq(address(assetMgr.VALIDATOR_REWARD_VAULT()), validatorRewardVault); + assertEq(address(assetMgr.VALIDATOR_MANAGER()), address(valMgr)); + assertEq(assetMgr.MIN_DELEGATION_PERIOD(), minDelegationPeriod); + assertEq(assetMgr.BOND_AMOUNT(), bondAmount); + } + + function test_depositToRegister_succeeds() external { + uint256 beforeBalance = assetToken.balanceOf(validator); + + vm.prank(validator); + assetToken.approve(address(assetMgr), minActivateAmount); + vm.prank(address(valMgr)); + assetMgr.depositToRegister(validator, minActivateAmount, withdrawAcc); + + assertEq(assetMgr.getWithdrawAccount(validator), withdrawAcc); + assertEq(assetMgr.totalValidatorKro(validator), minActivateAmount); + assertEq(assetMgr.canWithdrawAt(validator), block.timestamp + minDelegationPeriod); + assertEq(assetToken.balanceOf(validator), beforeBalance - minActivateAmount); + assertEq(assetToken.balanceOf(address(assetMgr)), minActivateAmount); + } + + function test_depositToRegister_callerNotValMgr_reverts() external { + vm.expectRevert(IAssetManager.NotAllowedCaller.selector); + assetMgr.depositToRegister(validator, minActivateAmount, withdrawAcc); + } + + function test_depositToRegister_zeroWithdrawAcc_reverts() external { + vm.prank(address(valMgr)); + vm.expectRevert(IAssetManager.ZeroAddress.selector); + assetMgr.depositToRegister(validator, minActivateAmount, address(0)); + } + + function test_deposit_succeeds() external { + _registerValidator(minActivateAmount); + + uint120 beforeWeight = valMgr.getWeight(validator); + uint256 beforeBalance = assetToken.balanceOf(validator); + uint128 beforeValidatorKro = assetMgr.totalValidatorKro(validator); + + vm.startPrank(validator); + assetToken.approve(address(assetMgr), bondAmount); + assetMgr.deposit(bondAmount); + + assertEq(assetMgr.totalValidatorKro(validator), beforeValidatorKro + bondAmount); + assertEq(assetMgr.canWithdrawAt(validator), block.timestamp + minDelegationPeriod); + assertEq(valMgr.getWeight(validator), beforeWeight + bondAmount); + assertEq(assetToken.balanceOf(validator), beforeBalance - bondAmount); + } + + function test_deposit_activate_succeeds() external { + _registerValidator(minActivateAmount - 1); + assertEq(valMgr.getWeight(validator), 0); + + vm.startPrank(validator); + assetToken.approve(address(assetMgr), 1); + assetMgr.deposit(1); + + assertEq(valMgr.getWeight(validator), minActivateAmount); + } + + function test_deposit_notActivate_succeeds() external { + _registerValidator(minActivateAmount - 2); + assertEq(valMgr.getWeight(validator), 0); + + vm.startPrank(validator); + assetToken.approve(address(assetMgr), 1); + assetMgr.deposit(1); + + assertEq(valMgr.getWeight(validator), 0); + } + + function test_deposit_inJailNotActivate_succeeds() external { + _registerValidator(minActivateAmount - 1); + assertEq(valMgr.getWeight(validator), 0); + + mockValMgr.sendToJail(validator); + assertTrue(valMgr.inJail(validator)); + + vm.startPrank(validator); + assetToken.approve(address(assetMgr), 1); + assetMgr.deposit(1); + + assertEq(valMgr.getWeight(validator), 0); + } + + function test_deposit_zeroAsset_reverts() external { + vm.expectRevert(IAssetManager.NotAllowedZeroInput.selector); + assetMgr.deposit(0); + } + + function test_deposit_validatorStatusNone_reverts() external { + vm.prank(validator); + vm.expectRevert(IAssetManager.ImproperValidatorStatus.selector); + assetMgr.deposit(bondAmount); + } + + function test_withdraw_succeeds() public { + _registerValidator(minActivateAmount); + assertEq(valMgr.getWeight(validator), minActivateAmount); + uint256 beforeBalance = assetToken.balanceOf(validator); + + address withdrawAccount = assetMgr.getWithdrawAccount(validator); + vm.warp(assetMgr.canWithdrawAt(validator)); + vm.prank(withdrawAccount); + assetMgr.withdraw(validator, minActivateAmount); + + assertEq(assetMgr.totalValidatorKro(validator), 0); + assertEq(valMgr.getWeight(validator), 0); + assertEq(assetToken.balanceOf(validator), beforeBalance); + assertEq(assetToken.balanceOf(withdrawAccount), minActivateAmount); + } + + function test_withdraw_notWithdrawAcc_reverts() external { + _registerValidator(minActivateAmount); + + vm.prank(validator); + vm.expectRevert(IAssetManager.NotAllowedCaller.selector); + assetMgr.withdraw(validator, minActivateAmount); + } + + function test_withdraw_zeroAsset_reverts() external { + _registerValidator(minActivateAmount); + + vm.prank(assetMgr.getWithdrawAccount(validator)); + vm.expectRevert(IAssetManager.NotAllowedZeroInput.selector); + assetMgr.withdraw(validator, 0); + } + + function test_withdraw_notElapsedMinDelegationPeriod_reverts() external { + _registerValidator(minActivateAmount); + + vm.prank(assetMgr.getWithdrawAccount(validator)); + vm.expectRevert(IAssetManager.NotElapsedMinDelegationPeriod.selector); + assetMgr.withdraw(validator, minActivateAmount); + } + + function test_withdraw_notExpiredJailPeriod_reverts() external { + _registerValidator(minActivateAmount); + + vm.warp(assetMgr.canWithdrawAt(validator)); + mockValMgr.sendToJail(validator); + + vm.prank(assetMgr.getWithdrawAccount(validator)); + vm.expectRevert(IAssetManager.ImproperValidatorStatus.selector); + assetMgr.withdraw(validator, minActivateAmount); + + vm.warp(valMgr.jailExpiresAt(validator)); + vm.prank(assetMgr.getWithdrawAccount(validator)); + assetMgr.withdraw(validator, minActivateAmount); + } + + function test_withdraw_insufficientValidatorKro_reverts() external { + _registerValidator(minActivateAmount); + + vm.warp(assetMgr.canWithdrawAt(validator)); + vm.prank(assetMgr.getWithdrawAccount(validator)); + vm.expectRevert(IAssetManager.InsufficientAsset.selector); + assetMgr.withdraw(validator, minActivateAmount + 1); + } + + function test_withdraw_validatorKroBonded_reverts() external { + _registerValidator(minActivateAmount); + + vm.prank(address(valMgr)); + assetMgr.bondValidatorKro(validator); + + address withdrawAccount = assetMgr.getWithdrawAccount(validator); + vm.warp(assetMgr.canWithdrawAt(validator)); + vm.startPrank(withdrawAccount); + vm.expectRevert(IAssetManager.InsufficientAsset.selector); + assetMgr.withdraw(validator, minActivateAmount); + + uint128 validatorKroBonded = assetMgr.totalValidatorKroBonded(validator); + assetMgr.withdraw(validator, minActivateAmount - validatorKroBonded); + + assertEq(assetMgr.totalValidatorKro(validator), validatorKroBonded); + assertEq(valMgr.getWeight(validator), 0); + assertEq(assetToken.balanceOf(withdrawAccount), minActivateAmount - validatorKroBonded); + } + + function test_delegate_succeeds() external { + _registerValidator(minActivateAmount); + + uint128 shares = assetMgr.previewDelegate(validator, bondAmount); + uint256 beforeBalance = assetToken.balanceOf(delegator); + uint120 beforeWeight = valMgr.getWeight(validator); + + _delegate(delegator, bondAmount); + + assertEq(assetToken.balanceOf(delegator), beforeBalance - bondAmount); + assertEq(assetMgr.totalKroAssets(validator), bondAmount); + assertEq(assetMgr.getKroTotalShareBalance(validator, delegator), shares); + assertEq( + assetMgr.canUndelegateKroAt(validator, delegator), + block.timestamp + minDelegationPeriod + ); + assertEq(valMgr.getWeight(validator), beforeWeight + bondAmount); + } + + function test_delegate_validatorStatusNone_reverts() external { + vm.expectRevert(IAssetManager.ImproperValidatorStatus.selector); + assetMgr.delegate(validator, bondAmount); + } + + function test_delegate_validatorStatusExited_reverts() external { + test_withdraw_succeeds(); + assertTrue(valMgr.getStatus(validator) == IValidatorManager.ValidatorStatus.EXITED); + + vm.expectRevert(IAssetManager.ImproperValidatorStatus.selector); + assetMgr.delegate(validator, bondAmount); + } + + function test_delegate_validatorInJail_reverts() external { + _registerValidator(minActivateAmount); + mockValMgr.sendToJail(validator); + assertTrue(valMgr.inJail(validator)); + + vm.expectRevert(IAssetManager.ImproperValidatorStatus.selector); + assetMgr.delegate(validator, bondAmount); + } + + function test_delegate_zeroAsset_reverts() external { + _registerValidator(minActivateAmount); + + vm.expectRevert(IAssetManager.NotAllowedZeroInput.selector); + vm.prank(delegator); + assetMgr.delegate(validator, 0); + } + + function test_delegateKgh_succeeds() external { + _registerValidator(minActivateAmount); + uint256 beforeBalance = assetToken.balanceOf(delegator); + + uint256 tokenId = 0; + _delegateKgh(delegator, tokenId); + + assertEq(assetToken.balanceOf(delegator), beforeBalance); + assertEq(assetMgr.getKghReward(validator, delegator), 0); + assertEq(kgh.ownerOf(tokenId), address(assetMgr)); + assertEq(assetMgr.totalKghNum(validator), 1); + assertEq(assetMgr.getKghNum(validator, delegator), 1); + assertEq( + assetMgr.canUndelegateKghAt(validator, delegator, tokenId), + block.timestamp + minDelegationPeriod + ); + } + + function test_delegateKgh_claimBoostedReward_succeeds() external { + _registerValidator(minActivateAmount); + _delegateKgh(delegator, 0); + + uint256 beforeBalance = assetToken.balanceOf(delegator); + + // Increase boosted reward + uint128 boostedReward = mockValMgr.calculateBoostedReward(validator); + mockAssetMgr.increaseRewardPerKgh(validator, boostedReward); + assertEq(assetMgr.getKghReward(validator, delegator), boostedReward); + + // Delegate one more KGH + _delegateKgh(delegator, 1); + + assertEq(assetToken.balanceOf(delegator), beforeBalance + boostedReward); + } + + function test_delegateKgh_validatorStatusNone_reverts() external { + vm.expectRevert(IAssetManager.ImproperValidatorStatus.selector); + assetMgr.delegateKgh(validator, 0); + } + + function test_delegateKgh_validatorStatusExited_reverts() external { + test_withdraw_succeeds(); + assertTrue(valMgr.getStatus(validator) == IValidatorManager.ValidatorStatus.EXITED); + + vm.expectRevert(IAssetManager.ImproperValidatorStatus.selector); + assetMgr.delegateKgh(validator, 0); + } + + function test_delegateKgh_validatorInJail_reverts() external { + _registerValidator(minActivateAmount); + mockValMgr.sendToJail(validator); + assertTrue(valMgr.inJail(validator)); + + vm.expectRevert(IAssetManager.ImproperValidatorStatus.selector); + assetMgr.delegateKgh(validator, 0); + } + + function test_delegateKghBatch_succeeds() external { + _registerValidator(minActivateAmount); + uint256 beforeBalance = assetToken.balanceOf(delegator); + + uint256 kghCount = 10; + _delegateKghBatch(kghCount); + + assertEq(assetToken.balanceOf(delegator), beforeBalance); + assertEq(assetMgr.getKghReward(validator, delegator), 0); + assertEq(assetMgr.totalKghNum(validator), kghCount); + assertEq(assetMgr.getKghNum(validator, delegator), kghCount); + for (uint256 i = 1; i < kghCount + 1; i++) { + assertEq(kgh.ownerOf(i), address(assetMgr)); + assertEq( + assetMgr.canUndelegateKghAt(validator, delegator, i), + block.timestamp + minDelegationPeriod + ); + } + } + + function test_delegateKghBatch_claimBoostedReward_succeeds() external { + _registerValidator(minActivateAmount); + _delegateKgh(delegator, 0); + + uint256 beforeBalance = assetToken.balanceOf(delegator); + + // Increase boosted reward + uint128 boostedReward = mockValMgr.calculateBoostedReward(validator); + mockAssetMgr.increaseRewardPerKgh(validator, boostedReward); + assertEq(assetMgr.getKghReward(validator, delegator), boostedReward); + + // Delegate two more KGHs + _delegateKghBatch(2); + + assertEq(assetToken.balanceOf(delegator), beforeBalance + boostedReward); + } + + function test_delegateKghBatch_validatorStatusNone_reverts() external { + uint256[] memory tokenIds = new uint256[](0); + vm.expectRevert(IAssetManager.ImproperValidatorStatus.selector); + assetMgr.delegateKghBatch(validator, tokenIds); + } + + function test_delegateKghBatch_validatorStatusExited_reverts() external { + test_withdraw_succeeds(); + assertTrue(valMgr.getStatus(validator) == IValidatorManager.ValidatorStatus.EXITED); + + uint256[] memory tokenIds = new uint256[](0); + vm.expectRevert(IAssetManager.ImproperValidatorStatus.selector); + assetMgr.delegateKghBatch(validator, tokenIds); + } + + function test_delegateKghBatch_validatorInJail_reverts() external { + _registerValidator(minActivateAmount); + mockValMgr.sendToJail(validator); + assertTrue(valMgr.inJail(validator)); + + uint256[] memory tokenIds = new uint256[](0); + vm.expectRevert(IAssetManager.ImproperValidatorStatus.selector); + assetMgr.delegateKghBatch(validator, tokenIds); + } + + function test_delegateKghBatch_zeroTokenIds_reverts() external { + _registerValidator(minActivateAmount); + + uint256[] memory tokenIds = new uint256[](0); + vm.expectRevert(IAssetManager.NotAllowedZeroInput.selector); + assetMgr.delegateKghBatch(validator, tokenIds); + } + + function test_undelegate_succeeds() external { + _registerValidator(minActivateAmount); + _delegate(delegator, bondAmount); + mockAssetMgr.increaseBaseReward(validator, baseReward); + uint256 beforeBalance = assetToken.balanceOf(delegator); + + uint128 delegatorKro = _undelegate(delegator); + + assertEq(assetMgr.totalKroAssets(validator), bondAmount + baseReward - delegatorKro); + assertEq( + valMgr.getWeight(validator), + minActivateAmount + bondAmount + baseReward - delegatorKro + ); + assertEq(assetToken.balanceOf(delegator), beforeBalance + delegatorKro); + } + + function test_undelegate_severalDelegators_succeeds() external { + _registerValidator(minActivateAmount); + _delegate(delegator, bondAmount); + mockAssetMgr.increaseBaseReward(validator, baseReward); + + address delegator2 = makeAddr("delegator2"); + assetToken.mint(delegator2, bondAmount); + _delegate(delegator2, bondAmount); + mockAssetMgr.increaseBaseReward(validator, baseReward); + uint256 beforeBalance = assetToken.balanceOf(delegator); + + uint128 delegatorKro = _undelegate(delegator); + + assertEq( + assetMgr.totalKroAssets(validator), + bondAmount * 2 + baseReward * 2 - delegatorKro + ); + assertEq( + valMgr.getWeight(validator), + minActivateAmount + bondAmount * 2 + baseReward * 2 - delegatorKro + ); + assertEq(assetToken.balanceOf(delegator), beforeBalance + delegatorKro); + } + + function test_undelegate_removedFromValidatorTree_succeeds() external { + _registerValidator(minActivateAmount - 1); + _delegate(delegator, bondAmount); + + vm.prank(validator); + valMgr.activateValidator(); + assertEq(valMgr.getWeight(validator), minActivateAmount - 1 + bondAmount); + + _undelegate(delegator); + + assertEq(valMgr.getWeight(validator), 0); + } + + function test_undelegate_zeroAsset_reverts() external { + vm.expectRevert(IAssetManager.NotAllowedZeroInput.selector); + assetMgr.undelegate(validator, 0); + } + + function test_undelegate_largeAsset_reverts() external { + vm.expectRevert(IAssetManager.InsufficientShare.selector); + assetMgr.undelegate(validator, 1); + } + + function test_undelegate_notElapsedMinDelegationPeriod_reverts() external { + _registerValidator(minActivateAmount); + _delegate(delegator, bondAmount); + + vm.expectRevert(IAssetManager.NotElapsedMinDelegationPeriod.selector); + vm.prank(delegator); + assetMgr.undelegate(validator, bondAmount); + } + + function test_undelegateKgh_succeeds() external { + _registerValidator(minActivateAmount); + uint256 tokenId = 0; + _delegateKgh(delegator, tokenId); + + uint128 boostedReward = mockValMgr.calculateBoostedReward(validator); + mockAssetMgr.increaseRewardPerKgh(validator, boostedReward); + + uint256 beforeBalance = assetToken.balanceOf(delegator); + boostedReward = assetMgr.getKghReward(validator, delegator); + + _undelegateKgh(delegator, tokenId); + + assertEq(assetMgr.getKghReward(validator, delegator), 0); + assertEq(assetMgr.totalKghNum(validator), 0); + assertEq(assetMgr.getKghNum(validator, delegator), 0); + assertEq(assetMgr.canUndelegateKghAt(validator, delegator, tokenId), minDelegationPeriod); + assertEq(kgh.ownerOf(tokenId), delegator); + assertEq(assetToken.balanceOf(delegator), beforeBalance + boostedReward); + } + + function test_undelegateKgh_noBoostedReward_succeeds() external { + _registerValidator(minActivateAmount); + uint256 tokenId = 0; + _delegateKgh(delegator, tokenId); + uint256 beforeBalance = assetToken.balanceOf(delegator); + + _undelegateKgh(delegator, tokenId); + + assertEq(assetToken.balanceOf(delegator), beforeBalance); + } + + function test_undelegateKgh_severalDelegators_succeeds() external { + _registerValidator(minActivateAmount); + _delegateKgh(delegator, 0); + uint128 boostedReward = mockValMgr.calculateBoostedReward(validator); + mockAssetMgr.increaseRewardPerKgh(validator, boostedReward); + + address delegator2 = makeAddr("delegator2"); + uint256 tokenId = 1; + _delegateKgh(delegator2, tokenId); + boostedReward = mockValMgr.calculateBoostedReward(validator); + mockAssetMgr.increaseRewardPerKgh(validator, boostedReward); + + uint256 beforeBalance = assetToken.balanceOf(delegator2); + boostedReward = assetMgr.getKghReward(validator, delegator2); + + _undelegateKgh(delegator2, tokenId); + + assertEq(assetMgr.getKghReward(validator, delegator2), 0); + assertEq(assetMgr.totalKghNum(validator), 1); + assertEq(assetMgr.getKghNum(validator, delegator2), 0); + assertEq(assetMgr.canUndelegateKghAt(validator, delegator2, tokenId), minDelegationPeriod); + assertEq(kgh.ownerOf(tokenId), delegator2); + assertEq(assetToken.balanceOf(delegator2), beforeBalance + boostedReward); + } + + function test_undelegateKgh_invalidTokenIds_reverts() external { + vm.expectRevert(IAssetManager.InvalidTokenIdsInput.selector); + assetMgr.undelegateKgh(validator, 0); + } + + function test_undelegateKgh_notElapsedMinDelegationPeriod_reverts() external { + _registerValidator(minActivateAmount); + _delegateKgh(delegator, 0); + + vm.expectRevert(IAssetManager.NotElapsedMinDelegationPeriod.selector); + vm.prank(delegator); + assetMgr.undelegateKgh(validator, 0); + } + + function test_undelegateKghBatch_succeeds() external { + _registerValidator(minActivateAmount); + uint256 kghCount = 10; + _delegateKghBatch(kghCount); + + uint128 boostedReward = mockValMgr.calculateBoostedReward(validator); + mockAssetMgr.increaseRewardPerKgh(validator, boostedReward); + + uint256 beforeBalance = assetToken.balanceOf(delegator); + boostedReward = assetMgr.getKghReward(validator, delegator); + + _undelegateKghBatch(kghCount); + + assertEq(assetMgr.getKghReward(validator, delegator), 0); + assertEq(assetMgr.totalKghNum(validator), 0); + assertEq(assetMgr.getKghNum(validator, delegator), 0); + assertEq(assetToken.balanceOf(delegator), beforeBalance + boostedReward); + for (uint256 i = 1; i < kghCount + 1; i++) { + assertEq(kgh.ownerOf(i), delegator); + assertEq(assetMgr.canUndelegateKghAt(validator, delegator, i), minDelegationPeriod); + } + } + + function test_undelegateKghBatch_noBoostedReward_succeeds() external { + _registerValidator(minActivateAmount); + uint256 kghCount = 10; + _delegateKghBatch(kghCount); + uint256 beforeBalance = assetToken.balanceOf(delegator); + + _undelegateKghBatch(kghCount); + + assertEq(assetToken.balanceOf(delegator), beforeBalance); + } + + function test_undelegateKghBatch_zeroTokenIds_reverts() external { + uint256[] memory tokenIds = new uint256[](0); + vm.expectRevert(IAssetManager.NotAllowedZeroInput.selector); + assetMgr.undelegateKghBatch(validator, tokenIds); + } + + function test_undelegateKghBatch_invalidTokenIds_reverts() external { + uint256[] memory tokenIds = new uint256[](1); + tokenIds[0] = 0; + vm.expectRevert(IAssetManager.InvalidTokenIdsInput.selector); + assetMgr.undelegateKghBatch(validator, tokenIds); + } + + function test_undelegateKghBatch_notElapsedMinDelegationPeriod_reverts() external { + _registerValidator(minActivateAmount); + _delegateKgh(delegator, 0); + vm.warp(assetMgr.canUndelegateKghAt(validator, delegator, 0)); + _delegateKgh(delegator, 1); + + uint256[] memory tokenIds = new uint256[](2); + tokenIds[0] = 0; + tokenIds[1] = 1; + vm.expectRevert(IAssetManager.NotElapsedMinDelegationPeriod.selector); + vm.prank(delegator); + assetMgr.undelegateKghBatch(validator, tokenIds); + } + + function test_claimKghReward_succeeds() external { + _registerValidator(minActivateAmount); + _delegateKgh(delegator, 0); + uint128 boostedReward = mockValMgr.calculateBoostedReward(validator); + mockAssetMgr.increaseRewardPerKgh(validator, boostedReward); + uint256 beforeBalance = assetToken.balanceOf(delegator); + + boostedReward = assetMgr.getKghReward(validator, delegator); + + vm.prank(delegator); + assetMgr.claimKghReward(validator); + + assertEq(assetToken.balanceOf(delegator), beforeBalance + boostedReward); + } + + function test_claimKghReward_zeroBoostedReward_reverts() external { + _registerValidator(minActivateAmount); + _delegateKgh(delegator, 0); + + vm.prank(delegator); + vm.expectRevert(IAssetManager.InsufficientAsset.selector); + assetMgr.claimKghReward(validator); + } + + function test_bondValidatorKro_succeeds() public { + _registerValidator(minActivateAmount); + + vm.prank(address(valMgr)); + assetMgr.bondValidatorKro(validator); + + assertEq(assetMgr.totalValidatorKro(validator), minActivateAmount); + assertEq(assetMgr.totalValidatorKroBonded(validator), bondAmount); + } + + function test_bondValidatorKro_callerNotValMgr_reverts() external { + vm.expectRevert(IAssetManager.NotAllowedCaller.selector); + assetMgr.bondValidatorKro(validator); + } + + function test_bondValidatorKro_insufficientAsset_reverts() external { + vm.prank(address(valMgr)); + vm.expectRevert(IAssetManager.InsufficientAsset.selector); + assetMgr.bondValidatorKro(validator); + } + + function test_unbondValidatorKro_succeeds() external { + test_bondValidatorKro_succeeds(); + + vm.prank(address(valMgr)); + assetMgr.unbondValidatorKro(validator); + + assertEq(assetMgr.totalValidatorKro(validator), minActivateAmount); + assertEq(assetMgr.totalValidatorKroBonded(validator), 0); + } + + function test_unbondValidatorKro_callerNotValMgr_reverts() external { + vm.expectRevert(IAssetManager.NotAllowedCaller.selector); + assetMgr.unbondValidatorKro(validator); + } + + function test_increaseBalanceWithReward_succeeds() external { + test_bondValidatorKro_succeeds(); + _delegateKgh(delegator, 0); + + uint256 beforeBalance = assetToken.balanceOf(address(assetMgr)); + uint256 beforeVaultBalance = assetToken.balanceOf(validatorRewardVault); + + uint128 boostedReward = 5e18; + uint128 validatorReward = 10e18; + uint128 totalReward = baseReward + boostedReward + validatorReward; + + vm.prank(address(valMgr)); + assetMgr.increaseBalanceWithReward(validator, baseReward, boostedReward, validatorReward); + + assertEq(assetToken.balanceOf(address(assetMgr)), beforeBalance + totalReward); + assertEq(assetToken.balanceOf(validatorRewardVault), beforeVaultBalance - totalReward); + assertEq(assetMgr.totalKroAssets(validator), baseReward); + assertEq(assetMgr.totalValidatorKro(validator), minActivateAmount + validatorReward); + assertEq(assetMgr.getKghReward(validator, delegator), boostedReward); + assertEq(assetMgr.totalValidatorKroBonded(validator), 0); + } + + function test_increaseBalanceWithReward_validatorIsSC_succeeds() external { + uint256 beforeBalance = assetToken.balanceOf(address(assetMgr)); + uint256 beforeSCBalance = assetToken.balanceOf(guardian); + uint256 beforeVaultBalance = assetToken.balanceOf(validatorRewardVault); + + uint128 boostedReward = 5e18; + uint128 validatorReward = 10e18; + uint128 totalReward = baseReward + boostedReward + validatorReward; + + vm.prank(address(valMgr)); + assetMgr.increaseBalanceWithReward(guardian, baseReward, boostedReward, validatorReward); + + assertEq(assetToken.balanceOf(address(assetMgr)), beforeBalance); + assertEq(assetToken.balanceOf(guardian), beforeSCBalance + totalReward); + assertEq(assetToken.balanceOf(validatorRewardVault), beforeVaultBalance - totalReward); + } + + function test_increaseBalanceWithReward_callerNotValMgr_reverts() external { + vm.expectRevert(IAssetManager.NotAllowedCaller.selector); + assetMgr.increaseBalanceWithReward(validator, 0, 0, 0); + } + + function test_increaseBalanceWithChallenge_succeeds() external { + assetToken.mint(address(assetMgr), bondAmount); + + uint256 beforeSCBalance = assetToken.balanceOf(guardian); + uint128 tax = (bondAmount * assetMgr.TAX_NUMERATOR()) / assetMgr.TAX_DENOMINATOR(); + + vm.prank(address(valMgr)); + uint128 challengeReward = assetMgr.increaseBalanceWithChallenge(validator, bondAmount); + + assertEq(assetToken.balanceOf(guardian), beforeSCBalance + tax); + assertEq(assetMgr.totalValidatorKro(validator), bondAmount - tax); + assertEq(challengeReward, bondAmount - tax); + } + + function test_increaseBalanceWithChallenge_winnerIsSC_succeeds() external { + assetToken.mint(address(assetMgr), bondAmount); + + uint256 beforeSCBalance = assetToken.balanceOf(guardian); + + vm.prank(address(valMgr)); + uint128 challengeReward = assetMgr.increaseBalanceWithChallenge(guardian, bondAmount); + + assertEq(assetToken.balanceOf(guardian), beforeSCBalance + bondAmount); + assertEq(challengeReward, bondAmount); + } + + function test_increaseBalanceWithChallenge_callerNotValMgr_reverts() external { + vm.expectRevert(IAssetManager.NotAllowedCaller.selector); + assetMgr.increaseBalanceWithChallenge(validator, 0); + } + + function test_decreaseBalanceWithChallenge_succeeds() external { + test_bondValidatorKro_succeeds(); + + vm.prank(address(valMgr)); + uint128 challengeReward = assetMgr.decreaseBalanceWithChallenge(validator); + + assertEq(assetMgr.totalValidatorKro(validator), minActivateAmount - bondAmount); + assertEq(assetMgr.totalValidatorKroBonded(validator), 0); + assertEq(challengeReward, bondAmount); + } + + function test_decreaseBalanceWithChallenge_callerNotValMgr_reverts() external { + vm.expectRevert(IAssetManager.NotAllowedCaller.selector); + assetMgr.decreaseBalanceWithChallenge(validator); + } + + function test_revertDecreaseBalanceWithChallenge_succeeds() external { + vm.prank(address(valMgr)); + uint128 challengeReward = assetMgr.revertDecreaseBalanceWithChallenge(validator); + + assertEq(assetMgr.totalValidatorKro(validator), bondAmount); + assertEq(assetMgr.totalValidatorKroBonded(validator), bondAmount); + assertEq(challengeReward, bondAmount); + } + + function test_revertDecreaseBalanceWithChallenge_callerNotValMgr_reverts() external { + vm.expectRevert(IAssetManager.NotAllowedCaller.selector); + assetMgr.revertDecreaseBalanceWithChallenge(validator); + } +} diff --git a/packages/contracts/contracts/test/BalancedWeightTree.t.sol b/packages/contracts/contracts/test/BalancedWeightTree.t.sol new file mode 100644 index 0000000000..5b9a8a9305 --- /dev/null +++ b/packages/contracts/contracts/test/BalancedWeightTree.t.sol @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { Test } from "forge-std/Test.sol"; +import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; + +import { BalancedWeightTree } from "../libraries/BalancedWeightTree.sol"; + +contract BalancedWeightTree_Test is Test { + BalancedWeightTree.Tree internal tree; + + function setUp() public { + for (uint256 i; i < 100; i++) { + address addr = makeAddr(Strings.toString(i)); + BalancedWeightTree.insert(tree, addr, uint120(rand(i, 1000))); + } + } + + function rand(uint256 _mixer, uint256 _range) private view returns (uint256) { + uint256 seed = uint256( + keccak256(abi.encodePacked(block.difficulty, block.timestamp, _mixer)) + ); + return seed % _range; + } + + function testFuzz_insert_succeeds(address _addr, uint120 _weight) external { + vm.assume(_addr != address(0)); + uint32 index = tree.nodeMap[_addr]; + vm.assume(index == 0); + + uint32 counter = tree.counter; + BalancedWeightTree.insert(tree, _addr, _weight); + + index = tree.nodeMap[_addr]; + assertEq(tree.counter, counter + 1); + assertEq(tree.nodes[index].addr, _addr); + assertEq(tree.nodes[index].weight, _weight); + } + + function testFuzz_update_succeeds(uint32 _index, uint120 _weight) external { + uint32 index = (_index % tree.counter) + 1; + address addr = tree.nodes[index].addr; + + bool succeed = BalancedWeightTree.update(tree, addr, _weight); + + uint32 newIndex = tree.nodeMap[addr]; + assertTrue(succeed); + assertEq(tree.nodes[newIndex].weight, _weight); + } + + function testFuzz_remove_succeeds(uint32 _index) external { + uint32 removed = tree.removed; + uint32 index = (_index % tree.counter) + 1; + address addr = tree.nodes[index].addr; + + bool succeed = BalancedWeightTree.remove(tree, addr); + + assertTrue(succeed); + assertEq(tree.removed, removed + 1); + assertEq(tree.nodeMap[addr], 0); + assertTrue(tree.nodes[index].addr != addr); + } + + function testFuzz_select_succeeds(uint120 _weight) external { + address selected = BalancedWeightTree.select( + tree, + _weight % tree.nodes[tree.root].weightSum + ); + + assertTrue(selected != address(0)); + } +} diff --git a/packages/contracts/contracts/test/BenchmarkTest.t.sol b/packages/contracts/contracts/test/BenchmarkTest.t.sol index 7e3bb6c3e3..fcb350fcfd 100644 --- a/packages/contracts/contracts/test/BenchmarkTest.t.sol +++ b/packages/contracts/contracts/test/BenchmarkTest.t.sol @@ -10,11 +10,7 @@ import { CrossDomainMessenger } from "../universal/CrossDomainMessenger.sol"; import "./CommonTest.t.sol"; // Free function for setting the prevBaseFee param in the KromaPortal. -function setPrevBaseFee( - Vm _vm, - address _portal, - uint128 _prevBaseFee -) { +function setPrevBaseFee(Vm _vm, address _portal, uint128 _prevBaseFee) { _vm.store(address(_portal), bytes32(uint256(1)), bytes32((block.number << 192) | _prevBaseFee)); } @@ -75,7 +71,7 @@ contract GasBenchMark_KromaPortal is Portal_Initializer { // Get the system into a nice ready-to-use state. function setUp() public override { // Configure the oracle to return the output root we've prepared. - vm.warp(oracle.computeL2Timestamp(_submittedBlockNumber) + 1); + vm.warp(oracle.nextOutputMinL2Timestamp()); vm.prank(trusted); oracle.submitL2Output(_outputRoot, _submittedBlockNumber, 0, 0); @@ -224,7 +220,7 @@ contract GasBenchMark_L2OutputOracle is L2OutputOracle_Initializer { pool.deposit{ value: requiredBondAmount }(); nextBlockNumber = oracle.nextBlockNumber(); - warpToSubmitTime(nextBlockNumber); + warpToSubmitTime(); vm.startPrank(trusted); } diff --git a/packages/contracts/contracts/test/Colosseum.t.sol b/packages/contracts/contracts/test/Colosseum.t.sol index 484848f1b2..02a020c0e1 100644 --- a/packages/contracts/contracts/test/Colosseum.t.sol +++ b/packages/contracts/contracts/test/Colosseum.t.sol @@ -1,16 +1,71 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.15; -import { Math } from "@openzeppelin/contracts/utils/math/Math.sol"; - import { Types } from "../libraries/Types.sol"; +import { IValidatorManager } from "../L1/interfaces/IValidatorManager.sol"; import { Colosseum } from "../L1/Colosseum.sol"; -import { Colosseum_Initializer } from "./CommonTest.t.sol"; +import { L2OutputOracle } from "../L1/L2OutputOracle.sol"; +import { ValidatorPool } from "../L1/ValidatorPool.sol"; +import { ZKVerifier } from "../L1/ZKVerifier.sol"; +import { Hashing } from "../libraries/Hashing.sol"; +import { Proxy } from "../universal/Proxy.sol"; import { ColosseumTestData } from "./testdata/ColosseumTestData.sol"; -import { SecurityCouncil } from "../L1/SecurityCouncil.sol"; +import { Colosseum_Initializer } from "./CommonTest.t.sol"; +import { MockL2OutputOracle } from "./ValidatorManager.t.sol"; + +contract MockColosseum is Colosseum { + constructor( + L2OutputOracle _l2Oracle, + ZKVerifier _zkVerifier, + uint256 _submissionInterval, + uint256 _creationPeriodSeconds, + uint256 _bisectionTimeout, + uint256 _provingTimeout, + bytes32 _dummyHash, + uint256 _maxTxs, + uint256[] memory _segmentsLengths, + address _securityCouncil, + address _zkMerkleTrie + ) + Colosseum( + _l2Oracle, + _zkVerifier, + _submissionInterval, + _creationPeriodSeconds, + _bisectionTimeout, + _provingTimeout, + _dummyHash, + _maxTxs, + _segmentsLengths, + _securityCouncil, + _zkMerkleTrie + ) + {} + + function getChallenge( + uint256 _outputIndex, + address _challenger + ) external view returns (Types.Challenge memory) { + return challenges[_outputIndex][_challenger]; + } + + function isAbleToBisect( + uint256 _outputIndex, + address _challenger + ) external view returns (bool) { + return _isAbleToBisect(challenges[_outputIndex][_challenger]); + } + + function hashPublicInput( + Types.PublicInputProof calldata _proof + ) external view returns (bytes32) { + return _hashPublicInput(_proof.srcOutputRootProof.stateRoot, _proof.publicInput); + } +} // Test the implementations of the Colosseum contract ColosseumTest is Colosseum_Initializer { + MockColosseum mockColosseum; uint256 internal targetOutputIndex; mapping(address => bool) internal isChallenger; @@ -23,6 +78,23 @@ contract ColosseumTest is Colosseum_Initializer { function setUp() public virtual override { super.setUp(); + MockColosseum mockColosseumImpl = new MockColosseum( + oracle, + zkVerifier, + submissionInterval, + creationPeriodSeconds, + bisectionTimeout, + provingTimeout, + DUMMY_HASH, + MAX_TXS, + segmentsLengths, + address(securityCouncil), + address(zkMerkleTrie) + ); + vm.prank(multisig); + Proxy(payable(address(colosseum))).upgradeTo(address(mockColosseumImpl)); + mockColosseum = MockColosseum(address(colosseum)); + vm.prank(trusted); pool.deposit{ value: trusted.balance }(); vm.prank(asserter); @@ -31,13 +103,13 @@ contract ColosseumTest is Colosseum_Initializer { // Submit genesis output uint256 nextBlockNumber = oracle.nextBlockNumber(); // Roll to after the block number we'll submit - warpToSubmitTime(nextBlockNumber); + warpToSubmitTime(); vm.prank(pool.nextValidator()); oracle.submitL2Output(bytes32(nextBlockNumber), nextBlockNumber, 0, 0); // Submit invalid output nextBlockNumber = oracle.nextBlockNumber(); - warpToSubmitTime(nextBlockNumber); + warpToSubmitTime(); vm.prank(pool.nextValidator()); oracle.submitL2Output(keccak256(abi.encode()), nextBlockNumber, 0, 0); @@ -71,7 +143,7 @@ contract ColosseumTest is Colosseum_Initializer { uint256 _segStart, uint256 _segSize ) private view returns (bytes32[] memory) { - uint256 segLen = colosseum.getSegmentsLength(_turn); + uint256 segLen = colosseum.segmentsLengths(_turn - 1); bytes32[] memory arr = new bytes32[](segLen); @@ -91,7 +163,7 @@ contract ColosseumTest is Colosseum_Initializer { return 0; } - uint256 segLen = colosseum.getSegmentsLength(_challenge.turn); + uint256 segLen = colosseum.segmentsLengths(_challenge.turn - 1); uint256 start = _challenge.segStart; uint256 degree = _challenge.segSize / (segLen - 1); uint256 current = start + degree; @@ -135,22 +207,22 @@ contract ColosseumTest is Colosseum_Initializer { vm.prank(_challenger); colosseum.createChallenge(_outputIndex, bytes32(0), 0, segments); - Types.Challenge memory challenge = colosseum.getChallenge(_outputIndex, _challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(_outputIndex, _challenger); assertEq(challenge.asserter, targetOutput.submitter); assertEq(challenge.challenger, _challenger); assertEq(challenge.timeoutAt, block.timestamp + colosseum.BISECTION_TIMEOUT()); - assertEq(challenge.segments.length, colosseum.getSegmentsLength(1)); + assertEq(challenge.segments.length, colosseum.segmentsLengths(0)); assertEq(challenge.segStart, start); assertEq(challenge.segSize, end - start); assertEq(challenge.turn, 1); } function _bisect(uint256 _outputIndex, address _challenger, address _sender) private { - Types.Challenge memory challenge = colosseum.getChallenge(_outputIndex, _challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(_outputIndex, _challenger); uint256 position = _detectFault(challenge, _sender); - uint256 segSize = challenge.segSize / (colosseum.getSegmentsLength(challenge.turn) - 1); + uint256 segSize = challenge.segSize / (colosseum.segmentsLengths(challenge.turn - 1) - 1); uint256 segStart = challenge.segStart + position * segSize; bytes32[] memory segments = _newSegments(_sender, challenge.turn + 1, segStart, segSize); @@ -163,21 +235,24 @@ contract ColosseumTest is Colosseum_Initializer { } colosseum.bisect(_outputIndex, challenge.challenger, position, segments); - Types.Challenge memory newChallenge = colosseum.getChallenge(_outputIndex, _challenger); + Types.Challenge memory newChallenge = mockColosseum.getChallenge(_outputIndex, _challenger); assertEq(newChallenge.turn, challenge.turn + 1); assertEq(newChallenge.segments.length, segments.length); assertEq(newChallenge.segStart, segStart); assertEq(newChallenge.segSize, segSize); } - function _proveFault(uint256 _outputIndex, address _challenger) private { + function _proveFault( + uint256 _outputIndex, + address _challenger + ) private returns (bytes32 publicInputHash) { // get previous snapshot Types.CheckpointOutput memory prevOutput = oracle.getL2Output(_outputIndex); - Types.Challenge memory challenge = colosseum.getChallenge(_outputIndex, _challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(_outputIndex, _challenger); uint256 position = _detectFault(challenge, challenge.challenger); - _doProveFault(challenge.challenger, _outputIndex, position); + publicInputHash = _doProveFault(challenge.challenger, _outputIndex, position); assertEq( uint256(colosseum.getStatus(_outputIndex, challenge.challenger)), @@ -192,7 +267,11 @@ contract ColosseumTest is Colosseum_Initializer { assertEq(prevOutput.l2BlockNumber, newOutput.l2BlockNumber); } - function _doProveFault(address _challenger, uint256 _outputIndex, uint256 _position) private { + function _doProveFault( + address _challenger, + uint256 _outputIndex, + uint256 _position + ) private returns (bytes32) { ( Types.OutputRootProof memory srcOutputRootProof, Types.OutputRootProof memory dstOutputRootProof @@ -217,6 +296,8 @@ contract ColosseumTest is Colosseum_Initializer { vm.prank(_challenger); colosseum.proveFault(_outputIndex, _position, proof, pp.proof, pp.pair); + + return mockColosseum.hashPublicInput(proof); } function _dismissChallenge(uint256 txId) private { @@ -228,16 +309,28 @@ contract ColosseumTest is Colosseum_Initializer { securityCouncil.confirmTransaction(txId); } - function test_constructor() external { + function test_constructor_succeeds() external { assertEq(address(colosseum.L2_ORACLE()), address(oracle), "oracle address not matched"); assertEq( address(colosseum.ZK_VERIFIER()), address(zkVerifier), "zk verifier address not matched" ); + assertEq(colosseum.CREATION_PERIOD_SECONDS(), creationPeriodSeconds); + assertEq(colosseum.BISECTION_TIMEOUT(), bisectionTimeout); + assertEq(colosseum.PROVING_TIMEOUT(), provingTimeout); + assertEq(colosseum.L2_ORACLE_SUBMISSION_INTERVAL(), submissionInterval); assertEq(colosseum.DUMMY_HASH(), DUMMY_HASH); assertEq(colosseum.MAX_TXS(), MAX_TXS); assertEq(colosseum.SECURITY_COUNCIL(), address(securityCouncil)); + assertEq(colosseum.ZK_MERKLE_TRIE(), address(zkMerkleTrie)); + } + + function test_initialize_succeeds() external { + assertEq(colosseum.segmentsLengths(0), segmentsLengths[0]); + assertEq(colosseum.segmentsLengths(1), segmentsLengths[1]); + assertEq(colosseum.segmentsLengths(2), segmentsLengths[2]); + assertEq(colosseum.segmentsLengths(3), segmentsLengths[3]); } function test_createChallenge_succeeds() external { @@ -268,34 +361,20 @@ contract ColosseumTest is Colosseum_Initializer { } function test_createChallenge_genesisOutput_reverts() external { - uint256 segLen = colosseum.getSegmentsLength(1); + uint256 segLen = colosseum.segmentsLengths(0); vm.prank(challenger); - vm.expectRevert("Colosseum: challenge for genesis output is not allowed"); + vm.expectRevert(Colosseum.NotAllowedGenesisOutput.selector); colosseum.createChallenge(0, bytes32(0), 0, new bytes32[](segLen)); } - function test_createChallenge_finalizedOutput_reverts() external { - uint256 outputIndex = targetOutputIndex; - Types.CheckpointOutput memory targetOutput = oracle.getL2Output(outputIndex); - uint256 segLen = colosseum.getSegmentsLength(1); - - vm.warp(targetOutput.timestamp + oracle.FINALIZATION_PERIOD_SECONDS() + 1); - - vm.prank(challenger); - vm.expectRevert( - "Colosseum: cannot progress challenge process about already finalized output" - ); - colosseum.createChallenge(outputIndex, bytes32(0), 0, new bytes32[](segLen)); - } - function test_createChallenge_asAsserter_reverts() external { uint256 outputIndex = targetOutputIndex; Types.CheckpointOutput memory targetOutput = oracle.getL2Output(outputIndex); - uint256 segLen = colosseum.getSegmentsLength(1); + uint256 segLen = colosseum.segmentsLengths(0); vm.prank(targetOutput.submitter); - vm.expectRevert("Colosseum: the asserter and challenger must be different"); + vm.expectRevert(Colosseum.NotAllowedCaller.selector); colosseum.createChallenge(outputIndex, bytes32(0), 0, new bytes32[](segLen)); } @@ -308,21 +387,21 @@ contract ColosseumTest is Colosseum_Initializer { uint256(Colosseum.ChallengeStatus.ASSERTER_TURN) ); - uint256 segLen = colosseum.getSegmentsLength(1); + uint256 segLen = colosseum.segmentsLengths(0); vm.prank(challenger); - vm.expectRevert("Colosseum: the challenge for given output index is already in progress"); + vm.expectRevert(Colosseum.ImproperChallengeStatus.selector); colosseum.createChallenge(outputIndex, bytes32(0), 0, new bytes32[](segLen)); } function test_createChallenge_withBadSegments_reverts() external { uint256 latestBlockNumber = oracle.latestBlockNumber(); uint256 outputIndex = oracle.getL2OutputIndexAfter(latestBlockNumber); - uint256 segLen = colosseum.getSegmentsLength(1); + uint256 segLen = colosseum.segmentsLengths(0); vm.startPrank(challenger); // invalid segments length - vm.expectRevert("Colosseum: invalid segments length"); + vm.expectRevert(Colosseum.InvalidSegmentsLength.selector); colosseum.createChallenge(outputIndex, bytes32(0), 0, new bytes32[](segLen + 1)); bytes32[] memory segments = new bytes32[](segLen); @@ -332,7 +411,7 @@ contract ColosseumTest is Colosseum_Initializer { segments[i] = keccak256(abi.encodePacked("wrong hash", i)); } segments[segLen - 1] = oracle.getL2Output(outputIndex).outputRoot; - vm.expectRevert("Colosseum: the first segment must be matched"); + vm.expectRevert(Colosseum.FirstSegmentMismatched.selector); colosseum.createChallenge(outputIndex, bytes32(0), 0, segments); // invalid output root of the last segment @@ -341,7 +420,7 @@ contract ColosseumTest is Colosseum_Initializer { } segments[0] = oracle.getL2Output(outputIndex - 1).outputRoot; segments[segLen - 1] = oracle.getL2Output(outputIndex).outputRoot; - vm.expectRevert("Colosseum: the last segment must not be matched"); + vm.expectRevert(Colosseum.LastSegmentMatched.selector); colosseum.createChallenge(outputIndex, bytes32(0), 0, segments); vm.stopPrank(); @@ -349,7 +428,7 @@ contract ColosseumTest is Colosseum_Initializer { function test_createChallenge_notSubmittedOutput_reverts() external { uint256 outputIndex = targetOutputIndex; - uint256 segLen = colosseum.getSegmentsLength(1); + uint256 segLen = colosseum.segmentsLengths(0); vm.prank(challenger); vm.expectRevert(); @@ -365,10 +444,10 @@ contract ColosseumTest is Colosseum_Initializer { uint256(Colosseum.ChallengeStatus.NONE) ); - uint256 segLen = colosseum.getSegmentsLength(1); + uint256 segLen = colosseum.segmentsLengths(0); vm.prank(challenger); - vm.expectRevert("Colosseum: challenge for deleted output is not allowed"); + vm.expectRevert(Colosseum.OutputAlreadyDeleted.selector); colosseum.createChallenge(outputIndex, bytes32(0), 0, new bytes32[](segLen)); } @@ -376,10 +455,10 @@ contract ColosseumTest is Colosseum_Initializer { uint256 outputIndex = targetOutputIndex; _createChallenge(outputIndex, challenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); _bisect(outputIndex, challenge.challenger, challenge.asserter); - challenge = colosseum.getChallenge(outputIndex, challenge.challenger); + challenge = mockColosseum.getChallenge(outputIndex, challenge.challenger); vm.warp(challenge.timeoutAt + 1); assertEq( @@ -415,16 +494,16 @@ contract ColosseumTest is Colosseum_Initializer { bytes32[] memory segments = new bytes32[](0); vm.prank(challenger); - vm.expectRevert("Colosseum: cannot create a challenge after the creation period"); + vm.expectRevert(Colosseum.CreationPeriodPassed.selector); colosseum.createChallenge(outputIndex, bytes32(0), 0, segments); } function test_createChallenge_wrongFork_reverts() external { uint256 outputIndex = targetOutputIndex; - uint256 segLen = colosseum.getSegmentsLength(1); + uint256 segLen = colosseum.segmentsLengths(0); vm.prank(challenger); - vm.expectRevert("Colosseum: block hash does not match the hash at the expected height"); + vm.expectRevert(Colosseum.L1Reorged.selector); colosseum.createChallenge( outputIndex, bytes32(uint256(0x01)), @@ -436,7 +515,7 @@ contract ColosseumTest is Colosseum_Initializer { function test_bisect_succeeds() external { uint256 outputIndex = targetOutputIndex; _createChallenge(outputIndex, challenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); assertEq(nextSender(challenge), challenge.asserter); @@ -446,7 +525,7 @@ contract ColosseumTest is Colosseum_Initializer { function test_bisect_finalizedOutput_reverts() external { uint256 outputIndex = targetOutputIndex; _createChallenge(outputIndex, challenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); assertEq( uint256(colosseum.getStatus(outputIndex, challenger)), @@ -456,24 +535,22 @@ contract ColosseumTest is Colosseum_Initializer { Types.CheckpointOutput memory targetOutput = oracle.getL2Output(outputIndex); vm.warp(targetOutput.timestamp + oracle.FINALIZATION_PERIOD_SECONDS() + 1); - uint256 segLen = colosseum.getSegmentsLength(challenge.turn + 1); + uint256 segLen = colosseum.segmentsLengths(challenge.turn); vm.prank(challenge.asserter); - vm.expectRevert( - "Colosseum: cannot progress challenge process about already finalized output" - ); + vm.expectRevert(Colosseum.OutputAlreadyFinalized.selector); colosseum.bisect(outputIndex, challenge.challenger, 0, new bytes32[](segLen)); } function test_bisect_withBadSegments_reverts() external { uint256 outputIndex = targetOutputIndex; _createChallenge(outputIndex, challenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); assertEq(nextSender(challenge), challenge.asserter); uint256 position = _detectFault(challenge, challenge.asserter); - uint256 segSize = challenge.segSize / (colosseum.getSegmentsLength(challenge.turn) - 1); + uint256 segSize = challenge.segSize / (colosseum.segmentsLengths(challenge.turn - 1) - 1); uint256 segStart = challenge.segStart + position * segSize; bytes32[] memory segments = _newSegments( @@ -488,13 +565,13 @@ contract ColosseumTest is Colosseum_Initializer { // invalid output of the first segment bytes32 firstSegment = segments[0]; segments[0] = keccak256(abi.encodePacked("wrong hash", uint256(0))); - vm.expectRevert("Colosseum: the first segment must be matched"); + vm.expectRevert(Colosseum.FirstSegmentMismatched.selector); colosseum.bisect(outputIndex, challenge.challenger, position, segments); // invalid output of the last segment segments[0] = firstSegment; segments[segments.length - 1] = challenge.segments[position + 1]; - vm.expectRevert("Colosseum: the last segment must not be matched"); + vm.expectRevert(Colosseum.LastSegmentMatched.selector); colosseum.bisect(outputIndex, challenge.challenger, position, segments); vm.stopPrank(); @@ -503,29 +580,29 @@ contract ColosseumTest is Colosseum_Initializer { function test_bisect_ifNotYourTurn_reverts() external { uint256 outputIndex = targetOutputIndex; _createChallenge(outputIndex, challenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); assertEq(nextSender(challenge), challenge.asserter); - uint256 segLen = colosseum.getSegmentsLength(challenge.turn + 1); + uint256 segLen = colosseum.segmentsLengths(challenge.turn); vm.prank(challenge.challenger); - vm.expectRevert("Colosseum: not your turn"); + vm.expectRevert(Colosseum.NotAllowedCaller.selector); colosseum.bisect(outputIndex, challenge.challenger, 0, new bytes32[](segLen)); } function test_bisect_whenAsserterTimedOut_reverts() external { uint256 outputIndex = targetOutputIndex; _createChallenge(outputIndex, challenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); assertEq(nextSender(challenge), challenge.asserter); - uint256 segLen = colosseum.getSegmentsLength(challenge.turn + 1); + uint256 segLen = colosseum.segmentsLengths(challenge.turn); vm.warp(challenge.timeoutAt + 1); vm.prank(challenge.asserter); - vm.expectRevert("Colosseum: not your turn"); + vm.expectRevert(Colosseum.NotAllowedCaller.selector); colosseum.bisect(outputIndex, challenge.challenger, 0, new bytes32[](segLen)); assertEq( @@ -537,20 +614,20 @@ contract ColosseumTest is Colosseum_Initializer { function test_bisect_whenChallengerTimedOut_reverts() external { uint256 outputIndex = targetOutputIndex; _createChallenge(outputIndex, challenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); assertEq(nextSender(challenge), challenge.asserter); _bisect(outputIndex, challenge.challenger, challenge.asserter); // update challenge - challenge = colosseum.getChallenge(outputIndex, challenge.challenger); + challenge = mockColosseum.getChallenge(outputIndex, challenge.challenger); - uint256 segLen = colosseum.getSegmentsLength(challenge.turn + 1); + uint256 segLen = colosseum.segmentsLengths(challenge.turn); vm.warp(challenge.timeoutAt + 1); vm.prank(challenge.challenger); - vm.expectRevert("Colosseum: not your turn"); + vm.expectRevert(Colosseum.NotAllowedCaller.selector); colosseum.bisect(outputIndex, challenge.challenger, 0, new bytes32[](segLen)); assertEq( @@ -564,7 +641,7 @@ contract ColosseumTest is Colosseum_Initializer { address otherChallenger = _newChallenger("other challenger"); _createChallenge(outputIndex, otherChallenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, otherChallenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, otherChallenger); // Make it the challenger turn _bisect(outputIndex, otherChallenger, challenge.asserter); @@ -588,13 +665,32 @@ contract ColosseumTest is Colosseum_Initializer { assertEq(pool.balanceOf(otherChallenger), prevDeposit + pendingBond); } - function test_proveFault_succeeds() public { + function test_bisect_cancelChallenge_senderNotChallenger_reverts() external { uint256 outputIndex = targetOutputIndex; + address otherChallenger = _newChallenger("other challenger"); + + _createChallenge(outputIndex, otherChallenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, otherChallenger); + // Make it the challenger turn + _bisect(outputIndex, otherChallenger, challenge.asserter); + + // The output root of the target output index was replaced by another challenge. + test_proveFault_succeeds(); + + vm.prank(challenger); + vm.expectRevert(Colosseum.OnlyChallengerCanCancel.selector); + colosseum.bisect(outputIndex, otherChallenger, 0, new bytes32[](0)); + } + + function test_proveFault_succeeds() public returns (bytes32 publicInputHash) { + uint256 outputIndex = targetOutputIndex; + Types.CheckpointOutput memory targetOutput = oracle.getL2Output(outputIndex); + _createChallenge(outputIndex, challenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); - while (colosseum.isAbleToBisect(outputIndex, challenge.challenger)) { - challenge = colosseum.getChallenge(outputIndex, challenge.challenger); + while (mockColosseum.isAbleToBisect(outputIndex, challenge.challenger)) { + challenge = mockColosseum.getChallenge(outputIndex, challenge.challenger); _bisect(outputIndex, challenge.challenger, nextSender(challenge)); } @@ -603,16 +699,24 @@ contract ColosseumTest is Colosseum_Initializer { uint256(Colosseum.ChallengeStatus.READY_TO_PROVE) ); - _proveFault(outputIndex, challenge.challenger); + publicInputHash = _proveFault(outputIndex, challenge.challenger); + + (, bytes32 outputRoot, , ) = colosseum.deletedOutputs(outputIndex); + assertEq(outputRoot, targetOutput.outputRoot); + assertTrue(colosseum.verifiedPublicInputs(publicInputHash)); + assertEq( + uint256(colosseum.getStatus(outputIndex, challenger)), + uint256(Colosseum.ChallengeStatus.NONE) + ); } function test_proveFault_finalizedOutput_reverts() external { uint256 outputIndex = targetOutputIndex; _createChallenge(outputIndex, challenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); - while (colosseum.isAbleToBisect(outputIndex, challenge.challenger)) { - challenge = colosseum.getChallenge(outputIndex, challenge.challenger); + while (mockColosseum.isAbleToBisect(outputIndex, challenge.challenger)) { + challenge = mockColosseum.getChallenge(outputIndex, challenge.challenger); _bisect(outputIndex, challenge.challenger, nextSender(challenge)); } @@ -624,9 +728,7 @@ contract ColosseumTest is Colosseum_Initializer { Types.CheckpointOutput memory targetOutput = oracle.getL2Output(outputIndex); vm.warp(targetOutput.timestamp + oracle.FINALIZATION_PERIOD_SECONDS() + 1); - vm.expectRevert( - "Colosseum: cannot progress challenge process about already finalized output" - ); + vm.expectRevert(Colosseum.OutputAlreadyFinalized.selector); _doProveFault(challenger, outputIndex, 0); } @@ -636,7 +738,7 @@ contract ColosseumTest is Colosseum_Initializer { // // _createChallenge(outputIndex, challenger); // - // Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + // Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); // // assertEq(nextSender(challenge), challenge.asserter); // @@ -655,9 +757,9 @@ contract ColosseumTest is Colosseum_Initializer { address otherChallenger = _newChallenger("other challenger"); _createChallenge(outputIndex, otherChallenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, otherChallenger); - while (colosseum.isAbleToBisect(outputIndex, otherChallenger)) { - challenge = colosseum.getChallenge(outputIndex, otherChallenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, otherChallenger); + while (mockColosseum.isAbleToBisect(outputIndex, otherChallenger)) { + challenge = mockColosseum.getChallenge(outputIndex, otherChallenger); _bisect(outputIndex, otherChallenger, nextSender(challenge)); } @@ -686,7 +788,7 @@ contract ColosseumTest is Colosseum_Initializer { uint256 outputIndex = targetOutputIndex; Types.CheckpointOutput memory output = oracle.getL2Output(outputIndex); - test_proveFault_succeeds(); + bytes32 publicInputHash = test_proveFault_succeeds(); Types.CheckpointOutput memory newOutput = oracle.getL2Output(outputIndex); vm.prank(address(securityCouncil)); @@ -695,34 +797,126 @@ contract ColosseumTest is Colosseum_Initializer { newOutput.submitter, output.submitter, output.outputRoot, - bytes32(0) + publicInputHash ); + + (, bytes32 outputRoot, , ) = colosseum.deletedOutputs(outputIndex); + assertEq(outputRoot, bytes32(0)); + assertFalse(colosseum.verifiedPublicInputs(publicInputHash)); } function test_dismissChallenge_notSecurityCouncil_reverts() external { test_proveFault_succeeds(); vm.prank(makeAddr("not_security_council")); - vm.expectRevert("Colosseum: sender is not the security council"); + vm.expectRevert(Colosseum.NotAllowedCaller.selector); colosseum.dismissChallenge(0, address(0), address(0), bytes32(0), bytes32(0)); } function test_dismissChallenge_outputNotDeleted_reverts() external { vm.prank(address(securityCouncil)); - vm.expectRevert("Colosseum: cannot rollback output to zero hash"); + vm.expectRevert(Colosseum.OutputNotDeleted.selector); + colosseum.dismissChallenge( + targetOutputIndex, + address(0), + address(0), + bytes32(0), + bytes32(0) + ); + } + + function test_dismissChallenge_finalizedOutput_reverts() external { + uint256 outputIndex = targetOutputIndex; + _createChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); + + while (mockColosseum.isAbleToBisect(outputIndex, challenge.challenger)) { + challenge = mockColosseum.getChallenge(outputIndex, challenge.challenger); + _bisect(outputIndex, challenge.challenger, nextSender(challenge)); + } + + Types.CheckpointOutput memory targetOutput = oracle.getL2Output(outputIndex); + vm.warp(targetOutput.timestamp + oracle.FINALIZATION_PERIOD_SECONDS() + 1); + + vm.prank(address(securityCouncil)); + vm.expectRevert(Colosseum.OutputAlreadyFinalized.selector); colosseum.dismissChallenge(0, address(0), address(0), bytes32(0), bytes32(0)); } + function test_dismissChallenge_invalidOutputGiven_reverts() external { + uint256 outputIndex = targetOutputIndex; + Types.CheckpointOutput memory output = oracle.getL2Output(outputIndex); + + bytes32 publicInputHash = test_proveFault_succeeds(); + Types.CheckpointOutput memory newOutput = oracle.getL2Output(outputIndex); + + vm.prank(address(securityCouncil)); + vm.expectRevert(Colosseum.InvalidOutputGiven.selector); + colosseum.dismissChallenge( + outputIndex, + newOutput.submitter, + output.submitter, + bytes32(0), + publicInputHash + ); + } + + function test_dismissChallenge_invalidAddressGiven_reverts() external { + uint256 outputIndex = targetOutputIndex; + Types.CheckpointOutput memory output = oracle.getL2Output(outputIndex); + + bytes32 publicInputHash = test_proveFault_succeeds(); + Types.CheckpointOutput memory newOutput = oracle.getL2Output(outputIndex); + + vm.prank(address(securityCouncil)); + vm.expectRevert(Colosseum.InvalidAddressGiven.selector); + colosseum.dismissChallenge( + outputIndex, + address(0), + output.submitter, + output.outputRoot, + publicInputHash + ); + + vm.prank(address(securityCouncil)); + vm.expectRevert(Colosseum.InvalidAddressGiven.selector); + colosseum.dismissChallenge( + outputIndex, + newOutput.submitter, + address(0), + output.outputRoot, + publicInputHash + ); + } + + function test_dismissChallenge_invalidPublicInput_reverts() external { + uint256 outputIndex = targetOutputIndex; + Types.CheckpointOutput memory output = oracle.getL2Output(outputIndex); + + test_proveFault_succeeds(); + Types.CheckpointOutput memory newOutput = oracle.getL2Output(outputIndex); + + vm.prank(address(securityCouncil)); + vm.expectRevert(Colosseum.InvalidPublicInput.selector); + colosseum.dismissChallenge( + outputIndex, + newOutput.submitter, + output.submitter, + output.outputRoot, + bytes32(0) + ); + } + function test_challengerTimeout_succeeds() public { uint256 outputIndex = targetOutputIndex; _createChallenge(outputIndex, challenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); assertEq(nextSender(challenge), challenge.asserter); _bisect(outputIndex, challenge.challenger, challenge.asserter); - challenge = colosseum.getChallenge(outputIndex, challenge.challenger); + challenge = mockColosseum.getChallenge(outputIndex, challenge.challenger); vm.warp(challenge.timeoutAt + 1); // check the challenger timeout assertEq(nextSender(challenge), challenge.challenger); @@ -738,7 +932,7 @@ contract ColosseumTest is Colosseum_Initializer { function test_challengerNotCloseWhenAsserterTimeout_succeeds() external { uint256 outputIndex = targetOutputIndex; _createChallenge(outputIndex, challenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); assertEq(nextSender(challenge), challenge.asserter); @@ -790,7 +984,7 @@ contract ColosseumTest is Colosseum_Initializer { } function test_cancelChallenge_noChallenge_reverts() external { - vm.expectRevert("Colosseum: the challenge does not exist"); + vm.expectRevert(Colosseum.CannotCancelChallenge.selector); colosseum.cancelChallenge(0); } @@ -800,7 +994,7 @@ contract ColosseumTest is Colosseum_Initializer { _createChallenge(outputIndex, challenger); vm.prank(challenger); - vm.expectRevert("Colosseum: challenge cannot be cancelled"); + vm.expectRevert(Colosseum.CannotCancelChallenge.selector); colosseum.cancelChallenge(outputIndex); } @@ -814,7 +1008,7 @@ contract ColosseumTest is Colosseum_Initializer { test_proveFault_succeeds(); vm.prank(challenger); - vm.expectRevert("Colosseum: the challenge does not exist"); + vm.expectRevert(Colosseum.OnlyChallengerCanCancel.selector); colosseum.cancelChallenge(outputIndex); } @@ -823,7 +1017,7 @@ contract ColosseumTest is Colosseum_Initializer { address otherChallenger = _newChallenger("other challenger"); _createChallenge(outputIndex, otherChallenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, otherChallenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, otherChallenger); _bisect(outputIndex, otherChallenger, challenge.asserter); vm.warp(challenge.timeoutAt + 1); @@ -831,7 +1025,7 @@ contract ColosseumTest is Colosseum_Initializer { test_proveFault_succeeds(); vm.prank(otherChallenger); - vm.expectRevert("Colosseum: challenge cannot be cancelled if challenger timed out"); + vm.expectRevert(Colosseum.ImproperChallengeStatusToCancel.selector); colosseum.cancelChallenge(outputIndex); } @@ -840,10 +1034,10 @@ contract ColosseumTest is Colosseum_Initializer { _createChallenge(outputIndex, challenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); - while (colosseum.isAbleToBisect(outputIndex, challenge.challenger)) { - challenge = colosseum.getChallenge(outputIndex, challenge.challenger); + while (mockColosseum.isAbleToBisect(outputIndex, challenge.challenger)) { + challenge = mockColosseum.getChallenge(outputIndex, challenge.challenger); _bisect(outputIndex, challenge.challenger, nextSender(challenge)); } @@ -855,7 +1049,7 @@ contract ColosseumTest is Colosseum_Initializer { uint256 outputIndex = targetOutputIndex; vm.prank(address(1)); - vm.expectRevert("Colosseum: sender is not the security council"); + vm.expectRevert(Colosseum.NotAllowedCaller.selector); colosseum.forceDeleteOutput(outputIndex); } @@ -864,19 +1058,17 @@ contract ColosseumTest is Colosseum_Initializer { _createChallenge(outputIndex, challenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); - while (colosseum.isAbleToBisect(outputIndex, challenge.challenger)) { - challenge = colosseum.getChallenge(outputIndex, challenge.challenger); + while (mockColosseum.isAbleToBisect(outputIndex, challenge.challenger)) { + challenge = mockColosseum.getChallenge(outputIndex, challenge.challenger); _bisect(outputIndex, challenge.challenger, nextSender(challenge)); } vm.warp(oracle.finalizedAt(outputIndex) + 1); vm.prank(address(securityCouncil)); - vm.expectRevert( - "Colosseum: cannot progress challenge process about already finalized output" - ); + vm.expectRevert(Colosseum.OutputAlreadyFinalized.selector); colosseum.forceDeleteOutput(outputIndex); } @@ -885,10 +1077,10 @@ contract ColosseumTest is Colosseum_Initializer { _createChallenge(outputIndex, challenger); - Types.Challenge memory challenge = colosseum.getChallenge(outputIndex, challenger); + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, challenger); - while (colosseum.isAbleToBisect(outputIndex, challenge.challenger)) { - challenge = colosseum.getChallenge(outputIndex, challenge.challenger); + while (mockColosseum.isAbleToBisect(outputIndex, challenge.challenger)) { + challenge = mockColosseum.getChallenge(outputIndex, challenge.challenger); _bisect(outputIndex, challenge.challenger, nextSender(challenge)); } @@ -896,7 +1088,7 @@ contract ColosseumTest is Colosseum_Initializer { colosseum.forceDeleteOutput(outputIndex); vm.prank(address(securityCouncil)); - vm.expectRevert("Colosseum: the output has already been deleted"); + vm.expectRevert(Colosseum.OutputAlreadyDeleted.selector); colosseum.forceDeleteOutput(outputIndex); } @@ -911,3 +1103,396 @@ contract ColosseumTest is Colosseum_Initializer { assertEq(colosseum.isInCreationPeriod(outputIndex), false); } } + +contract Colosseum_ValidatorSystemUpgrade_Test is Colosseum_Initializer { + MockColosseum mockColosseum; + MockL2OutputOracle mockOracle; + uint256 internal targetOutputIndex; + + function setUp() public override { + super.setUp(); + + MockColosseum mockColosseumImpl = new MockColosseum( + oracle, + zkVerifier, + submissionInterval, + creationPeriodSeconds, + bisectionTimeout, + provingTimeout, + DUMMY_HASH, + MAX_TXS, + segmentsLengths, + address(securityCouncil), + address(zkMerkleTrie) + ); + vm.prank(multisig); + Proxy(payable(address(colosseum))).upgradeTo(address(mockColosseumImpl)); + mockColosseum = MockColosseum(address(colosseum)); + + address oracleAddress = address(oracle); + MockL2OutputOracle mockOracleImpl = new MockL2OutputOracle( + pool, + valMgr, + address(colosseum), + submissionInterval, + l2BlockTime, + startingBlockNumber, + startingTimestamp, + finalizationPeriodSeconds + ); + vm.prank(multisig); + Proxy(payable(oracleAddress)).upgradeTo(address(mockOracleImpl)); + mockOracle = MockL2OutputOracle(oracleAddress); + + // Deploy ValidatorPool with new argument + terminateOutputIndex = 0; + poolImpl = new ValidatorPool({ + _l2OutputOracle: oracle, + _portal: mockPortal, + _securityCouncil: guardian, + _trustedValidator: trusted, + _requiredBondAmount: requiredBondAmount, + _maxUnbond: maxUnbond, + _roundDuration: roundDuration, + _terminateOutputIndex: terminateOutputIndex + }); + vm.prank(multisig); + Proxy(payable(address(pool))).upgradeTo(address(poolImpl)); + + // Submit outputs until ValidatorPool is terminated + vm.prank(trusted); + pool.deposit{ value: trusted.balance }(); + for (uint256 i; i <= terminateOutputIndex; i++) { + _submitL2OutputV1(); + } + + // Only trusted validator can submit the first output with ValidatorManager + _registerValidator(trusted, minActivateAmount); + + // Submit invalid output as asserter + uint256 nextBlockNumber = oracle.nextBlockNumber(); + warpToSubmitTime(); + vm.prank(valMgr.nextValidator()); + oracle.submitL2Output(keccak256(abi.encode()), nextBlockNumber, 0, 0); + + // To create challenge, challenger also registers validator + _registerValidator(challenger, minActivateAmount); + + targetOutputIndex = oracle.latestOutputIndex(); + } + + function _nextSender(Types.Challenge memory challenge) private pure returns (address) { + return challenge.turn % 2 == 0 ? challenge.challenger : challenge.asserter; + } + + function _getOutputRoot(address sender, uint256 blockNumber) private view returns (bytes32) { + uint256 targetBlockNumber = ColosseumTestData.INVALID_BLOCK_NUMBER; + if (blockNumber == targetBlockNumber - 1) { + return ColosseumTestData.PREV_OUTPUT_ROOT; + } + + // If asserter, wrong output after targetBlockNumber + if (sender == trusted) { + if (blockNumber < targetBlockNumber - 1) { + return keccak256(abi.encode(blockNumber)); + } else { + return keccak256(abi.encode()); + } + } + + // If challenger, correct output always + if (blockNumber == targetBlockNumber) { + return ColosseumTestData.TARGET_OUTPUT_ROOT; + } else { + return keccak256(abi.encode(blockNumber)); + } + } + + function _newSegments( + address sender, + uint8 turn, + uint256 segStart, + uint256 segSize + ) private view returns (bytes32[] memory) { + uint256 segLen = colosseum.segmentsLengths(turn - 1); + + bytes32[] memory arr = new bytes32[](segLen); + + for (uint256 i = 0; i < segLen; i++) { + uint256 n = segStart + i * (segSize / (segLen - 1)); + arr[i] = _getOutputRoot(sender, n); + } + + return arr; + } + + function _getFirstSegments() private view returns (bytes32[] memory) { + Types.CheckpointOutput memory targetOutput = oracle.getL2Output(targetOutputIndex); + uint256 end = targetOutput.l2BlockNumber; + uint256 start = end - oracle.SUBMISSION_INTERVAL(); + + bytes32[] memory segments = _newSegments(challenger, 1, start, end - start); + + return segments; + } + + function _bisect(uint256 outputIndex, address _challenger, address sender) private { + Types.Challenge memory challenge = mockColosseum.getChallenge(outputIndex, _challenger); + + uint256 position = _detectFault(challenge, sender); + uint256 segSize = challenge.segSize / (colosseum.segmentsLengths(challenge.turn - 1) - 1); + uint256 segStart = challenge.segStart + position * segSize; + + bytes32[] memory segments = _newSegments(sender, challenge.turn + 1, segStart, segSize); + + vm.prank(sender); + colosseum.bisect(outputIndex, challenge.challenger, position, segments); + } + + function _detectFault( + Types.Challenge memory challenge, + address sender + ) private view returns (uint256) { + if (sender == challenge.challenger && sender != _nextSender(challenge)) { + return 0; + } + + uint256 segLen = colosseum.segmentsLengths(challenge.turn - 1); + uint256 start = challenge.segStart; + uint256 degree = challenge.segSize / (segLen - 1); + uint256 current = start + degree; + + for (uint256 i = 1; i < segLen; i++) { + bytes32 output = _getOutputRoot(sender, current); + + if (challenge.segments[i] != output) { + return i - 1; + } + + current += degree; + } + + revert("failed to select faulty position"); + } + + function _getProof() + private + pure + returns (ColosseumTestData.ProofPair memory, Types.PublicInputProof memory) + { + ( + Types.OutputRootProof memory srcOutputRootProof, + Types.OutputRootProof memory dstOutputRootProof + ) = ColosseumTestData.outputRootProof(); + Types.PublicInput memory publicInput = ColosseumTestData.publicInput(); + Types.BlockHeaderRLP memory rlps = ColosseumTestData.blockHeaderRLP(); + ColosseumTestData.ProofPair memory pp = ColosseumTestData.proofAndPair(); + (ColosseumTestData.Account memory account, bytes[] memory merkleProof) = ColosseumTestData + .merkleProof(); + + Types.PublicInputProof memory proof = Types.PublicInputProof({ + srcOutputRootProof: srcOutputRootProof, + dstOutputRootProof: dstOutputRootProof, + publicInput: publicInput, + rlps: rlps, + l2ToL1MessagePasserBalance: bytes32(account.balance), + l2ToL1MessagePasserCodeHash: account.codeHash, + merkleProof: merkleProof + }); + + return (pp, proof); + } + + function test_createChallenge_callValidatorManager_succeeds() public { + bytes32[] memory segments = _getFirstSegments(); + + vm.expectCall( + address(valMgr), + abi.encodeWithSelector(IValidatorManager.isActive.selector, challenger) + ); + vm.prank(challenger); + colosseum.createChallenge(targetOutputIndex, bytes32(0), 0, segments); + + assertEq(assetMgr.totalValidatorKroBonded(challenger), bondAmount); + } + + function test_createChallenge_notSatisfyCondition_reverts() external { + bytes32[] memory segments = _getFirstSegments(); + + vm.expectRevert(IValidatorManager.ImproperValidatorStatus.selector); + vm.prank(makeAddr("other challenger")); + colosseum.createChallenge(targetOutputIndex, bytes32(0), 0, segments); + } + + function test_proveFault_callValidatorManager_succeeds() + public + returns (bytes32 publicInputHash) + { + test_createChallenge_callValidatorManager_succeeds(); + + Types.Challenge memory challenge = mockColosseum.getChallenge( + targetOutputIndex, + challenger + ); + uint128 beforeAsserterKro = assetMgr.totalValidatorKro(challenge.asserter); + + while (mockColosseum.isAbleToBisect(targetOutputIndex, challenger)) { + _bisect(targetOutputIndex, challenger, _nextSender(challenge)); + challenge = mockColosseum.getChallenge(targetOutputIndex, challenger); + } + + (ColosseumTestData.ProofPair memory pp, Types.PublicInputProof memory proof) = _getProof(); + + uint256 position = _detectFault(challenge, challenge.challenger); + + vm.expectCall( + address(valMgr), + abi.encodeWithSelector( + IValidatorManager.slash.selector, + targetOutputIndex, + challenger, + challenge.asserter + ) + ); + vm.prank(challenger); + colosseum.proveFault(targetOutputIndex, position, proof, pp.proof, pp.pair); + + publicInputHash = mockColosseum.hashPublicInput(proof); + + assertEq(assetMgr.totalValidatorKro(challenge.asserter), beforeAsserterKro - bondAmount); + assertEq(assetMgr.totalValidatorKro(challenger), minActivateAmount); + } + + function test_dismissChallenge_callValidatorManager_succeeds() external { + Types.CheckpointOutput memory output = oracle.getL2Output(targetOutputIndex); + uint128 beforeAsserterKro = assetMgr.totalValidatorKro(output.submitter); + + bytes32 publicInputHash = test_proveFault_callValidatorManager_succeeds(); + + vm.expectCall( + address(valMgr), + abi.encodeWithSelector( + IValidatorManager.revertSlash.selector, + targetOutputIndex, + output.submitter + ) + ); + vm.expectCall( + address(valMgr), + abi.encodeWithSelector( + IValidatorManager.slash.selector, + targetOutputIndex, + output.submitter, + challenger + ) + ); + vm.prank(address(securityCouncil)); + colosseum.dismissChallenge( + targetOutputIndex, + challenger, + output.submitter, + output.outputRoot, + publicInputHash + ); + + assertEq(assetMgr.totalValidatorKro(output.submitter), beforeAsserterKro); + assertEq(assetMgr.totalValidatorKro(challenger), minActivateAmount - bondAmount); + + // check if original output submitter gets output reward + challenge reward + uint128 tax = (bondAmount * assetMgr.TAX_NUMERATOR()) / assetMgr.TAX_DENOMINATOR(); + uint128 challengeReward = bondAmount - tax; + + mockOracle.mockSetNextFinalizeOutputIndex(terminateOutputIndex + 1); + vm.warp(oracle.finalizedAt(targetOutputIndex)); + _submitL2OutputV2(false); + + assertEq( + assetMgr.reflectiveWeight(output.submitter), + minActivateAmount + baseReward + challengeReward + ); + } + + function test_forceDeleteOutput_callValidatorManager_succeeds() external { + test_createChallenge_callValidatorManager_succeeds(); + + Types.Challenge memory challenge = mockColosseum.getChallenge( + targetOutputIndex, + challenger + ); + uint128 beforeAsserterKro = assetMgr.totalValidatorKro(challenge.asserter); + + while (mockColosseum.isAbleToBisect(targetOutputIndex, challenger)) { + _bisect(targetOutputIndex, challenger, _nextSender(challenge)); + challenge = mockColosseum.getChallenge(targetOutputIndex, challenger); + } + + vm.expectCall( + address(valMgr), + abi.encodeWithSelector( + IValidatorManager.slash.selector, + targetOutputIndex, + securityCouncil, + challenge.asserter + ) + ); + vm.prank(address(securityCouncil)); + colosseum.forceDeleteOutput(targetOutputIndex); + + assertEq(assetMgr.totalValidatorKro(challenge.asserter), beforeAsserterKro - bondAmount); + assertEq(assetMgr.totalValidatorKro(challenger), minActivateAmount); + } + + function test_cancelChallenge_callValidatorManager_succeeds() external { + address otherChallenger = asserter; + _registerValidator(asserter, minActivateAmount); + + bytes32[] memory segments = _getFirstSegments(); + vm.prank(otherChallenger); + colosseum.createChallenge(targetOutputIndex, bytes32(0), 0, segments); + + test_proveFault_callValidatorManager_succeeds(); + + vm.expectCall( + address(valMgr), + abi.encodeWithSelector(IValidatorManager.unbondValidatorKro.selector, otherChallenger) + ); + vm.prank(otherChallenger); + colosseum.cancelChallenge(targetOutputIndex); + + assertEq(assetMgr.totalValidatorKroBonded(otherChallenger), 0); + } + + function test_challengerTimeout_callValidatorManager_succeeds() external { + test_createChallenge_callValidatorManager_succeeds(); + + Types.Challenge memory challenge = mockColosseum.getChallenge( + targetOutputIndex, + challenger + ); + _bisect(targetOutputIndex, challenger, challenge.asserter); + + challenge = mockColosseum.getChallenge(targetOutputIndex, challenger); + vm.warp(challenge.timeoutAt + 1); + + // check the challenger timeout + assertEq(_nextSender(challenge), challenger); + assertTrue( + colosseum.getStatus(targetOutputIndex, challenger) == + Colosseum.ChallengeStatus.CHALLENGER_TIMEOUT + ); + + vm.expectCall( + address(valMgr), + abi.encodeWithSelector( + IValidatorManager.slash.selector, + targetOutputIndex, + challenge.asserter, + challenger + ) + ); + vm.prank(challenge.asserter); + colosseum.challengerTimeout(targetOutputIndex, challenger); + + assertEq(assetMgr.totalValidatorKro(challenger), minActivateAmount - bondAmount); + } +} diff --git a/packages/contracts/contracts/test/CommonTest.t.sol b/packages/contracts/contracts/test/CommonTest.t.sol index 574f5968ab..e9256162fa 100644 --- a/packages/contracts/contracts/test/CommonTest.t.sol +++ b/packages/contracts/contracts/test/CommonTest.t.sol @@ -4,13 +4,18 @@ pragma solidity 0.8.15; /* Testing utilities */ import { Strings } from "@openzeppelin/contracts/utils/Strings.sol"; import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import { ERC721 } from "@openzeppelin/contracts/token/ERC721/ERC721.sol"; +import { IERC721 } from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; -import { Test, StdUtils } from "forge-std/Test.sol"; +import { Test } from "forge-std/Test.sol"; import { SecurityCouncilToken } from "../governance/SecurityCouncilToken.sol"; import { TimeLock } from "../governance/TimeLock.sol"; import { UpgradeGovernor } from "../governance/UpgradeGovernor.sol"; +import { AssetManager } from "../L1/AssetManager.sol"; import { Colosseum } from "../L1/Colosseum.sol"; +import { IValidatorManager } from "../L1/interfaces/IValidatorManager.sol"; import { KromaPortal } from "../L1/KromaPortal.sol"; import { L1CrossDomainMessenger } from "../L1/L1CrossDomainMessenger.sol"; import { L1ERC721Bridge } from "../L1/L1ERC721Bridge.sol"; @@ -18,6 +23,7 @@ import { L1StandardBridge } from "../L1/L1StandardBridge.sol"; import { L2OutputOracle } from "../L1/L2OutputOracle.sol"; import { SecurityCouncil } from "../L1/SecurityCouncil.sol"; import { ValidatorPool } from "../L1/ValidatorPool.sol"; +import { ValidatorManager } from "../L1/ValidatorManager.sol"; import { ResourceMetering } from "../L1/ResourceMetering.sol"; import { SystemConfig } from "../L1/SystemConfig.sol"; import { ZKMerkleTrie } from "../L1/ZKMerkleTrie.sol"; @@ -32,9 +38,7 @@ import { Predeploys } from "../libraries/Predeploys.sol"; import { Types } from "../libraries/Types.sol"; import { KromaMintableERC20 } from "../universal/KromaMintableERC20.sol"; import { KromaMintableERC20Factory } from "../universal/KromaMintableERC20Factory.sol"; -import { KromaMintableERC721Factory } from "../universal/KromaMintableERC721Factory.sol"; import { Proxy } from "../universal/Proxy.sol"; -import { ProxyAdmin } from "../universal/ProxyAdmin.sol"; import { AddressAliasHelper } from "../vendor/AddressAliasHelper.sol"; contract CommonTest is Test { @@ -101,7 +105,6 @@ contract CommonTest is Test { } contract UpgradeGovernor_Initializer is CommonTest { - address superAdmin = makeAddr("superAdmin"); address owner = makeAddr("owner"); // Constructor arguments @@ -175,14 +178,35 @@ contract UpgradeGovernor_Initializer is CommonTest { } } +contract MockKro is ERC20 { + constructor() ERC20("Kroma", "KRO") {} + + function mint(address to, uint256 amount) external { + _mint(to, amount); + } +} + +contract MockKgh is ERC721 { + constructor() ERC721("Test", "TST") {} + + function mint(address to, uint256 tokenId) external { + _mint(to, tokenId); + } +} + contract L2OutputOracle_Initializer is UpgradeGovernor_Initializer { // Test target ValidatorPool pool; ValidatorPool poolImpl; + AssetManager assetMgr; + AssetManager assetMgrImpl; + ValidatorManager valMgr; + ValidatorManager valMgrImpl; L2OutputOracle oracle; L2OutputOracle oracleImpl; Colosseum colosseum; SystemConfig systemConfig; + KromaPortal mockPortal; L2ToL1MessagePasser messagePasser = L2ToL1MessagePasser(payable(Predeploys.L2_TO_L1_MESSAGE_PASSER)); @@ -192,6 +216,7 @@ contract L2OutputOracle_Initializer is UpgradeGovernor_Initializer { uint256 internal l2BlockTime = 2; uint256 internal startingBlockNumber = 10; uint256 internal startingTimestamp = 1000; + uint256 internal finalizationPeriodSeconds = 7 days; address internal guardian = 0x000000000000000000000000000000000000AaaD; // ValidatorPool constructor arguments @@ -199,10 +224,31 @@ contract L2OutputOracle_Initializer is UpgradeGovernor_Initializer { uint256 internal requiredBondAmount = 0.1 ether; uint256 internal maxUnbond = 2; uint256 internal roundDuration = (submissionInterval * l2BlockTime) / 2; + uint256 internal terminateOutputIndex = 300; // just large enough value, set again in upgrade test + + // AssetManager constructor arguments + MockKro assetToken; + MockKgh kgh; + address internal validatorRewardVault = makeAddr("validatorRewardVault"); + uint128 internal minDelegationPeriod = 7 days; + uint128 internal bondAmount = 10e18; + + // ValidatorManager constructor arguments + uint128 internal commissionChangeDelaySeconds = 7 days; + uint128 internal softJailPeriodSeconds = 3 days; + uint128 internal hardJailPeriodSeconds = 7 days; + uint128 internal jailThreshold = 2; + uint128 internal maxOutputFinalizations = 10; + uint128 internal baseReward = 20e18; + uint128 internal minRegisterAmount = 10e18; + uint128 internal minActivateAmount = 100e18; + IValidatorManager.ConstructorParams constructorParams; // Test data address internal asserter = 0x000000000000000000000000000000000000aAaB; address internal challenger = 0x000000000000000000000000000000000000AAaC; + address internal withdrawAcc = 0x000000000000000000000000000000000000AAaE; + address internal delegator = 0x000000000000000000000000000000000000AAAF; uint256 initL1Time; event OutputSubmitted( @@ -212,16 +258,33 @@ contract L2OutputOracle_Initializer is UpgradeGovernor_Initializer { uint256 l1Timestamp ); - event OutputReplaced(uint256 indexed outputIndex, bytes32 newOutputRoot); + event OutputReplaced( + uint256 indexed outputIndex, + address indexed newSubmitter, + bytes32 newOutputRoot + ); // Advance the evm's time to meet the L2OutputOracle's requirements for submitL2Output - function warpToSubmitTime(uint256 _nextBlockNumber) public { - vm.warp(oracle.computeL2Timestamp(_nextBlockNumber + 1)); + function warpToSubmitTime() public { + vm.warp(oracle.nextOutputMinL2Timestamp()); } function setUp() public virtual override { super.setUp(); + // Set up asset token and give actors some amount + assetToken = new MockKro(); + assetToken.mint(trusted, minActivateAmount * 10); + assetToken.mint(asserter, minActivateAmount * 10); + assetToken.mint(challenger, minActivateAmount * 10); + assetToken.mint(delegator, minActivateAmount * 10); + // Set up validatorRewardVault + assetToken.mint(validatorRewardVault, baseReward * 1000); + + // Set up KGH + kgh = new MockKgh(); + + // Give actors some ETH vm.deal(trusted, requiredBondAmount * 10); vm.deal(asserter, requiredBondAmount * 10); vm.deal(challenger, requiredBondAmount * 10); @@ -229,9 +292,17 @@ contract L2OutputOracle_Initializer is UpgradeGovernor_Initializer { // Deploy proxies pool = ValidatorPool(address(new Proxy(multisig))); vm.label(address(pool), "ValidatorPool"); + assetMgr = AssetManager(address(new Proxy(multisig))); + vm.label(address(assetMgr), "AssetManager"); + valMgr = ValidatorManager(address(new Proxy(multisig))); + vm.label(address(valMgr), "ValidatorManager"); oracle = L2OutputOracle(address(new Proxy(multisig))); vm.label(address(oracle), "L2OutputOracle"); + // Allow AssetManager contract can get asset token from validatorRewardVault + vm.prank(validatorRewardVault); + assetToken.approve(address(assetMgr), baseReward * 1000); + ResourceMetering.ResourceConfig memory config = Constants.DEFAULT_RESOURCE_CONFIG(); systemConfig = new SystemConfig({ _owner: address(1), @@ -245,7 +316,7 @@ contract L2OutputOracle_Initializer is UpgradeGovernor_Initializer { }); // Mock KromaPortal - KromaPortal mockPortal = new KromaPortal({ + mockPortal = new KromaPortal({ _l2Oracle: oracle, _validatorPool: address(pool), _guardian: guardian, @@ -262,9 +333,38 @@ contract L2OutputOracle_Initializer is UpgradeGovernor_Initializer { _trustedValidator: trusted, _requiredBondAmount: requiredBondAmount, _maxUnbond: maxUnbond, - _roundDuration: roundDuration + _roundDuration: roundDuration, + _terminateOutputIndex: terminateOutputIndex }); + // Deploy the AssetManager + assetMgrImpl = new AssetManager({ + _assetToken: IERC20(assetToken), + _kgh: IERC721(kgh), + _securityCouncil: guardian, + _validatorRewardVault: validatorRewardVault, + _validatorManager: valMgr, + _minDelegationPeriod: minDelegationPeriod, + _bondAmount: bondAmount + }); + + // Deploy the ValidatorManager + constructorParams = IValidatorManager.ConstructorParams({ + _l2Oracle: oracle, + _assetManager: assetMgr, + _trustedValidator: trusted, + _commissionChangeDelaySeconds: commissionChangeDelaySeconds, + _roundDurationSeconds: uint128(roundDuration), + _softJailPeriodSeconds: softJailPeriodSeconds, + _hardJailPeriodSeconds: hardJailPeriodSeconds, + _jailThreshold: jailThreshold, + _maxOutputFinalizations: maxOutputFinalizations, + _baseReward: baseReward, + _minRegisterAmount: minRegisterAmount, + _minActivateAmount: minActivateAmount + }); + valMgrImpl = new ValidatorManager({ _constructorParams: constructorParams }); + // By default the first block has timestamp and number zero, which will cause underflows in // the tests, so we'll move forward to these block values. initL1Time = startingTimestamp + 1; @@ -273,20 +373,27 @@ contract L2OutputOracle_Initializer is UpgradeGovernor_Initializer { // Deploy the L2OutputOracle oracleImpl = new L2OutputOracle({ _validatorPool: pool, + _validatorManager: valMgr, _colosseum: address(colosseum), _submissionInterval: submissionInterval, _l2BlockTime: l2BlockTime, _startingBlockNumber: startingBlockNumber, _startingTimestamp: startingTimestamp, - _finalizationPeriodSeconds: 7 days + _finalizationPeriodSeconds: finalizationPeriodSeconds }); vm.prank(multisig); Proxy(payable(address(pool))).upgradeToAndCall( address(poolImpl), - abi.encodeWithSelector(ValidatorPool.initialize.selector, false) + abi.encodeWithSelector(ValidatorPool.initialize.selector) ); + vm.prank(multisig); + Proxy(payable(address(assetMgr))).upgradeTo(address(assetMgrImpl)); + + vm.prank(multisig); + Proxy(payable(address(valMgr))).upgradeTo(address(valMgrImpl)); + vm.prank(multisig); Proxy(payable(address(oracle))).upgradeToAndCall( address(oracleImpl), @@ -298,6 +405,68 @@ contract L2OutputOracle_Initializer is UpgradeGovernor_Initializer { vm.label(Predeploys.L2_TO_L1_MESSAGE_PASSER, "L2ToL1MessagePasser"); } + + function _registerValidator(address validator, uint128 assets) internal { + vm.startPrank(validator, validator); + assetToken.approve(address(assetMgr), uint256(assets)); + valMgr.registerValidator(assets, 10, withdrawAcc); + vm.stopPrank(); + } + + function _submitL2OutputV1() internal { + warpToSubmitTime(); + uint256 nextBlockNumber = oracle.nextBlockNumber(); + bytes32 outputRoot = keccak256(abi.encode(nextBlockNumber)); + vm.prank(pool.nextValidator()); + oracle.submitL2Output(outputRoot, nextBlockNumber, 0, 0); + } + + function _submitL2OutputV2(bool isPublicRound) internal { + uint256 nextBlockNumber = oracle.nextBlockNumber(); + bytes32 outputRoot = keccak256(abi.encode(nextBlockNumber)); + if (!isPublicRound) { + vm.prank(valMgr.nextValidator()); + } + oracle.submitL2Output(outputRoot, nextBlockNumber, 0, 0); + } +} + +contract ValidatorSystemUpgrade_Initializer is L2OutputOracle_Initializer { + function setUp() public virtual override { + super.setUp(); + + // The last output index of ValidatorPool is 3, first output index of ValidatorManager is 4 + terminateOutputIndex = 3; + finalizationPeriodSeconds = 2 hours; + + // Deploy L2OutputOracle with new arguments + oracleImpl = new L2OutputOracle({ + _validatorPool: pool, + _validatorManager: valMgr, + _colosseum: address(colosseum), + _submissionInterval: submissionInterval, + _l2BlockTime: l2BlockTime, + _startingBlockNumber: startingBlockNumber, + _startingTimestamp: startingTimestamp, + _finalizationPeriodSeconds: finalizationPeriodSeconds + }); + vm.prank(multisig); + Proxy(payable(address(oracle))).upgradeTo(address(oracleImpl)); + + // Deploy ValidatorPool with new arguments + poolImpl = new ValidatorPool({ + _l2OutputOracle: oracle, + _portal: mockPortal, + _securityCouncil: guardian, + _trustedValidator: trusted, + _requiredBondAmount: requiredBondAmount, + _maxUnbond: maxUnbond, + _roundDuration: roundDuration, + _terminateOutputIndex: terminateOutputIndex + }); + vm.prank(multisig); + Proxy(payable(address(pool))).upgradeTo(address(poolImpl)); + } } contract Poseidon2Deployer { @@ -581,6 +750,11 @@ contract Colosseum_Initializer is Portal_Initializer { uint256[] segmentsLengths; + // Constructor arguments + uint256 internal creationPeriodSeconds = finalizationPeriodSeconds - 1 days; + uint256 internal bisectionTimeout = 30 minutes; + uint256 internal provingTimeout = 1 hours; + function setUp() public virtual override { // Deploy the ZKVerifier // Chain ID 901 @@ -600,8 +774,7 @@ contract Colosseum_Initializer is Portal_Initializer { segmentsLengths.push(10); segmentsLengths.push(6); - Proxy proxy = new Proxy(multisig); - colosseum = Colosseum(payable(address(proxy))); + colosseum = Colosseum(payable(address(new Proxy(multisig)))); // Init L2OutputOracle after Colosseum contract deployment super.setUp(); @@ -619,9 +792,9 @@ contract Colosseum_Initializer is Portal_Initializer { _l2Oracle: oracle, _zkVerifier: zkVerifier, _submissionInterval: submissionInterval, - _creationPeriodSeconds: 6 days, - _bisectionTimeout: 30 minutes, - _provingTimeout: 1 hours, + _creationPeriodSeconds: creationPeriodSeconds, + _bisectionTimeout: bisectionTimeout, + _provingTimeout: provingTimeout, _dummyHash: DUMMY_HASH, _maxTxs: MAX_TXS, _segmentsLengths: segmentsLengths, @@ -629,9 +802,9 @@ contract Colosseum_Initializer is Portal_Initializer { _zkMerkleTrie: address(zkMerkleTrie) }); vm.prank(multisig); - proxy.upgradeToAndCall( + toProxy(address(colosseum)).upgradeToAndCall( address(colosseumImpl), - abi.encodeCall(Colosseum.initialize, (segmentsLengths)) + abi.encodeCall(Colosseum.initialize, segmentsLengths) ); } } diff --git a/packages/contracts/contracts/test/GovernanceToken.t.sol b/packages/contracts/contracts/test/GovernanceToken.t.sol index 6933be4d0d..7f7c545e88 100644 --- a/packages/contracts/contracts/test/GovernanceToken.t.sol +++ b/packages/contracts/contracts/test/GovernanceToken.t.sol @@ -4,25 +4,44 @@ pragma solidity 0.8.15; // Testing utilities import { CommonTest } from "./CommonTest.t.sol"; +// Target contract dependencies +import { Proxy } from "../universal/Proxy.sol"; + // Target contract import { GovernanceToken } from "../governance/GovernanceToken.sol"; contract GovernanceToken_Test is CommonTest { - address owner; address rando; GovernanceToken governanceToken; address bridge; address remoteToken; + address mintManager; + + event Mint(address indexed account, uint256 amount); + + event Burn(address indexed account, uint256 amount); /// @dev Sets up the test suite. function setUp() public virtual override { super.setUp(); - owner = makeAddr("owner"); rando = makeAddr("rando"); bridge = makeAddr("bridge"); remoteToken = makeAddr("remoteToken"); - governanceToken = new GovernanceToken(bridge, remoteToken); + mintManager = makeAddr("mintManager"); + + governanceToken = GovernanceToken(address(new Proxy(multisig))); + GovernanceToken govTokenImpl = new GovernanceToken(bridge, remoteToken); + vm.prank(multisig); + toProxy(address(governanceToken)).upgradeToAndCall( + address(govTokenImpl), + abi.encodeCall(governanceToken.initialize, mintManager) + ); + assertEq(governanceToken.pendingOwner(), mintManager); + + vm.prank(mintManager); + governanceToken.acceptOwnership(); + assertEq(governanceToken.owner(), mintManager); } /// @dev Tests that the constructor sets the correct initial state. @@ -35,51 +54,53 @@ contract GovernanceToken_Test is CommonTest { assertEq(governanceToken.totalSupply(), 0); } + /// @dev Tests that the owner can successfully call `mint`. + function test_mint_fromOwner_succeeds() external { + // Mint 100 tokens. + vm.expectEmit(true, false, false, true, address(governanceToken)); + emit Mint(rando, 100); + vm.prank(mintManager); + governanceToken.mint(rando, 100); + + // Balances have updated correctly. + assertEq(governanceToken.balanceOf(rando), 100); + assertEq(governanceToken.totalSupply(), 100); + } + /// @dev Tests the bridge contract can successfully call `mint`. function test_mint_fromBridge_succeeds() external { // Mint 100 tokens. + vm.expectEmit(true, false, false, true, address(governanceToken)); + emit Mint(rando, 100); vm.prank(bridge); - governanceToken.mint(owner, 100); + governanceToken.mint(rando, 100); // Balances have updated correctly. - assertEq(governanceToken.balanceOf(owner), 100); + assertEq(governanceToken.balanceOf(rando), 100); assertEq(governanceToken.totalSupply(), 100); } - /// @dev Tests that `mint` reverts when called by a non-owner. - function test_mint_fromNotOwner_reverts() external { + /// @dev Tests that `mint` reverts when called by a non-minter. + function test_mint_fromNotMinter_reverts() external { // Mint 100 tokens as rando. vm.prank(rando); - vm.expectRevert("GovernanceToken: only minter can mint"); - governanceToken.mint(owner, 100); + vm.expectRevert("GovernanceToken: only bridge or owner can mint"); + governanceToken.mint(rando, 100); // Balance does not update. - assertEq(governanceToken.balanceOf(owner), 0); + assertEq(governanceToken.balanceOf(rando), 0); assertEq(governanceToken.totalSupply(), 0); } - /// @dev Tests that the owner can successfully call `burn`. - function test_burn_succeeds() external { - // Mint 100 tokens to rando. - vm.prank(bridge); - governanceToken.mint(rando, 100); - - // Rando burns their tokens. - vm.prank(rando); - governanceToken.burn(50); - - // Balances have updated correctly. - assertEq(governanceToken.balanceOf(rando), 50); - assertEq(governanceToken.totalSupply(), 50); - } - /// @dev Tests that the bridge contract can successfully call `burn`. function test_burn_fromBridge_succeeds() external { // Mint 100 tokens to rando. - vm.prank(bridge); + vm.prank(mintManager); governanceToken.mint(rando, 100); // Bridge burns rando's tokens. + vm.expectEmit(true, false, false, true, address(governanceToken)); + emit Burn(rando, 100); vm.prank(bridge); governanceToken.burn(rando, 100); @@ -88,37 +109,29 @@ contract GovernanceToken_Test is CommonTest { assertEq(governanceToken.totalSupply(), 0); } - /// @dev Tests that the owner can successfully call `burnFrom`. - function test_burnFrom_succeeds() external { + /// @dev Tests that other than bridge contract cannot call `burn`. + function test_burn_fromNotBridge_reverts() external { // Mint 100 tokens to rando. - vm.prank(bridge); + vm.prank(mintManager); governanceToken.mint(rando, 100); - // Rando approves owner to burn 50 tokens. + vm.expectRevert("KromaMintableERC20: only bridge can mint and burn"); vm.prank(rando); - governanceToken.approve(owner, 50); - - // Owner burns 50 tokens from rando. - vm.prank(owner); - governanceToken.burnFrom(rando, 50); - - // Balances have updated correctly. - assertEq(governanceToken.balanceOf(rando), 50); - assertEq(governanceToken.totalSupply(), 50); + governanceToken.burn(rando, 100); } /// @dev Tests that `transfer` correctly transfers tokens. function test_transfer_succeeds() external { // Mint 100 tokens to rando. - vm.prank(bridge); + vm.prank(mintManager); governanceToken.mint(rando, 100); - // Rando transfers 50 tokens to owner. + // Rando transfers 50 tokens to alice. vm.prank(rando); - governanceToken.transfer(owner, 50); + governanceToken.transfer(alice, 50); // Balances have updated correctly. - assertEq(governanceToken.balanceOf(owner), 50); + assertEq(governanceToken.balanceOf(alice), 50); assertEq(governanceToken.balanceOf(rando), 50); assertEq(governanceToken.totalSupply(), 100); } @@ -126,33 +139,33 @@ contract GovernanceToken_Test is CommonTest { /// @dev Tests that `approve` correctly sets allowances. function test_approve_succeeds() external { // Mint 100 tokens to rando. - vm.prank(bridge); + vm.prank(mintManager); governanceToken.mint(rando, 100); - // Rando approves owner to spend 50 tokens. + // Rando approves alice to spend 50 tokens. vm.prank(rando); - governanceToken.approve(owner, 50); + governanceToken.approve(alice, 50); // Allowances have updated. - assertEq(governanceToken.allowance(rando, owner), 50); + assertEq(governanceToken.allowance(rando, alice), 50); } /// @dev Tests that `transferFrom` correctly transfers tokens. function test_transferFrom_succeeds() external { // Mint 100 tokens to rando. - vm.prank(bridge); + vm.prank(mintManager); governanceToken.mint(rando, 100); - // Rando approves owner to spend 50 tokens. + // Rando approves alice to spend 50 tokens. vm.prank(rando); - governanceToken.approve(owner, 50); + governanceToken.approve(alice, 50); - // Owner transfers 50 tokens from rando to owner. - vm.prank(owner); - governanceToken.transferFrom(rando, owner, 50); + // Alice transfers 50 tokens from rando to alice. + vm.prank(alice); + governanceToken.transferFrom(rando, alice, 50); // Balances have updated correctly. - assertEq(governanceToken.balanceOf(owner), 50); + assertEq(governanceToken.balanceOf(alice), 50); assertEq(governanceToken.balanceOf(rando), 50); assertEq(governanceToken.totalSupply(), 100); } @@ -160,36 +173,36 @@ contract GovernanceToken_Test is CommonTest { /// @dev Tests that `increaseAllowance` correctly increases allowances. function test_increaseAllowance_succeeds() external { // Mint 100 tokens to rando. - vm.prank(bridge); + vm.prank(mintManager); governanceToken.mint(rando, 100); - // Rando approves owner to spend 50 tokens. + // Rando approves alice to spend 50 tokens. vm.prank(rando); - governanceToken.approve(owner, 50); + governanceToken.approve(alice, 50); // Rando increases allowance by 50 tokens. vm.prank(rando); - governanceToken.increaseAllowance(owner, 50); + governanceToken.increaseAllowance(alice, 50); // Allowances have updated. - assertEq(governanceToken.allowance(rando, owner), 100); + assertEq(governanceToken.allowance(rando, alice), 100); } /// @dev Tests that `decreaseAllowance` correctly decreases allowances. function test_decreaseAllowance_succeeds() external { // Mint 100 tokens to rando. - vm.prank(bridge); + vm.prank(mintManager); governanceToken.mint(rando, 100); - // Rando approves owner to spend 100 tokens. + // Rando approves alice to spend 100 tokens. vm.prank(rando); - governanceToken.approve(owner, 100); + governanceToken.approve(alice, 100); // Rando decreases allowance by 50 tokens. vm.prank(rando); - governanceToken.decreaseAllowance(owner, 50); + governanceToken.decreaseAllowance(alice, 50); // Allowances have updated. - assertEq(governanceToken.allowance(rando, owner), 50); + assertEq(governanceToken.allowance(rando, alice), 50); } } diff --git a/packages/contracts/contracts/test/KromaPortal.t.sol b/packages/contracts/contracts/test/KromaPortal.t.sol index e289d63805..5dc7b269a0 100644 --- a/packages/contracts/contracts/test/KromaPortal.t.sol +++ b/packages/contracts/contracts/test/KromaPortal.t.sol @@ -96,7 +96,7 @@ contract KromaPortal_Test is Portal_Initializer { emitTransactionDeposited(alice, alice, 100, 100, 100_000, false, hex""); // give alice money and send as an eoa - vm.deal(alice, 2**64); + vm.deal(alice, 2 ** 64); vm.prank(alice, alice); (bool s, ) = address(portal).call{ value: 100 }(hex""); @@ -332,7 +332,7 @@ contract KromaPortal_Test is Portal_Initializer { uint256 checkpoint = oracle.nextBlockNumber(); uint256 nextOutputIndex = oracle.nextOutputIndex(); vm.roll(checkpoint); - vm.warp(oracle.computeL2Timestamp(checkpoint) + 1); + warpToSubmitTime(); vm.prank(trusted); oracle.submitL2Output(keccak256(abi.encode(2)), checkpoint, 0, 0); @@ -398,7 +398,7 @@ contract KromaPortal_FinalizeWithdrawal_Test is Portal_Initializer { // Get the system into a nice ready-to-use state. function setUp() public override { // Configure the oracle to return the output root we've prepared. - vm.warp(oracle.computeL2Timestamp(_submittedBlockNumber + 1)); + warpToSubmitTime(); vm.prank(trusted); oracle.submitL2Output(_outputRoot, _submittedBlockNumber, 0, 0); diff --git a/packages/contracts/contracts/test/KromaVestingWallet.t.sol b/packages/contracts/contracts/test/KromaVestingWallet.t.sol new file mode 100644 index 0000000000..c7c37fdf2e --- /dev/null +++ b/packages/contracts/contracts/test/KromaVestingWallet.t.sol @@ -0,0 +1,186 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { GovernanceToken } from "../governance/GovernanceToken.sol"; +import { KromaVestingWallet } from "../universal/KromaVestingWallet.sol"; +import { Proxy } from "../universal/Proxy.sol"; +import { CommonTest } from "./CommonTest.t.sol"; + +contract KromaVestingWalletTest is CommonTest { + uint64 immutable SECONDS_PER_3_MONTHS = 365 days / 4; + + KromaVestingWallet vestingWallet; + address beneficiary; + uint64 startTime; + uint64 durationNum; + uint64 durationSec; + uint64 cliffDivider; + uint64 vestingCycle; + + GovernanceToken token; + address tokenOwner; + uint256 totalAllocation; + + function setUp() public override { + super.setUp(); + + beneficiary = makeAddr("beneficiary"); + vestingCycle = SECONDS_PER_3_MONTHS; + startTime = vestingCycle; + durationNum = 12; + durationSec = vestingCycle * durationNum; + cliffDivider = 4; + + tokenOwner = makeAddr("tokenOwner"); + totalAllocation = 15 * 10_000_000 * (10 ** 18); + + vestingWallet = KromaVestingWallet(payable(address(new Proxy(multisig)))); + KromaVestingWallet vestingWalletImpl = new KromaVestingWallet(cliffDivider, vestingCycle); + vm.prank(multisig); + toProxy(address(vestingWallet)).upgradeToAndCall( + address(vestingWalletImpl), + abi.encodeCall(vestingWallet.initialize, (beneficiary, startTime, durationSec)) + ); + + token = GovernanceToken(address(new Proxy(multisig))); + GovernanceToken tokenImpl = new GovernanceToken(ZERO_ADDRESS, ZERO_ADDRESS); + vm.prank(multisig); + toProxy(address(token)).upgradeToAndCall( + address(tokenImpl), + abi.encodeCall(token.initialize, tokenOwner) + ); + vm.prank(tokenOwner); + token.acceptOwnership(); + + vm.prank(tokenOwner); + token.mint(address(vestingWallet), totalAllocation); + assertEq(token.balanceOf(address(vestingWallet)), totalAllocation); + } + + function test_constructor_succeeds() external { + assertEq(vestingWallet.CLIFF_DIVIDER(), cliffDivider); + assertEq(vestingWallet.VESTING_CYCLE(), vestingCycle); + } + + function test_constructor_zeroValues_reverts() external { + vm.expectRevert("KromaVestingWallet: cliff divider is zero"); + new KromaVestingWallet(0, vestingCycle); + + vm.expectRevert("KromaVestingWallet: vesting cycle is zero"); + new KromaVestingWallet(cliffDivider, 0); + } + + function test_initialize_succeeds() external { + assertEq(vestingWallet.beneficiary(), beneficiary); + assertEq(vestingWallet.start(), startTime); + assertEq(vestingWallet.duration(), durationSec); + } + + function test_initialize_durationNotMultiple_reverts() external { + vestingWallet = KromaVestingWallet(payable(address(new Proxy(multisig)))); + KromaVestingWallet vestingWalletImpl = new KromaVestingWallet(cliffDivider, vestingCycle); + + vm.prank(multisig); + vm.expectRevert("Proxy: delegatecall to new implementation contract failed"); + toProxy(address(vestingWallet)).upgradeToAndCall( + address(vestingWalletImpl), + abi.encodeCall(vestingWallet.initialize, (beneficiary, startTime, durationSec + 1)) + ); + } + + function test_release_token_succeeds() external { + // Ensure test env is set properly + assertEq(token.balanceOf(beneficiary), 0); + assertTrue(block.timestamp < startTime); + + uint256 cliffAmount = totalAllocation / cliffDivider; + uint256 vestingAmountPer3Months = (totalAllocation - cliffAmount) / durationNum; + + vm.startPrank(beneficiary); + vestingWallet.release(address(token)); + assertEq(token.balanceOf(beneficiary), 0); + + vm.warp(startTime); + vestingWallet.release(address(token)); + assertEq(token.balanceOf(beneficiary), cliffAmount); + + vm.warp(startTime + vestingCycle / 2); + vestingWallet.release(address(token)); + assertEq(token.balanceOf(beneficiary), cliffAmount); + + vm.warp(startTime + vestingCycle); + vestingWallet.release(address(token)); + assertEq(token.balanceOf(beneficiary), cliffAmount + vestingAmountPer3Months); + + vm.warp(startTime + durationSec); + vestingWallet.release(address(token)); + assertEq(token.balanceOf(beneficiary), totalAllocation); + } + + function test_release_tokenAfterFullyVested_succeeds() external { + // Ensure test env is set properly + assertEq(token.balanceOf(beneficiary), 0); + + vm.warp(startTime + durationSec + 1); + + vm.prank(beneficiary); + vestingWallet.release(address(token)); + assertEq(token.balanceOf(beneficiary), totalAllocation); + } + + function test_release_succeeds() external { + uint256 totalEthAllocation = 1 ether; + vm.deal(address(vestingWallet), totalEthAllocation); + + // Ensure test env is set properly + assertEq(beneficiary.balance, 0); + assertTrue(block.timestamp < startTime); + + uint256 cliffAmount = totalEthAllocation / cliffDivider; + uint256 vestingAmountPer3Months = (totalEthAllocation - cliffAmount) / durationNum; + + vm.startPrank(beneficiary); + vestingWallet.release(); + assertEq(beneficiary.balance, 0); + + vm.warp(startTime); + vestingWallet.release(); + assertEq(beneficiary.balance, cliffAmount); + + vm.warp(startTime + vestingCycle / 2); + vestingWallet.release(); + assertEq(beneficiary.balance, cliffAmount); + + vm.warp(startTime + vestingCycle); + vestingWallet.release(); + assertEq(beneficiary.balance, cliffAmount + vestingAmountPer3Months); + + vm.warp(startTime + durationSec); + vestingWallet.release(); + assertEq(beneficiary.balance, totalEthAllocation); + } + + function test_release_afterFullyVested_succeeds() external { + uint256 totalEthAllocation = 1 ether; + vm.deal(address(vestingWallet), totalEthAllocation); + + // Ensure test env is set properly + assertEq(beneficiary.balance, 0); + + vm.warp(startTime + durationSec + 1); + + vm.prank(beneficiary); + vestingWallet.release(); + assertEq(beneficiary.balance, totalEthAllocation); + } + + function test_release_notBeneficiary_reverts() external { + vm.startPrank(tokenOwner); + + vm.expectRevert("KromaVestingWallet: caller is not beneficiary"); + vestingWallet.release(address(token)); + + vm.expectRevert("KromaVestingWallet: caller is not beneficiary"); + vestingWallet.release(); + } +} diff --git a/packages/contracts/contracts/test/L2OutputOracle.t.sol b/packages/contracts/contracts/test/L2OutputOracle.t.sol index 9b9e1a58e1..2fd1d409b2 100644 --- a/packages/contracts/contracts/test/L2OutputOracle.t.sol +++ b/packages/contracts/contracts/test/L2OutputOracle.t.sol @@ -6,24 +6,31 @@ import { stdError } from "forge-std/Test.sol"; import { Types } from "../libraries/Types.sol"; import { L2OutputOracle } from "../L1/L2OutputOracle.sol"; import { ValidatorPool } from "../L1/ValidatorPool.sol"; +import { IValidatorManager } from "../L1/interfaces/IValidatorManager.sol"; import { Proxy } from "../universal/Proxy.sol"; -import { L2OutputOracle_Initializer, NextImpl } from "./CommonTest.t.sol"; +import { + L2OutputOracle_Initializer, + ValidatorSystemUpgrade_Initializer, + NextImpl +} from "./CommonTest.t.sol"; contract L2OutputOracleTest is L2OutputOracle_Initializer { bytes32 submittedOutput1 = keccak256(abi.encode(1)); - function setUp() public virtual override { + function setUp() public override { super.setUp(); - vm.deal(trusted, requiredBondAmount * 100); vm.prank(trusted); pool.deposit{ value: trusted.balance }(); } function test_constructor_succeeds() external { assertEq(address(oracle.VALIDATOR_POOL()), address(pool)); + assertEq(address(oracle.VALIDATOR_MANAGER()), address(valMgr)); assertEq(oracle.COLOSSEUM(), address(colosseum)); assertEq(oracle.SUBMISSION_INTERVAL(), submissionInterval); + assertEq(oracle.L2_BLOCK_TIME(), l2BlockTime); + assertEq(oracle.FINALIZATION_PERIOD_SECONDS(), finalizationPeriodSeconds); assertEq(oracle.latestBlockNumber(), startingBlockNumber); assertEq(oracle.startingBlockNumber(), startingBlockNumber); assertEq(oracle.startingTimestamp(), startingTimestamp); @@ -33,12 +40,13 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer { vm.expectRevert("L2OutputOracle: starting L2 timestamp must be less than current time"); new L2OutputOracle({ _validatorPool: pool, + _validatorManager: valMgr, _colosseum: address(colosseum), _submissionInterval: submissionInterval, _l2BlockTime: l2BlockTime, _startingBlockNumber: startingBlockNumber, _startingTimestamp: block.timestamp + 1, - _finalizationPeriodSeconds: 7 days + _finalizationPeriodSeconds: finalizationPeriodSeconds }); } @@ -46,12 +54,13 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer { vm.expectRevert("L2OutputOracle: L2 block time must be greater than 0"); new L2OutputOracle({ _validatorPool: pool, + _validatorManager: valMgr, _colosseum: address(colosseum), _submissionInterval: submissionInterval, _l2BlockTime: 0, _startingBlockNumber: startingBlockNumber, _startingTimestamp: block.timestamp, - _finalizationPeriodSeconds: 7 days + _finalizationPeriodSeconds: finalizationPeriodSeconds }); } @@ -59,12 +68,13 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer { vm.expectRevert("L2OutputOracle: submission interval must be greater than 0"); new L2OutputOracle({ _validatorPool: pool, + _validatorManager: valMgr, _colosseum: address(colosseum), _submissionInterval: 0, _l2BlockTime: l2BlockTime, _startingBlockNumber: startingBlockNumber, _startingTimestamp: block.timestamp, - _finalizationPeriodSeconds: 7 days + _finalizationPeriodSeconds: finalizationPeriodSeconds }); } @@ -77,7 +87,7 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer { uint256 submittedNumber = oracle.nextBlockNumber(); // Roll to after the block number we'll submit - warpToSubmitTime(submittedNumber); + warpToSubmitTime(); vm.prank(trusted); oracle.submitL2Output(submittedOutput1, submittedNumber, 0, 0); assertEq(oracle.latestBlockNumber(), submittedNumber); @@ -87,7 +97,7 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer { function test_getL2Output_succeeds() external { uint256 nextBlockNumber = oracle.nextBlockNumber(); uint256 nextOutputIndex = oracle.nextOutputIndex(); - warpToSubmitTime(nextBlockNumber); + warpToSubmitTime(); vm.prank(trusted); oracle.submitL2Output(submittedOutput1, nextBlockNumber, 0, 0); @@ -104,7 +114,7 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer { function test_getL2OutputIndexAfter_sameBlock_succeeds() external { bytes32 output1 = keccak256(abi.encode(1)); uint256 nextBlockNumber1 = oracle.nextBlockNumber(); - warpToSubmitTime(nextBlockNumber1); + warpToSubmitTime(); vm.prank(trusted); oracle.submitL2Output(output1, nextBlockNumber1, 0, 0); @@ -117,7 +127,7 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer { function test_getL2OutputIndexAfter_previousBlock_succeeds() external { bytes32 output1 = keccak256(abi.encode(1)); uint256 nextBlockNumber1 = oracle.nextBlockNumber(); - warpToSubmitTime(nextBlockNumber1); + warpToSubmitTime(); vm.prank(trusted); oracle.submitL2Output(output1, nextBlockNumber1, 0, 0); @@ -130,25 +140,25 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer { function test_getL2OutputIndexAfter_multipleOutputsExist_succeeds() external { bytes32 output1 = keccak256(abi.encode(1)); uint256 nextBlockNumber1 = oracle.nextBlockNumber(); - warpToSubmitTime(nextBlockNumber1); + warpToSubmitTime(); vm.prank(trusted); oracle.submitL2Output(output1, nextBlockNumber1, 0, 0); bytes32 output2 = keccak256(abi.encode(2)); uint256 nextBlockNumber2 = oracle.nextBlockNumber(); - warpToSubmitTime(nextBlockNumber2); + warpToSubmitTime(); vm.prank(trusted); oracle.submitL2Output(output2, nextBlockNumber2, 0, 0); bytes32 output3 = keccak256(abi.encode(3)); uint256 nextBlockNumber3 = oracle.nextBlockNumber(); - warpToSubmitTime(nextBlockNumber3); + warpToSubmitTime(); vm.prank(trusted); oracle.submitL2Output(output3, nextBlockNumber3, 0, 0); bytes32 output4 = keccak256(abi.encode(4)); uint256 nextBlockNumber4 = oracle.nextBlockNumber(); - warpToSubmitTime(nextBlockNumber4); + warpToSubmitTime(); vm.prank(trusted); oracle.submitL2Output(output4, nextBlockNumber4, 0, 0); @@ -206,6 +216,13 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer { ); } + function test_nextOutputMinL2Timestamp_succeeds() external { + assertEq( + oracle.nextOutputMinL2Timestamp(), + oracle.computeL2Timestamp(oracle.nextBlockNumber() + 1) + ); + } + /***************************** * Submit Tests - Happy Path * *****************************/ @@ -217,7 +234,7 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer { bytes32 submittedOutput2 = keccak256(abi.encode()); uint256 nextBlockNumber = oracle.nextBlockNumber(); uint256 nextOutputIndex = oracle.nextOutputIndex(); - warpToSubmitTime(nextBlockNumber); + warpToSubmitTime(); uint256 submittedNumber = oracle.latestBlockNumber(); // Ensure the submissionInterval is enforced @@ -232,11 +249,7 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer { uint128 finalizedAt = uint128(block.timestamp + oracle.FINALIZATION_PERIOD_SECONDS()); vm.expectCall( address(oracle.VALIDATOR_POOL()), - abi.encodeWithSelector( - ValidatorPool.createBond.selector, - nextOutputIndex, - finalizedAt - ) + abi.encodeWithSelector(ValidatorPool.createBond.selector, nextOutputIndex, finalizedAt) ); vm.expectEmit(true, true, true, true); emit OutputSubmitted(submittedOutput2, nextOutputIndex, nextBlockNumber, block.timestamp); @@ -251,15 +264,10 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer { uint256 prevL1BlockNumber = block.number - 1; bytes32 prevL1BlockHash = blockhash(prevL1BlockNumber); uint256 nextBlockNumber = oracle.nextBlockNumber(); - warpToSubmitTime(nextBlockNumber); + warpToSubmitTime(); vm.prank(trusted); - oracle.submitL2Output( - nonZeroHash, - nextBlockNumber, - prevL1BlockHash, - prevL1BlockNumber - ); + oracle.submitL2Output(nonZeroHash, nextBlockNumber, prevL1BlockHash, prevL1BlockNumber); } /*************************** @@ -269,7 +277,7 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer { // Test: submitL2Output fails if called by a party that is not the validator. function test_submitL2Output_notValidator_reverts() external { uint256 nextBlockNumber = oracle.nextBlockNumber(); - warpToSubmitTime(nextBlockNumber); + warpToSubmitTime(); vm.prank(address(128)); vm.expectRevert("L2OutputOracle: only the next selected validator can submit output"); @@ -280,7 +288,7 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer { function test_submitL2Output_emptyOutput_reverts() external { bytes32 outputToSubmit = bytes32(0); uint256 nextBlockNumber = oracle.nextBlockNumber(); - warpToSubmitTime(nextBlockNumber); + warpToSubmitTime(); vm.prank(trusted); vm.expectRevert("L2OutputOracle: L2 checkpoint output cannot be the zero hash"); oracle.submitL2Output(outputToSubmit, nextBlockNumber, 0, 0); @@ -289,7 +297,7 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer { // Test: submitL2Output fails if the block number doesn't match the next expected number. function test_submitL2Output_unexpectedBlockNumber_reverts() external { uint256 nextBlockNumber = oracle.nextBlockNumber(); - warpToSubmitTime(nextBlockNumber); + warpToSubmitTime(); vm.prank(trusted); vm.expectRevert("L2OutputOracle: block number must be equal to next expected block number"); oracle.submitL2Output(nonZeroHash, nextBlockNumber - 1, 0, 0); @@ -298,8 +306,8 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer { // Test: submitL2Output fails if it would have a timestamp in the future. function test_submitL2Output_futureTimetamp_reverts() external { uint256 nextBlockNumber = oracle.nextBlockNumber(); - uint256 nextTimestamp = oracle.computeL2Timestamp(nextBlockNumber); - vm.warp(nextTimestamp); + uint256 nextTimestamp = oracle.nextOutputMinL2Timestamp(); + vm.warp(nextTimestamp - 1); vm.prank(trusted); vm.expectRevert("L2OutputOracle: cannot submit L2 output in the future"); oracle.submitL2Output(nonZeroHash, nextBlockNumber, 0, 0); @@ -309,7 +317,7 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer { // protection. function test_submitL2Output_wrongFork_reverts() external { uint256 nextBlockNumber = oracle.nextBlockNumber(); - warpToSubmitTime(nextBlockNumber); + warpToSubmitTime(); vm.prank(trusted); vm.expectRevert( "L2OutputOracle: block hash does not match the hash at the expected height" @@ -333,19 +341,14 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer { bytes32 l1BlockHash = blockhash(l1BlockNumber); uint256 nextBlockNumber = oracle.nextBlockNumber(); - warpToSubmitTime(nextBlockNumber); + warpToSubmitTime(); vm.prank(trusted); // This will fail when foundry no longer returns zerod block hashes vm.expectRevert( "L2OutputOracle: block hash does not match the hash at the expected height" ); - oracle.submitL2Output( - nonZeroHash, - nextBlockNumber, - l1BlockHash, - l1BlockNumber - 1 - ); + oracle.submitL2Output(nonZeroHash, nextBlockNumber, l1BlockHash, l1BlockNumber - 1); } /***************************** @@ -362,7 +365,7 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer { vm.prank(address(colosseum)); vm.expectEmit(true, true, false, false); - emit OutputReplaced(outputIndex, newOutputRoot); + emit OutputReplaced(outputIndex, challenger, newOutputRoot); oracle.replaceL2Output(outputIndex, newOutputRoot, challenger); // validate that the output root is replaced @@ -419,6 +422,101 @@ contract L2OutputOracleTest is L2OutputOracle_Initializer { } } +contract L2OutputOracle_ValidatorSystemUpgrade_Test is ValidatorSystemUpgrade_Initializer { + function setUp() public override { + super.setUp(); + + vm.prank(trusted); + pool.deposit{ value: trusted.balance }(); + _registerValidator(trusted, minActivateAmount); + + // Submit outputs to leave 1 output before ValidatorPool is terminated + for (uint256 i; i <= terminateOutputIndex - 1; i++) { + _submitL2OutputV1(); + } + } + + function test_submitL2Output_upgradeValidatorSystem_succeeds() external { + // Assert terminateOutputIndex still interacts with ValidatorPool + warpToSubmitTime(); + uint256 nextBlockNumber = oracle.nextBlockNumber(); + bytes32 outputRoot = keccak256(abi.encode(nextBlockNumber)); + + assertFalse(pool.isTerminated(oracle.nextOutputIndex())); + assertEq(pool.nextValidator(), trusted); + + uint128 finalizedAt = uint128(block.timestamp + oracle.FINALIZATION_PERIOD_SECONDS()); + vm.expectCall( + address(oracle.VALIDATOR_POOL()), + abi.encodeWithSelector(ValidatorPool.nextValidator.selector) + ); + vm.expectCall( + address(oracle.VALIDATOR_POOL()), + abi.encodeWithSelector( + ValidatorPool.createBond.selector, + oracle.nextOutputIndex(), + finalizedAt + ) + ); + vm.prank(trusted); + oracle.submitL2Output(outputRoot, nextBlockNumber, 0, 0); + + // Assert terminateOutputIndex + 1 interacts with ValidatorManager + warpToSubmitTime(); + nextBlockNumber = oracle.nextBlockNumber(); + outputRoot = keccak256(abi.encode(nextBlockNumber)); + + assertTrue(pool.isTerminated(oracle.nextOutputIndex())); + assertEq(valMgr.nextValidator(), trusted); + + vm.expectCall( + address(oracle.VALIDATOR_MANAGER()), + abi.encodeWithSelector(IValidatorManager.checkSubmissionEligibility.selector, trusted) + ); + vm.expectCall( + address(oracle.VALIDATOR_MANAGER()), + abi.encodeWithSelector( + IValidatorManager.afterSubmitL2Output.selector, + oracle.nextOutputIndex() + ) + ); + vm.prank(trusted); + oracle.submitL2Output(outputRoot, nextBlockNumber, 0, 0); + } + + function test_setNextFinalizeOutputIndex_succeeds() external { + // Only ValidatorPool can set finalized output before upgrade + vm.prank(address(pool)); + oracle.setNextFinalizeOutputIndex(1); + assertEq(oracle.nextFinalizeOutputIndex(), 1); + + vm.prank(address(pool)); + oracle.setNextFinalizeOutputIndex(terminateOutputIndex + 1); + assertEq(oracle.nextFinalizeOutputIndex(), terminateOutputIndex + 1); + + // Now only ValidatorManager can set finalized output after upgrade + vm.prank(address(valMgr)); + oracle.setNextFinalizeOutputIndex(terminateOutputIndex + 2); + assertEq(oracle.nextFinalizeOutputIndex(), terminateOutputIndex + 2); + } + + function test_setNextFinalizeOutputIndex_wrongCaller_reverts() external { + // Only ValidatorPool can set finalized output before upgrade + vm.prank(address(valMgr)); + vm.expectRevert( + "L2OutputOracle: only the validator pool contract can set next finalize output index" + ); + oracle.setNextFinalizeOutputIndex(1); + + // Now only ValidatorManager can set finalized output after upgrade + vm.prank(address(pool)); + vm.expectRevert( + "L2OutputOracle: only the validator manager contract can set next finalize output index" + ); + oracle.setNextFinalizeOutputIndex(terminateOutputIndex + 2); + } +} + contract L2OutputOracleUpgradeable_Test is L2OutputOracle_Initializer { Proxy internal proxy; @@ -434,6 +532,7 @@ contract L2OutputOracleUpgradeable_Test is L2OutputOracle_Initializer { assertEq(startingTimestamp, oracleImpl.startingTimestamp()); assertEq(address(oracle.VALIDATOR_POOL()), address(pool)); + assertEq(address(oracle.VALIDATOR_MANAGER()), address(valMgr)); assertEq(address(colosseum), oracleImpl.COLOSSEUM()); } diff --git a/packages/contracts/contracts/test/MintManager.t.sol b/packages/contracts/contracts/test/MintManager.t.sol new file mode 100644 index 0000000000..85c64e561e --- /dev/null +++ b/packages/contracts/contracts/test/MintManager.t.sol @@ -0,0 +1,255 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +// Testing utilities +import { CommonTest } from "./CommonTest.t.sol"; + +// Target contract dependencies +import { GovernanceToken } from "../governance/GovernanceToken.sol"; +import { Proxy } from "../universal/Proxy.sol"; + +// Target contract +import { MintManager } from "../governance/MintManager.sol"; + +contract MintManagerTest is CommonTest { + address owner; + address rando; + GovernanceToken governanceToken; + MintManager mintManager; + + address[] recipients = new address[](10); + uint256[] shares = new uint256[](10); + uint256 SHARE_DENOMINATOR; + uint256 MINT_CAP; + + /// @dev Sets up the test suite. + function setUp() public virtual override { + super.setUp(); + + owner = makeAddr("owner"); + rando = makeAddr("rando"); + + governanceToken = GovernanceToken(address(new Proxy(multisig))); + + SHARE_DENOMINATOR = 10 ** 5; + for (uint256 i = 0; i < recipients.length; i++) { + string memory name = string(abi.encodePacked("recipient", i)); + recipients[i] = makeAddr(name); + shares[i] = SHARE_DENOMINATOR / recipients.length; + } + mintManager = new MintManager(address(governanceToken), owner, recipients, shares); + assertEq(mintManager.pendingOwner(), owner); + + vm.prank(owner); + mintManager.acceptOwnership(); + assertEq(mintManager.owner(), owner); + + GovernanceToken govTokenImpl = new GovernanceToken(address(0), address(0)); + vm.prank(multisig); + toProxy(address(governanceToken)).upgradeToAndCall( + address(govTokenImpl), + abi.encodeCall(governanceToken.initialize, address(mintManager)) + ); + assertEq(governanceToken.pendingOwner(), address(mintManager)); + + vm.prank(owner); + mintManager.acceptOwnershipOfToken(); + assertEq(governanceToken.owner(), address(mintManager)); + + MINT_CAP = mintManager.MINT_CAP() * 10 ** governanceToken.decimals(); + } + + /// @dev Tests that the constructor properly configures the contract. + function test_constructor_succeeds() external { + assertEq(address(mintManager.GOVERNANCE_TOKEN()), address(governanceToken)); + + assertEq(mintManager.owner(), owner); + + for (uint256 i = 0; i < recipients.length; i++) { + assertEq(mintManager.recipients(i), recipients[i]); + assertEq(mintManager.shareOf(recipients[i]), shares[i]); + } + } + + function test_constructor_sameRecipient_succeeds() external { + recipients = new address[](3); + shares = new uint256[](3); + + recipients[0] = address(1); + recipients[1] = address(2); + recipients[2] = address(2); + + shares[0] = 3; + shares[1] = 1; + shares[2] = 2; + + mintManager = new MintManager(address(governanceToken), owner, recipients, shares); + + vm.expectRevert(bytes("")); + mintManager.recipients(2); + assertEq(mintManager.recipients(0), recipients[0]); + assertEq(mintManager.recipients(1), recipients[1]); + assertEq(mintManager.shareOf(recipients[0]), shares[0]); + assertEq(mintManager.shareOf(recipients[1]), shares[1] + shares[2]); + } + + function test_constructor_invalidLengthArray_reverts() external { + recipients = new address[](2); + shares = new uint256[](1); + + vm.expectRevert("MintManager: invalid length of array"); + mintManager = new MintManager(address(governanceToken), owner, recipients, shares); + } + + function test_constructor_zeroRecipient_reverts() external { + recipients = new address[](1); + shares = new uint256[](1); + + recipients[0] = address(0); + shares[0] = SHARE_DENOMINATOR; + + vm.expectRevert("MintManager: recipient address cannot be 0"); + mintManager = new MintManager(address(governanceToken), owner, recipients, shares); + } + + function test_constructor_zeroShares_reverts() external { + recipients = new address[](1); + shares = new uint256[](1); + + recipients[0] = makeAddr("recipient"); + shares[0] = 0; + + vm.expectRevert("MintManager: share cannot be 0"); + mintManager = new MintManager(address(governanceToken), owner, recipients, shares); + } + + function test_constructor_tooManyShares_reverts() external { + recipients = new address[](10); + shares = new uint256[](10); + + for (uint256 i = 0; i < recipients.length; i++) { + string memory name = string(abi.encodePacked("recipient", i)); + recipients[i] = makeAddr(name); + shares[i] = SHARE_DENOMINATOR / (recipients.length - 1); + } + + vm.expectRevert("MintManager: max total share is equal or less than SHARE_DENOMINATOR"); + mintManager = new MintManager(address(governanceToken), owner, recipients, shares); + } + + function test_mint_succeeds() public { + assertFalse(mintManager.minted()); + + // Mint once. + vm.prank(owner); + mintManager.mint(); + + assertTrue(mintManager.minted()); + + uint256 totalAmount; + for (uint256 i = 0; i < recipients.length; i++) { + address recipient = recipients[i]; + uint256 share = mintManager.shareOf(recipient); + uint256 amount = (MINT_CAP * share) / SHARE_DENOMINATOR; + totalAmount += amount; + } + + // Token balance increases. + assertEq(governanceToken.balanceOf(address(mintManager)), totalAmount); + } + + function test_mint_fromNotOwner_reverts() external { + // Mint from rando fails. + vm.prank(rando); + vm.expectRevert("Ownable: caller is not the owner"); + mintManager.mint(); + } + + function test_mint_alreadyMinted_reverts() external { + test_mint_succeeds(); + + // Mint again. + vm.prank(owner); + vm.expectRevert("MintManager: already minted on this chain"); + mintManager.mint(); + } + + function test_distribute_succeeds() public { + test_mint_succeeds(); + + vm.prank(owner); + mintManager.distribute(); + + for (uint256 i = 0; i < recipients.length; i++) { + address recipient = recipients[i]; + uint256 share = mintManager.shareOf(recipient); + uint256 amount = (MINT_CAP * share) / SHARE_DENOMINATOR; + assertEq(governanceToken.balanceOf(recipient), amount); + } + } + + function test_distribute_fromNotOwner_reverts() external { + vm.prank(rando); + vm.expectRevert("Ownable: caller is not the owner"); + mintManager.distribute(); + } + + function test_renounceOwnershipOfToken_succeeds() external { + test_mint_succeeds(); + + assertEq(governanceToken.owner(), address(mintManager)); + + vm.prank(owner); + mintManager.renounceOwnershipOfToken(); + + assertEq(governanceToken.owner(), address(0)); + } + + function test_renounceOwnershipOfToken_fromNotOwner_reverts() external { + vm.prank(rando); + vm.expectRevert("Ownable: caller is not the owner"); + mintManager.renounceOwnershipOfToken(); + } + + function test_renounceOwnershipOfToken_beforeMinted_reverts() external { + vm.prank(owner); + vm.expectRevert("MintManager: not minted before renounce ownership"); + mintManager.renounceOwnershipOfToken(); + } + + function test_transferAndAcceptOwnershipOfToken_succeeds() external { + assertEq(governanceToken.owner(), address(mintManager)); + + address newOwner = makeAddr("newOwner"); + MintManager newMintManager = new MintManager( + address(governanceToken), + newOwner, + recipients, + shares + ); + vm.prank(newOwner); + newMintManager.acceptOwnership(); + + vm.prank(owner); + mintManager.transferOwnershipOfToken(address(newMintManager)); + assertEq(governanceToken.pendingOwner(), address(newMintManager)); + assertEq(governanceToken.owner(), address(mintManager)); + + vm.prank(newOwner); + newMintManager.acceptOwnershipOfToken(); + assertEq(governanceToken.pendingOwner(), ZERO_ADDRESS); + assertEq(governanceToken.owner(), address(newMintManager)); + } + + function test_transferOwnershipOfToken_fromNotOwner_reverts() external { + vm.prank(rando); + vm.expectRevert("Ownable: caller is not the owner"); + mintManager.transferOwnershipOfToken(rando); + } + + function test_acceptOwnershipOfToken_fromNotOwner_reverts() external { + vm.prank(rando); + vm.expectRevert("Ownable: caller is not the owner"); + mintManager.acceptOwnershipOfToken(); + } +} diff --git a/packages/contracts/contracts/test/ValidatorManager.t.sol b/packages/contracts/contracts/test/ValidatorManager.t.sol new file mode 100644 index 0000000000..06cd39a1cb --- /dev/null +++ b/packages/contracts/contracts/test/ValidatorManager.t.sol @@ -0,0 +1,1040 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import { Constants } from "../libraries/Constants.sol"; +import { Types } from "../libraries/Types.sol"; +import { Proxy } from "../universal/Proxy.sol"; +import { IAssetManager } from "../L1/interfaces/IAssetManager.sol"; +import { IValidatorManager } from "../L1/interfaces/IValidatorManager.sol"; +import { L2OutputOracle } from "../L1/L2OutputOracle.sol"; +import { ValidatorManager } from "../L1/ValidatorManager.sol"; +import { ValidatorPool } from "../L1/ValidatorPool.sol"; +import { ValidatorSystemUpgrade_Initializer } from "./CommonTest.t.sol"; + +contract MockL2OutputOracle is L2OutputOracle { + constructor( + ValidatorPool _validatorPool, + ValidatorManager _validatorManager, + address _colosseum, + uint256 _submissionInterval, + uint256 _l2BlockTime, + uint256 _startingBlockNumber, + uint256 _startingTimestamp, + uint256 _finalizationPeriodSeconds + ) + L2OutputOracle( + _validatorPool, + _validatorManager, + _colosseum, + _submissionInterval, + _l2BlockTime, + _startingBlockNumber, + _startingTimestamp, + _finalizationPeriodSeconds + ) + {} + + function addOutput(uint256 l2BlockNumber) external { + l2Outputs.push( + Types.CheckpointOutput({ + submitter: msg.sender, + outputRoot: keccak256(abi.encode(l2BlockNumber)), + timestamp: uint128(block.timestamp), + l2BlockNumber: uint128(l2BlockNumber) + }) + ); + } + + function replaceOutput(address validator, uint256 outputIndex) external { + l2Outputs[outputIndex].submitter = validator; + l2Outputs[outputIndex].outputRoot = bytes32(0); + } + + function mockSetNextFinalizeOutputIndex(uint256 l2OutputIndex) external { + nextFinalizeOutputIndex = l2OutputIndex; + } +} + +contract MockValidatorManager is ValidatorManager { + constructor(ConstructorParams memory _constructorParams) ValidatorManager(_constructorParams) {} + + function updatePriorityValidator(address validator) external { + _nextPriorityValidator = validator; + } + + function setJailExpiresAt(address validator, uint128 expiresAt) external { + _jail[validator] = expiresAt; + } + + function nextPriorityValidator() external view returns (address) { + return _nextPriorityValidator; + } + + function getBoostedReward(address validator) external view returns (uint128) { + return _getBoostedReward(validator); + } +} + +contract ValidatorManagerTest is ValidatorSystemUpgrade_Initializer { + MockL2OutputOracle mockOracle; + MockValidatorManager mockValMgr; + + event ValidatorRegistered( + address indexed validator, + bool activated, + uint8 commissionRate, + uint128 assets + ); + + event ValidatorActivated(address indexed validator, uint256 activatedAt); + + event ValidatorStopped(address indexed validator, uint256 stopsAt); + + event ValidatorCommissionChangeInitiated( + address indexed validator, + uint8 oldCommissionRate, + uint8 newCommissionRate + ); + + event ValidatorCommissionChangeFinalized( + address indexed validator, + uint8 oldCommissionRate, + uint8 newCommissionRate + ); + + event ValidatorJailed(address indexed validator, uint128 expiresAt); + + event ValidatorUnjailed(address indexed validator); + + event RewardDistributed( + uint256 indexed outputIndex, + address indexed validator, + uint128 validatorReward, + uint128 baseReward, + uint128 boostedReward + ); + + event Slashed(uint256 indexed outputIndex, address indexed loser, uint128 amount); + + event SlashReverted(uint256 indexed outputIndex, address indexed loser, uint128 amount); + + function _setUpKghDelegation( + address validator, + uint256 startingTokenId, + uint128 kghCounts + ) private { + uint256[] memory tokenIds = new uint256[](kghCounts); + for (uint256 i = startingTokenId; i < startingTokenId + kghCounts; i++) { + kgh.mint(validator, i); + vm.prank(validator); + kgh.approve(address(assetMgr), i); + tokenIds[i - startingTokenId] = i; + } + vm.prank(validator); + assetMgr.delegateKghBatch(validator, tokenIds); + } + + function _withdraw(address validator, uint128 amount) private { + vm.warp(assetMgr.canWithdrawAt(validator) + 1); + vm.prank(withdrawAcc); + assetMgr.withdraw(validator, amount); + } + + function setUp() public override { + super.setUp(); + + address oracleAddress = address(oracle); + MockL2OutputOracle mockOracleImpl = new MockL2OutputOracle( + pool, + valMgr, + address(colosseum), + submissionInterval, + l2BlockTime, + startingBlockNumber, + startingTimestamp, + finalizationPeriodSeconds + ); + vm.prank(multisig); + Proxy(payable(oracleAddress)).upgradeTo(address(mockOracleImpl)); + mockOracle = MockL2OutputOracle(oracleAddress); + + address valMgrAddress = address(valMgr); + MockValidatorManager mockValMgrImpl = new MockValidatorManager(constructorParams); + vm.prank(multisig); + Proxy(payable(valMgrAddress)).upgradeTo(address(mockValMgrImpl)); + mockValMgr = MockValidatorManager(valMgrAddress); + + // Submit until terminateOutputIndex and set next output index to be finalized after it + vm.prank(trusted); + pool.deposit{ value: trusted.balance }(); + for (uint256 i = oracle.nextOutputIndex(); i <= terminateOutputIndex; i++) { + _submitL2OutputV1(); + } + vm.warp(oracle.finalizedAt(terminateOutputIndex)); + mockOracle.mockSetNextFinalizeOutputIndex(terminateOutputIndex + 1); + } + + function test_constructor_succeeds() external { + assertEq(address(valMgr.L2_ORACLE()), address(oracle)); + assertEq(address(valMgr.ASSET_MANAGER()), address(assetMgr)); + assertEq(valMgr.TRUSTED_VALIDATOR(), trusted); + assertEq(valMgr.MIN_REGISTER_AMOUNT(), minRegisterAmount); + assertEq(valMgr.MIN_ACTIVATE_AMOUNT(), minActivateAmount); + assertEq(valMgr.COMMISSION_CHANGE_DELAY_SECONDS(), commissionChangeDelaySeconds); + assertEq(valMgr.ROUND_DURATION_SECONDS(), roundDuration); + assertEq(valMgr.SOFT_JAIL_PERIOD_SECONDS(), softJailPeriodSeconds); + assertEq(valMgr.HARD_JAIL_PERIOD_SECONDS(), hardJailPeriodSeconds); + assertEq(valMgr.JAIL_THRESHOLD(), jailThreshold); + assertEq(valMgr.MAX_OUTPUT_FINALIZATIONS(), maxOutputFinalizations); + assertEq(valMgr.BASE_REWARD(), baseReward); + } + + function test_constructor_smallMinActivateAmount_reverts() external { + constructorParams._minRegisterAmount = minActivateAmount + 1; + vm.expectRevert(IValidatorManager.InvalidConstructorParams.selector); + new MockValidatorManager(constructorParams); + } + + function test_registerValidator_active_succeeds() external { + uint256 trustedBalance = assetToken.balanceOf(trusted); + uint32 count = valMgr.activatedValidatorCount(); + + uint128 assets = minActivateAmount; + uint8 commissionRate = 10; + + vm.startPrank(trusted, trusted); + assetToken.approve(address(assetMgr), uint256(assets)); + vm.expectEmit(true, false, false, true, address(valMgr)); + emit ValidatorActivated(trusted, block.timestamp); + vm.expectEmit(true, true, false, true, address(valMgr)); + emit ValidatorRegistered(trusted, true, commissionRate, assets); + valMgr.registerValidator(assets, commissionRate, withdrawAcc); + vm.stopPrank(); + + assertEq(assetToken.balanceOf(trusted), trustedBalance - assets); + assertEq(assetMgr.totalValidatorKro(trusted), assets); + assertEq(valMgr.getCommissionRate(trusted), commissionRate); + assertEq(assetMgr.getWithdrawAccount(trusted), withdrawAcc); + + assertTrue(valMgr.getStatus(trusted) == IValidatorManager.ValidatorStatus.ACTIVE); + assertEq(valMgr.activatedValidatorCount(), count + 1); + assertEq(valMgr.getWeight(trusted), assets); + } + + function test_registerValidator_registered_succeeds() external { + uint32 count = valMgr.activatedValidatorCount(); + + uint128 assets = minActivateAmount - 1; + uint8 commissionRate = 10; + + vm.startPrank(trusted, trusted); + assetToken.approve(address(assetMgr), uint256(assets)); + vm.expectEmit(true, true, false, true, address(valMgr)); + emit ValidatorRegistered(trusted, false, commissionRate, assets); + valMgr.registerValidator(assets, commissionRate, withdrawAcc); + vm.stopPrank(); + + assertTrue(valMgr.getStatus(trusted) == IValidatorManager.ValidatorStatus.REGISTERED); + assertEq(valMgr.activatedValidatorCount(), count); + assertEq(valMgr.getWeight(trusted), 0); + } + + function test_registerValidator_fromContract_reverts() external { + vm.prank(address(oracle), address(oracle)); + vm.expectRevert(IValidatorManager.NotAllowedCaller.selector); + valMgr.registerValidator(minActivateAmount, 10, withdrawAcc); + } + + function test_registerValidator_differentOrigin_reverts() external { + vm.prank(trusted, asserter); + vm.expectRevert(IValidatorManager.NotAllowedCaller.selector); + valMgr.registerValidator(minActivateAmount, 10, withdrawAcc); + } + + function test_registerValidator_alreadyInitiated_reverts() external { + uint128 assets = minActivateAmount; + + _registerValidator(trusted, assets); + + vm.startPrank(trusted, trusted); + assetToken.approve(address(assetMgr), uint256(assets)); + vm.expectRevert(IValidatorManager.ImproperValidatorStatus.selector); + valMgr.registerValidator(assets, 10, withdrawAcc); + } + + function test_registerValidator_smallAsset_reverts() external { + uint128 assets = minRegisterAmount - 1; + + vm.startPrank(trusted, trusted); + assetToken.approve(address(assetMgr), uint256(assets)); + vm.expectRevert(IValidatorManager.InsufficientAsset.selector); + valMgr.registerValidator(assets, 10, withdrawAcc); + } + + function test_registerValidator_largeCommissionRate_reverts() external { + uint128 assets = minRegisterAmount; + + vm.startPrank(trusted, trusted); + assetToken.approve(address(assetMgr), uint256(assets)); + vm.expectRevert(IValidatorManager.MaxCommissionRateExceeded.selector); + valMgr.registerValidator(assets, 101, withdrawAcc); + } + + function test_registerValidator_withdrawZeroAddr_reverts() external { + uint128 assets = minRegisterAmount; + + vm.startPrank(trusted, trusted); + assetToken.approve(address(assetMgr), uint256(assets)); + vm.expectRevert(IAssetManager.ZeroAddress.selector); + valMgr.registerValidator(assets, 10, address(0)); + } + + function test_activateValidator_notValidator_reverts() external { + assertTrue(valMgr.getStatus(trusted) == IValidatorManager.ValidatorStatus.NONE); + + vm.prank(trusted); + vm.expectRevert(IValidatorManager.ImproperValidatorStatus.selector); + valMgr.activateValidator(); + } + + function test_activateValidator_registered_reverts() external { + _registerValidator(trusted, minActivateAmount - 1); + + vm.prank(trusted); + vm.expectRevert(IValidatorManager.ImproperValidatorStatus.selector); + valMgr.activateValidator(); + } + + function test_activateValidator_exited_reverts() external { + _registerValidator(trusted, minRegisterAmount); + assertTrue(valMgr.getStatus(trusted) == IValidatorManager.ValidatorStatus.REGISTERED); + + _withdraw(trusted, 1); + assertTrue(valMgr.getStatus(trusted) == IValidatorManager.ValidatorStatus.EXITED); + + vm.prank(trusted); + vm.expectRevert(IValidatorManager.ImproperValidatorStatus.selector); + valMgr.activateValidator(); + } + + function test_activateValidator_inJail_reverts() external { + test_afterSubmitL2Output_tryJail_succeeds(); + + // Withdraw all assets of jailed validator + uint128 validatorKro = assetMgr.totalValidatorKro(asserter); + _withdraw(asserter, validatorKro); + assertEq(assetMgr.totalValidatorKro(asserter), 0); + assertTrue(valMgr.getStatus(asserter) == IValidatorManager.ValidatorStatus.EXITED); + + // Delegate to re-activate validator + vm.startPrank(asserter); + assetToken.approve(address(assetMgr), minActivateAmount); + assetMgr.deposit(minActivateAmount); + vm.stopPrank(); + assertTrue(valMgr.getStatus(asserter) == IValidatorManager.ValidatorStatus.READY); + + vm.prank(asserter); + vm.expectRevert(IValidatorManager.ImproperValidatorStatus.selector); + valMgr.activateValidator(); + } + + function test_activateValidator_alreadyActivated_reverts() external { + _registerValidator(trusted, minActivateAmount); + + vm.prank(trusted); + vm.expectRevert(IValidatorManager.ImproperValidatorStatus.selector); + valMgr.activateValidator(); + } + + function test_tryActivateValidator_succeeds() external { + uint32 count = valMgr.activatedValidatorCount(); + + _registerValidator(trusted, minActivateAmount - 1); + assertTrue(valMgr.getStatus(trusted) == IValidatorManager.ValidatorStatus.REGISTERED); + + vm.startPrank(trusted); + assetToken.approve(address(assetMgr), 1); + vm.expectEmit(true, false, false, true, address(valMgr)); + emit ValidatorActivated(trusted, block.timestamp); + assetMgr.deposit(1); + vm.stopPrank(); + + assertTrue(valMgr.getStatus(trusted) == IValidatorManager.ValidatorStatus.ACTIVE); + assertEq(valMgr.activatedValidatorCount(), count + 1); + assertEq(valMgr.getWeight(trusted), minActivateAmount); + } + + function test_afterSubmitL2Output_distributeReward_succeeds() external { + // Register validator with commission rate 10% + _registerValidator(trusted, minActivateAmount); + + // Delegate 1 KGHs + uint128 kghCounts = 1; + _setUpKghDelegation(trusted, 1, 1); + assertEq(assetMgr.totalKghNum(trusted), kghCounts); + + // Delegate KRO from 1 delegator + uint128 delegateAsset = minActivateAmount; + vm.startPrank(delegator); + assetToken.approve(address(assetMgr), uint256(delegateAsset)); + assetMgr.delegate(trusted, delegateAsset); + vm.stopPrank(); + + assertEq(assetMgr.totalValidatorKro(trusted), minActivateAmount); + assertEq(assetMgr.totalKroAssets(trusted), delegateAsset); + + // Submit the first output which interacts with ValidatorManager + _submitL2OutputV2(false); + + // check KRO bonded + assertEq(assetMgr.totalValidatorKroBonded(trusted), bondAmount); + + // Jump to the finalization time of the first output of ValidatorManager + vm.warp(oracle.finalizedAt(terminateOutputIndex + 1)); + + vm.startPrank(trusted); + _submitL2OutputV2(true); // distribute reward 1 time + + uint128 expectedBaseReward = ((baseReward * 90) / 100) / 2; // delegator base reward + uint128 boostedReward = mockValMgr.getBoostedReward(trusted); + uint128 expectedBoostedReward = (boostedReward * 90) / 100; + uint128 expectedValidatorReward = (((baseReward + boostedReward) * 10) / 100) + // commission + ((baseReward * 90) / 100) / + 2; + + assertEq(assetMgr.totalKroAssets(trusted), delegateAsset + expectedBaseReward); + assertEq(assetMgr.getKghReward(trusted, trusted), expectedBoostedReward); + assertEq(assetMgr.totalValidatorKro(trusted), minActivateAmount + expectedValidatorReward); + + // check KRO bonded + assertEq(assetMgr.totalValidatorKroBonded(trusted), bondAmount); + + // Check validator tree updated with rewards + assertEq( + valMgr.getWeight(trusted), + minActivateAmount + delegateAsset + expectedBaseReward + expectedValidatorReward + ); + } + + function test_afterSubmitL2Output_distributeRewardToSC_succeeds() external { + // Register validator with commission rate 10% + _registerValidator(trusted, minActivateAmount); + + // Submit the first output which interacts with ValidatorManager + _submitL2OutputV2(false); + + // Change the output submitter to SC + uint256 firstOutputIndex = terminateOutputIndex + 1; + mockOracle.replaceOutput(assetMgr.SECURITY_COUNCIL(), firstOutputIndex); + + // Jump to the finalization time of the first output of ValidatorManager + vm.warp(oracle.finalizedAt(firstOutputIndex)); + + vm.startPrank(trusted); + _submitL2OutputV2(true); // distribute reward 1 time + + // Check if the reward is transferred to SC directly + assertEq(assetToken.balanceOf(assetMgr.SECURITY_COUNCIL()), baseReward); + } + + function test_afterSubmitL2Output_updatePriorityValidator_succeeds() external { + // Register as a validator + _registerValidator(asserter, minActivateAmount); + _registerValidator(trusted, minActivateAmount); + + // Check if next priority validator is not set in ValidatorManager + assertTrue(mockValMgr.nextPriorityValidator() == address(0)); + assertEq(valMgr.nextValidator(), trusted); + + // Submit the first output which interacts with ValidatorManager + _submitL2OutputV2(false); + + // Check if next finalize output is not updated + assertEq(oracle.nextFinalizeOutputIndex(), terminateOutputIndex + 1); + // Check if next priority validator is set in ValidatorManager + address nextValidator = mockValMgr.nextPriorityValidator(); + assertTrue(nextValidator != address(0)); + assertTrue(valMgr.nextValidator() == nextValidator); + + // Jump to the finalization time of the first output of ValidatorManager + vm.warp(oracle.finalizedAt(terminateOutputIndex + 1)); + vm.startPrank(nextValidator); + _submitL2OutputV2(true); + vm.stopPrank(); + + // Check if next finalize output is updated + assertEq(oracle.nextFinalizeOutputIndex(), terminateOutputIndex + 2); + + // Submit 10 outputs + uint256 tries = 10; + bool changed = false; + nextValidator = valMgr.nextValidator(); + + for (uint256 i; i < tries; i++) { + // Submit next output and finalize prev output + warpToSubmitTime(); + _submitL2OutputV2(false); + + // Check the next validator has changed + address newValidator = valMgr.nextValidator(); + if (nextValidator != newValidator) { + changed = true; + break; + } + } + + assertTrue(changed); + } + + function test_afterSubmitL2Output_tryJail_succeeds() public { + // Register as a validator + _registerValidator(asserter, minActivateAmount); + _registerValidator(trusted, 10 * minActivateAmount); + + vm.startPrank(trusted); + for (uint256 i; i < jailThreshold; i++) { + mockValMgr.updatePriorityValidator(asserter); + + // Warp to public round + vm.warp(oracle.nextOutputMinL2Timestamp() + roundDuration + 1); + _submitL2OutputV2(true); + + assertEq(valMgr.noSubmissionCount(asserter), i + 1); + assertFalse(valMgr.inJail(asserter)); + } + vm.stopPrank(); + + mockValMgr.updatePriorityValidator(asserter); + + // Warp to public round + vm.warp(oracle.nextOutputMinL2Timestamp() + roundDuration + 1); + vm.startPrank(trusted); + vm.expectEmit(true, false, false, true, address(valMgr)); + emit ValidatorJailed(asserter, uint128(block.timestamp) + softJailPeriodSeconds); + vm.expectEmit(true, false, false, true, address(valMgr)); + emit ValidatorStopped(asserter, block.timestamp); + _submitL2OutputV2(true); + vm.stopPrank(); + + assertEq(valMgr.noSubmissionCount(asserter), jailThreshold); + assertTrue(valMgr.inJail(asserter)); + assertEq(valMgr.getWeight(asserter), 0); + } + + function test_afterSubmitL2Output_resetNoSubmissionCount_succeeds() external { + // Register as a validator + _registerValidator(asserter, minActivateAmount); + _registerValidator(trusted, minActivateAmount); + + mockValMgr.updatePriorityValidator(asserter); + + // Warp to public round + vm.warp(oracle.nextOutputMinL2Timestamp() + roundDuration + 1); + assertEq(valMgr.nextValidator(), Constants.VALIDATOR_PUBLIC_ROUND_ADDRESS); + vm.startPrank(trusted); + _submitL2OutputV2(true); + vm.stopPrank(); + + assertEq(valMgr.noSubmissionCount(asserter), 1); + assertFalse(valMgr.inJail(asserter)); + + mockValMgr.updatePriorityValidator(asserter); + + // Warp to priority round + warpToSubmitTime(); + _submitL2OutputV2(false); + + assertEq(valMgr.noSubmissionCount(asserter), 0); + } + + function test_afterSubmitL2Output_senderNotL2OO_reverts() external { + vm.prank(trusted); + vm.expectRevert(IValidatorManager.NotAllowedCaller.selector); + valMgr.afterSubmitL2Output(0); + } + + function test_initCommissionChange_succeeds() public { + _registerValidator(asserter, minActivateAmount); + + uint8 commissionRate = valMgr.getCommissionRate(asserter); + uint8 newCommissionRate = commissionRate + 1; + + vm.prank(asserter); + vm.expectEmit(true, false, false, true, address(valMgr)); + emit ValidatorCommissionChangeInitiated(asserter, commissionRate, newCommissionRate); + valMgr.initCommissionChange(newCommissionRate); + + assertEq(valMgr.getPendingCommissionRate(asserter), newCommissionRate); + assertEq( + valMgr.canFinalizeCommissionChangeAt(asserter), + block.timestamp + valMgr.COMMISSION_CHANGE_DELAY_SECONDS() + ); + } + + function test_initCommissionChange_exited_reverts() external { + _registerValidator(trusted, minActivateAmount); + + uint128 validatorKro = assetMgr.totalValidatorKro(trusted); + _withdraw(trusted, validatorKro); + assertTrue(valMgr.getStatus(trusted) == IValidatorManager.ValidatorStatus.EXITED); + + vm.prank(trusted); + vm.expectRevert(IValidatorManager.ImproperValidatorStatus.selector); + valMgr.initCommissionChange(15); + } + + function test_initCommissionChange_inJail_reverts() external { + test_afterSubmitL2Output_tryJail_succeeds(); + + vm.prank(asserter); + vm.expectRevert(IValidatorManager.ImproperValidatorStatus.selector); + valMgr.initCommissionChange(15); + } + + function test_initCommissionChange_largeCommissionRate_reverts() external { + _registerValidator(asserter, minActivateAmount); + + vm.prank(asserter); + vm.expectRevert(IValidatorManager.MaxCommissionRateExceeded.selector); + valMgr.initCommissionChange(101); + } + + function test_initCommissionChange_sameCommissionRate_reverts() external { + _registerValidator(asserter, minActivateAmount); + + uint8 commissionRate = valMgr.getCommissionRate(asserter); + vm.prank(asserter); + vm.expectRevert(IValidatorManager.SameCommissionRate.selector); + valMgr.initCommissionChange(commissionRate); + } + + function test_finalizeCommissionChange_succeeds() public { + test_initCommissionChange_succeeds(); + + uint8 oldCommissionRate = valMgr.getCommissionRate(asserter); + uint8 newCommissionRate = valMgr.getPendingCommissionRate(asserter); + + vm.warp(valMgr.canFinalizeCommissionChangeAt(asserter)); + vm.prank(asserter); + vm.expectEmit(true, false, false, true, address(valMgr)); + emit ValidatorCommissionChangeFinalized(asserter, oldCommissionRate, newCommissionRate); + valMgr.finalizeCommissionChange(); + + assertEq(valMgr.getCommissionRate(asserter), newCommissionRate); + assertEq(valMgr.getPendingCommissionRate(asserter), 0); + assertEq( + valMgr.canFinalizeCommissionChangeAt(asserter), + valMgr.COMMISSION_CHANGE_DELAY_SECONDS() + ); + } + + function test_finalizeCommissionChange_exited_reverts() external { + _registerValidator(trusted, minActivateAmount); + + vm.prank(trusted); + valMgr.initCommissionChange(15); + + uint128 validatorKro = assetMgr.totalValidatorKro(trusted); + _withdraw(trusted, validatorKro); + assertTrue(valMgr.getStatus(trusted) == IValidatorManager.ValidatorStatus.EXITED); + + vm.prank(trusted); + vm.expectRevert(IValidatorManager.ImproperValidatorStatus.selector); + valMgr.finalizeCommissionChange(); + } + + function test_finalizeCommissionChange_inJail_reverts() external { + test_afterSubmitL2Output_tryJail_succeeds(); + + vm.prank(asserter); + vm.expectRevert(IValidatorManager.ImproperValidatorStatus.selector); + valMgr.finalizeCommissionChange(); + } + + function test_finalizeCommissionChange_changeDelayNotElapsed_reverts() external { + test_initCommissionChange_succeeds(); + + vm.prank(asserter); + vm.expectRevert(IValidatorManager.NotElapsedCommissionChangeDelay.selector); + valMgr.finalizeCommissionChange(); + } + + function test_finalizeCommissionChange_notInitiated_reverts() external { + _registerValidator(trusted, minActivateAmount); + + vm.prank(trusted); + vm.expectRevert(IValidatorManager.NotInitiatedCommissionChange.selector); + valMgr.finalizeCommissionChange(); + } + + function test_tryUnjail_succeeds() external { + test_afterSubmitL2Output_tryJail_succeeds(); + assertTrue(valMgr.getStatus(asserter) == IValidatorManager.ValidatorStatus.READY); + + vm.warp(valMgr.jailExpiresAt(asserter)); + vm.prank(asserter); + vm.expectEmit(true, false, false, false, address(valMgr)); + emit ValidatorUnjailed(asserter); + vm.expectEmit(true, false, false, true, address(valMgr)); + emit ValidatorActivated(asserter, block.timestamp); + valMgr.tryUnjail(); + + assertEq(valMgr.noSubmissionCount(asserter), 0); + assertFalse(valMgr.inJail(asserter)); + assertTrue(valMgr.getStatus(asserter) == IValidatorManager.ValidatorStatus.ACTIVE); + } + + function test_tryUnjail_notInJail_reverts() external { + vm.prank(asserter); + vm.expectRevert(IValidatorManager.ImproperValidatorStatus.selector); + valMgr.tryUnjail(); + } + + function test_tryUnjail_senderNotSelf_reverts() external { + test_afterSubmitL2Output_tryJail_succeeds(); + + vm.prank(trusted); + vm.expectRevert(IValidatorManager.ImproperValidatorStatus.selector); + valMgr.tryUnjail(); + } + + function test_tryUnjail_periodNotElapsed_reverts() external { + test_afterSubmitL2Output_tryJail_succeeds(); + + vm.prank(asserter); + vm.expectRevert(IValidatorManager.NotElapsedJailPeriod.selector); + valMgr.tryUnjail(); + } + + function test_bondValidatorKro_succeeds() external { + _registerValidator(trusted, minActivateAmount); + assertEq(assetMgr.totalValidatorKroBonded(trusted), 0); + + vm.prank(address(colosseum)); + valMgr.bondValidatorKro(trusted); + + assertEq(assetMgr.totalValidatorKroBonded(trusted), bondAmount); + } + + function test_bondValidatorKro_notColosseum_reverts() external { + _registerValidator(trusted, minActivateAmount); + + vm.prank(asserter); + vm.expectRevert(IValidatorManager.NotAllowedCaller.selector); + valMgr.bondValidatorKro(trusted); + } + + function test_unbondValidatorKro_succeeds() external { + _registerValidator(trusted, minActivateAmount); + + vm.prank(trusted); + _submitL2OutputV2(false); + + assertEq(assetMgr.totalValidatorKroBonded(trusted), bondAmount); + + vm.prank(address(colosseum)); + valMgr.unbondValidatorKro(trusted); + + assertEq(assetMgr.totalValidatorKroBonded(trusted), 0); + } + + function test_unbondValidatorKro_notColosseum_reverts() external { + _registerValidator(trusted, minActivateAmount); + + vm.prank(trusted); + _submitL2OutputV2(false); + + assertEq(assetMgr.totalValidatorKroBonded(trusted), bondAmount); + + vm.prank(asserter); + vm.expectRevert(IValidatorManager.NotAllowedCaller.selector); + valMgr.unbondValidatorKro(trusted); + } + + function test_slash_succeeds() external { + uint32 count = valMgr.activatedValidatorCount(); + // Register as a validator + _registerValidator(asserter, minActivateAmount); + _registerValidator(challenger, minActivateAmount); + assertEq(valMgr.activatedValidatorCount(), count + 2); + + // Delegate KGHs + uint128 kghCounts = 1; + uint128 startingTokenId = 1; + _setUpKghDelegation(asserter, startingTokenId, kghCounts); + _setUpKghDelegation(challenger, startingTokenId + kghCounts, kghCounts); + assertEq(assetMgr.totalKghNum(asserter), kghCounts); + assertEq(assetMgr.totalKghNum(challenger), kghCounts); + + // Submit the first output which interacts with ValidatorManager + mockValMgr.updatePriorityValidator(asserter); + warpToSubmitTime(); + _submitL2OutputV2(false); + uint256 challengedOutputIndex = oracle.latestOutputIndex(); + + // Suppose that the challenge is successful, so the winner is challenger + uint128 slashingAmount = bondAmount; + vm.startPrank(address(colosseum)); + valMgr.bondValidatorKro(challenger); // bond for creating challenge + vm.expectEmit(true, true, false, true, address(valMgr)); + emit Slashed(challengedOutputIndex, asserter, slashingAmount); + vm.expectEmit(true, false, false, true, address(valMgr)); + emit ValidatorJailed(asserter, uint128(block.timestamp) + hardJailPeriodSeconds); + vm.expectEmit(true, false, false, true, address(valMgr)); + emit ValidatorStopped(asserter, block.timestamp); + valMgr.slash(challengedOutputIndex, challenger, asserter); + vm.stopPrank(); + + // This will be done by the l2 output oracle contract in the real environment + vm.prank(challenger); + mockOracle.replaceOutput(challenger, challengedOutputIndex); + + // Jump to the finalization time of the challenged output + vm.warp(oracle.finalizedAt(challengedOutputIndex)); + vm.startPrank(challenger); + // Submit one more output to distribute reward + _submitL2OutputV2(true); + vm.stopPrank(); + + // Asserter in jail after slashed + assertTrue(valMgr.inJail(asserter)); + // Asserter removed from validator tree + assertEq(valMgr.activatedValidatorCount(), count + 1); + assertTrue(valMgr.getStatus(asserter) == IValidatorManager.ValidatorStatus.REGISTERED); + + // Asserter asset decreased by slashingAmount + uint128 asserterTotalValidatorKro = assetMgr.totalValidatorKro(asserter); + assertEq(asserterTotalValidatorKro, minActivateAmount - slashingAmount); + assertEq(assetMgr.totalValidatorKroBonded(asserter), 0); + + // Security council balance of asset token increased by tax + uint128 taxAmount = (slashingAmount * assetMgr.TAX_NUMERATOR()) / + assetMgr.TAX_DENOMINATOR(); + assertEq(assetToken.balanceOf(assetMgr.SECURITY_COUNCIL()), taxAmount); + + // Challenger asset increased by output reward and challenge reward + // Boosted reward with 1 kgh delegation + uint128 boostedReward = mockValMgr.getBoostedReward(challenger); + uint128 challengeReward = slashingAmount - taxAmount; + uint128 challengerKro = assetMgr.totalValidatorKro(challenger); + assertEq( + challengerKro, + minActivateAmount + baseReward + (boostedReward / 10) + challengeReward + ); + } + + function test_slash_alreadyInJail_succeeds() external { + _registerValidator(asserter, minActivateAmount); + + // Submit the first output which interacts with ValidatorManager + mockValMgr.updatePriorityValidator(asserter); + warpToSubmitTime(); + _submitL2OutputV2(false); + uint256 challengedOutputIndex = oracle.latestOutputIndex(); + + // Before slashed, send to jail + uint128 firstJailExpiresAt = uint128(block.timestamp) + softJailPeriodSeconds; + mockValMgr.setJailExpiresAt(asserter, firstJailExpiresAt); + + // After jail expired, slash + vm.warp(firstJailExpiresAt + 1); + vm.prank(address(colosseum)); + valMgr.slash(challengedOutputIndex, challenger, asserter); + + assertEq(valMgr.jailExpiresAt(asserter), firstJailExpiresAt + 1 + hardJailPeriodSeconds); + } + + function test_slash_notColosseum_reverts() external { + vm.prank(address(1)); + vm.expectRevert(IValidatorManager.NotAllowedCaller.selector); + valMgr.slash(1, challenger, asserter); + } + + function test_revertSlash_succeeds() external { + uint32 count = valMgr.activatedValidatorCount(); + // Register as a validator + _registerValidator(asserter, minActivateAmount); + _registerValidator(challenger, minActivateAmount); + assertEq(valMgr.activatedValidatorCount(), count + 2); + + // Delegate KGHs + uint128 kghCounts = 1; + uint128 startingTokenId = 1; + _setUpKghDelegation(asserter, startingTokenId, kghCounts); + _setUpKghDelegation(challenger, startingTokenId + kghCounts, kghCounts); + assertEq(assetMgr.totalKghNum(asserter), kghCounts); + assertEq(assetMgr.totalKghNum(challenger), kghCounts); + + // Submit the first output which interacts with ValidatorManager + mockValMgr.updatePriorityValidator(asserter); + warpToSubmitTime(); + _submitL2OutputV2(false); + uint256 challengedOutputIndex = oracle.latestOutputIndex(); + + // Suppose that the challenge is successful, so the winner is challenger + uint128 slashingAmount = bondAmount; + vm.startPrank(address(colosseum)); + valMgr.bondValidatorKro(challenger); // bond for creating challenge + vm.expectEmit(true, true, false, true, address(valMgr)); + emit Slashed(challengedOutputIndex, asserter, slashingAmount); + vm.expectEmit(true, false, false, true, address(valMgr)); + emit ValidatorJailed(asserter, uint128(block.timestamp) + hardJailPeriodSeconds); + vm.expectEmit(true, false, false, true, address(valMgr)); + emit ValidatorStopped(asserter, block.timestamp); + valMgr.slash(challengedOutputIndex, challenger, asserter); + vm.stopPrank(); + + // Asserter in jail after slashed + assertTrue(valMgr.inJail(asserter)); + + // Revert slash + vm.startPrank(address(colosseum)); + vm.expectEmit(true, true, true, true, address(valMgr)); + emit SlashReverted(challengedOutputIndex, asserter, slashingAmount); + vm.expectEmit(true, true, false, false, address(valMgr)); + emit ValidatorUnjailed(asserter); + valMgr.revertSlash(challengedOutputIndex, asserter); + + assertEq(assetMgr.totalValidatorKro(asserter), minActivateAmount); + assertEq(assetMgr.totalValidatorKroBonded(asserter), bondAmount); + assertFalse(valMgr.inJail(asserter)); + assertTrue(valMgr.getStatus(asserter) == IValidatorManager.ValidatorStatus.ACTIVE); + } + + function test_revertSlash_stillInJail_succeeds() external { + _registerValidator(asserter, minActivateAmount); + + // Submit the first output which interacts with ValidatorManager + mockValMgr.updatePriorityValidator(asserter); + warpToSubmitTime(); + _submitL2OutputV2(false); + uint256 challengedOutputIndex = oracle.latestOutputIndex(); + + // Before slashed, send to jail + uint128 firstJailExpiresAt = uint128(block.timestamp) + softJailPeriodSeconds; + mockValMgr.setJailExpiresAt(asserter, firstJailExpiresAt); + + // Before jail expired, slash + vm.prank(address(colosseum)); + valMgr.slash(challengedOutputIndex, challenger, asserter); + + assertEq(valMgr.jailExpiresAt(asserter), firstJailExpiresAt + hardJailPeriodSeconds); + + // Revert slash + vm.prank(address(colosseum)); + valMgr.revertSlash(challengedOutputIndex, asserter); + + assertEq(valMgr.jailExpiresAt(asserter), firstJailExpiresAt); + } + + function test_revertSlash_notColosseum_reverts() external { + vm.prank(trusted); + vm.expectRevert(IValidatorManager.NotAllowedCaller.selector); + valMgr.revertSlash(1, trusted); + } + + function test_checkSubmissionEligibility_priorityRound_succeeds() external { + address nextValidator = valMgr.nextValidator(); + _registerValidator(nextValidator, minActivateAmount); + + vm.prank(address(oracle)); + valMgr.checkSubmissionEligibility(nextValidator); + } + + function test_checkSubmissionEligibility_publicRound_succeeds() external { + mockValMgr.updatePriorityValidator(asserter); + + _registerValidator(trusted, minActivateAmount); + + // Warp to public round + vm.warp(oracle.nextOutputMinL2Timestamp() + roundDuration + 1); + vm.prank(address(oracle)); + valMgr.checkSubmissionEligibility(trusted); + } + + function test_checkSubmissionEligibility_senderNotL2OO_reverts() external { + vm.expectRevert(IValidatorManager.NotAllowedCaller.selector); + valMgr.checkSubmissionEligibility(trusted); + } + + function test_checkSubmissionEligibility_notSelected_reverts() external { + mockValMgr.updatePriorityValidator(asserter); + + warpToSubmitTime(); + vm.prank(address(oracle)); + vm.expectRevert(IValidatorManager.NotSelectedPriorityValidator.selector); + valMgr.checkSubmissionEligibility(trusted); + } + + function test_checkSubmissionEligibility_notSatisfyCondition_reverts() external { + address nextValidator = valMgr.nextValidator(); + + vm.prank(address(oracle)); + vm.expectRevert(IValidatorManager.ImproperValidatorStatus.selector); + valMgr.checkSubmissionEligibility(nextValidator); + } + + function test_checkSubmissionEligibility_publicRound_notSatisfyCondition_reverts() external { + mockValMgr.updatePriorityValidator(asserter); + + // Warp to public round + vm.warp(oracle.nextOutputMinL2Timestamp() + roundDuration + 1); + vm.prank(address(oracle)); + vm.expectRevert(IValidatorManager.ImproperValidatorStatus.selector); + valMgr.checkSubmissionEligibility(trusted); + } + + function test_checkSubmissionEligibility_inJail_reverts() external { + test_afterSubmitL2Output_tryJail_succeeds(); + + mockValMgr.updatePriorityValidator(asserter); + + vm.prank(address(oracle)); + vm.expectRevert(IValidatorManager.ImproperValidatorStatus.selector); + valMgr.checkSubmissionEligibility(asserter); + } + + function test_checkSubmissionEligibility_publicRound_inJail_reverts() external { + test_afterSubmitL2Output_tryJail_succeeds(); + + mockValMgr.updatePriorityValidator(trusted); + + // Warp to public round + vm.warp(oracle.nextOutputMinL2Timestamp() + roundDuration + 1); + vm.prank(address(oracle)); + vm.expectRevert(IValidatorManager.ImproperValidatorStatus.selector); + valMgr.checkSubmissionEligibility(asserter); + } + + function test_getStatus_registered_succeeds() external { + _registerValidator(trusted, minActivateAmount); + assertEq(valMgr.getWeight(trusted), minActivateAmount); + + _withdraw(trusted, 1); + assertTrue(valMgr.getStatus(trusted) == IValidatorManager.ValidatorStatus.REGISTERED); + assertEq(valMgr.getWeight(trusted), 0); + } + + function test_activatedValidatorTotalWeight_succeeds() external { + uint32 count = valMgr.activatedValidatorCount(); + uint120 totalWeight = valMgr.activatedValidatorTotalWeight(); + _registerValidator(trusted, minActivateAmount); + assertEq(valMgr.activatedValidatorCount(), count + 1); + assertEq(valMgr.activatedValidatorTotalWeight(), totalWeight + minActivateAmount); + + count = valMgr.activatedValidatorCount(); + totalWeight = valMgr.activatedValidatorTotalWeight(); + _registerValidator(asserter, minActivateAmount); + assertEq(valMgr.activatedValidatorCount(), count + 1); + assertEq(valMgr.activatedValidatorTotalWeight(), totalWeight + minActivateAmount); + + count = valMgr.activatedValidatorCount(); + totalWeight = valMgr.activatedValidatorTotalWeight(); + vm.startPrank(challenger); + assetToken.approve(address(assetMgr), 10); + assetMgr.delegate(asserter, 10); + vm.stopPrank(); + assertEq(valMgr.activatedValidatorCount(), count); + assertEq(valMgr.activatedValidatorTotalWeight(), totalWeight + 10); + } +} diff --git a/packages/contracts/contracts/test/ValidatorPool.t.sol b/packages/contracts/contracts/test/ValidatorPool.t.sol index 219aced336..9a3123d279 100644 --- a/packages/contracts/contracts/test/ValidatorPool.t.sol +++ b/packages/contracts/contracts/test/ValidatorPool.t.sol @@ -3,18 +3,36 @@ pragma solidity 0.8.15; import { Constants } from "../libraries/Constants.sol"; import { Types } from "../libraries/Types.sol"; +import { IValidatorManager } from "../L1/interfaces/IValidatorManager.sol"; import { KromaPortal } from "../L1/KromaPortal.sol"; import { L2OutputOracle } from "../L1/L2OutputOracle.sol"; import { ValidatorPool } from "../L1/ValidatorPool.sol"; -import { ZKMerkleTrie } from "../L1/ZKMerkleTrie.sol"; import { ValidatorRewardVault } from "../L2/ValidatorRewardVault.sol"; import { Predeploys } from "../libraries/Predeploys.sol"; import { Proxy } from "../universal/Proxy.sol"; -import { L2OutputOracle_Initializer } from "./CommonTest.t.sol"; +import { L2OutputOracle_Initializer, ValidatorSystemUpgrade_Initializer } from "./CommonTest.t.sol"; contract MockL2OutputOracle is L2OutputOracle { - constructor(ValidatorPool _validatorPool, address _colosseum) - L2OutputOracle(_validatorPool, _colosseum, 1800, 2, 0, 0, 7 days) + constructor( + ValidatorPool _validatorPool, + IValidatorManager _validatorManager, + address _colosseum, + uint256 _submissionInterval, + uint256 _l2BlockTime, + uint256 _startingBlockNumber, + uint256 _startingTimestamp, + uint256 _finalizationPeriodSeconds + ) + L2OutputOracle( + _validatorPool, + _validatorManager, + _colosseum, + _submissionInterval, + _l2BlockTime, + _startingBlockNumber, + _startingTimestamp, + _finalizationPeriodSeconds + ) {} function addOutput(bytes32 _outputRoot, uint256 _l2BlockNumber) external payable { @@ -38,12 +56,37 @@ contract MockL2OutputOracle is L2OutputOracle { } } +contract MockValidatorPool is ValidatorPool { + constructor( + L2OutputOracle _l2OutputOracle, + KromaPortal _portal, + address _securityCouncil, + address _trustedValidator, + uint256 _requiredBondAmount, + uint256 _maxUnbond, + uint256 _roundDuration, + uint256 _terminateOutputIndex + ) + ValidatorPool( + _l2OutputOracle, + _portal, + _securityCouncil, + _trustedValidator, + _requiredBondAmount, + _maxUnbond, + _roundDuration, + _terminateOutputIndex + ) + {} + + function getNextPriorityValidator() external view returns (address) { + return nextPriorityValidator; + } +} + // Test the implementations of the ValidatorPool contract ValidatorPoolTest is L2OutputOracle_Initializer { MockL2OutputOracle mockOracle; - KromaPortal portal; - - uint256 internal finalizationPeriodSeconds; event Bonded( address indexed submitter, @@ -65,15 +108,20 @@ contract ValidatorPoolTest is L2OutputOracle_Initializer { function setUp() public override { super.setUp(); - finalizationPeriodSeconds = oracle.FINALIZATION_PERIOD_SECONDS(); - address oracleAddress = address(oracle); - MockL2OutputOracle mockOracleImpl = new MockL2OutputOracle(pool, address(challenger)); + MockL2OutputOracle mockOracleImpl = new MockL2OutputOracle( + pool, + valMgr, + address(colosseum), + submissionInterval, + l2BlockTime, + startingBlockNumber, + startingTimestamp, + finalizationPeriodSeconds + ); vm.prank(multisig); Proxy(payable(oracleAddress)).upgradeTo(address(mockOracleImpl)); mockOracle = MockL2OutputOracle(oracleAddress); - - portal = pool.PORTAL(); } function test_constructor_succeeds() external { @@ -81,6 +129,7 @@ contract ValidatorPoolTest is L2OutputOracle_Initializer { assertEq(pool.TRUSTED_VALIDATOR(), trusted); assertEq(pool.REQUIRED_BOND_AMOUNT(), requiredBondAmount); assertEq(pool.MAX_UNBOND(), maxUnbond); + assertEq(pool.TERMINATE_OUTPUT_INDEX(), terminateOutputIndex); assertEq(pool.ROUND_DURATION(), roundDuration); } @@ -218,7 +267,7 @@ contract ValidatorPoolTest is L2OutputOracle_Initializer { bytes32 outputRoot = keccak256(abi.encode(nextBlockNumber)); address validator = pool.nextValidator(); - warpToSubmitTime(nextBlockNumber); + warpToSubmitTime(); vm.prank(validator); mockOracle.addOutput(outputRoot, nextBlockNumber); @@ -260,6 +309,10 @@ contract ValidatorPoolTest is L2OutputOracle_Initializer { vm.prank(address(oracle)); vm.expectEmit(true, true, false, true, address(pool)); emit Unbonded(0, firstOutput.submitter, uint128(firstBond.amount)); + vm.expectCall( + address(oracle), + abi.encodeWithSelector(L2OutputOracle.setNextFinalizeOutputIndex.selector, 1) + ); pool.createBond(nextOutputIndex, expiresAt); assertEq(pool.balanceOf(firstOutput.submitter), requiredBondAmount); @@ -299,7 +352,7 @@ contract ValidatorPoolTest is L2OutputOracle_Initializer { bytes32 outputRoot = keccak256(abi.encode(nextBlockNumber)); address validator = pool.nextValidator(); - warpToSubmitTime(nextBlockNumber); + warpToSubmitTime(); vm.prank(validator); mockOracle.addOutput(outputRoot, nextBlockNumber); @@ -310,7 +363,7 @@ contract ValidatorPoolTest is L2OutputOracle_Initializer { pool.createBond(nextOutputIndex, expiresAt); } - function test_unbond_succeeds() public { + function test_unbond_succeeds() external { test_createBond_succeeds(); uint256 outputIndex = oracle.latestOutputIndex(); @@ -335,12 +388,19 @@ contract ValidatorPoolTest is L2OutputOracle_Initializer { ) ) ); + vm.expectCall( + address(oracle), + abi.encodeWithSelector( + L2OutputOracle.setNextFinalizeOutputIndex.selector, + outputIndex + 1 + ) + ); vm.prank(trusted); pool.unbond(); assertEq(pool.balanceOf(output.submitter), uint256(bond.amount)); } - function test_unbond_multipleBonds_succeeds() public { + function test_unbond_multipleBonds_succeeds() external { uint256 tries = 2; uint256 deposit = requiredBondAmount * tries; vm.prank(trusted); @@ -351,7 +411,7 @@ contract ValidatorPoolTest is L2OutputOracle_Initializer { uint128 expiresAt = 0; for (uint256 i = 0; i < tries; i++) { blockNumber = oracle.nextBlockNumber(); - warpToSubmitTime(blockNumber); + warpToSubmitTime(); expiresAt = uint128(block.timestamp + finalizationPeriodSeconds); assertEq(pool.nextValidator(), trusted); vm.prank(trusted); @@ -402,6 +462,13 @@ contract ValidatorPoolTest is L2OutputOracle_Initializer { ) ) ); + vm.expectCall( + address(oracle), + abi.encodeWithSelector( + L2OutputOracle.setNextFinalizeOutputIndex.selector, + secondOutputIndex + 1 + ) + ); vm.prank(trusted); pool.unbond(); @@ -413,7 +480,7 @@ contract ValidatorPoolTest is L2OutputOracle_Initializer { assertEq(pool.balanceOf(trusted), deposit); } - function test_unbond_maxUnbond_succeeds() public { + function test_unbond_maxUnbond_succeeds() external { uint256 tries = maxUnbond + 1; uint256 deposit = requiredBondAmount * tries; vm.prank(trusted); @@ -424,7 +491,7 @@ contract ValidatorPoolTest is L2OutputOracle_Initializer { uint128 expiresAt = 0; for (uint256 i = 0; i < tries; i++) { blockNumber = oracle.nextBlockNumber(); - warpToSubmitTime(blockNumber); + warpToSubmitTime(); expiresAt = uint128(block.timestamp + finalizationPeriodSeconds); assertEq(pool.nextValidator(), trusted); vm.prank(trusted); @@ -450,6 +517,9 @@ contract ValidatorPoolTest is L2OutputOracle_Initializer { } bond = pool.getBond(tries - 1); assertEq(bond.amount, requiredBondAmount); + + // check if next finalize output index is set correctly + assertEq(oracle.nextFinalizeOutputIndex(), outputIndex); } function test_unbond_notExpired_reverts() external { @@ -507,7 +577,7 @@ contract ValidatorPoolTest is L2OutputOracle_Initializer { uint256 outputIndex = oracle.latestOutputIndex(); Types.Bond memory prevBond = pool.getBond(outputIndex); uint128 pendingBond = pool.getPendingBond(outputIndex, challenger); - uint128 tax = pendingBond * 20 / 100; // 20% tax + uint128 tax = (pendingBond * 20) / 100; // 20% tax uint128 increased = pendingBond - tax; vm.prank(oracle.COLOSSEUM()); @@ -628,7 +698,7 @@ contract ValidatorPoolTest is L2OutputOracle_Initializer { for (uint256 i = 0; i < tries; i++) { outputIndex = oracle.nextOutputIndex(); blockNumber = oracle.nextBlockNumber(); - warpToSubmitTime(blockNumber); + warpToSubmitTime(); expiresAt = uint128(block.timestamp + finalizationPeriodSeconds); vm.prank(pool.nextValidator()); mockOracle.addOutput(keccak256(abi.encode(blockNumber)), blockNumber); @@ -637,7 +707,7 @@ contract ValidatorPoolTest is L2OutputOracle_Initializer { } // warp to first finalization time and submit new output - warpToSubmitTime(oracle.nextBlockNumber()); + warpToSubmitTime(); outputIndex = oracle.nextOutputIndex(); blockNumber = (expiresAt / oracle.L2_BLOCK_TIME()) - 1; vm.warp(expiresAt); @@ -659,7 +729,7 @@ contract ValidatorPoolTest is L2OutputOracle_Initializer { // submit next output and finalize prev output outputIndex = oracle.nextOutputIndex(); blockNumber = oracle.nextBlockNumber(); - warpToSubmitTime(blockNumber); + warpToSubmitTime(); expiresAt = uint128(block.timestamp + finalizationPeriodSeconds); vm.prank(pool.nextValidator()); mockOracle.addOutput(keccak256(abi.encode(blockNumber)), blockNumber); @@ -670,7 +740,7 @@ contract ValidatorPoolTest is L2OutputOracle_Initializer { assertTrue(changed, "the next validator has not changed"); // warp to public round - uint256 l2Timestamp = oracle.computeL2Timestamp(oracle.nextBlockNumber() + 1); + uint256 l2Timestamp = oracle.nextOutputMinL2Timestamp(); vm.warp(l2Timestamp + roundDuration + 1); assertEq(pool.nextValidator(), Constants.VALIDATOR_PUBLIC_ROUND_ADDRESS); } @@ -681,8 +751,79 @@ contract ValidatorPoolTest is L2OutputOracle_Initializer { vm.deal(sc, depositAmount + 1 ether); vm.prank(sc); - pool.deposit{value: depositAmount}(); + pool.deposit{ value: depositAmount }(); assertEq(pool.balanceOf(sc), depositAmount); assertFalse(pool.isValidator(sc)); } } + +contract ValidatorPool_SystemUpgrade_Test is ValidatorSystemUpgrade_Initializer { + MockL2OutputOracle mockOracle; + MockValidatorPool mockPool; + + function setUp() public override { + super.setUp(); + + address oracleAddress = address(oracle); + MockL2OutputOracle mockOracleImpl = new MockL2OutputOracle( + pool, + valMgr, + address(colosseum), + submissionInterval, + l2BlockTime, + startingBlockNumber, + startingTimestamp, + finalizationPeriodSeconds + ); + vm.prank(multisig); + Proxy(payable(oracleAddress)).upgradeTo(address(mockOracleImpl)); + mockOracle = MockL2OutputOracle(oracleAddress); + + address poolAddress = address(pool); + MockValidatorPool mockPoolImpl = new MockValidatorPool( + oracle, + mockPortal, + guardian, + trusted, + requiredBondAmount, + maxUnbond, + roundDuration, + terminateOutputIndex + ); + vm.prank(multisig); + Proxy(payable(poolAddress)).upgradeTo(address(mockPoolImpl)); + mockPool = MockValidatorPool(poolAddress); + } + + function test_deposit_afterSystemUpgrade_reverts() external { + test_isTerminated_succeeds(); + + vm.deal(trusted, requiredBondAmount); + + vm.prank(trusted); + vm.expectRevert("ValidatorPool: only can deposit to ValidatorPool before terminated"); + pool.deposit{ value: requiredBondAmount }(); + } + + function test_isTerminated_succeeds() public { + vm.prank(trusted); + pool.deposit{ value: trusted.balance }(); + + bool poolTerminated; + for (uint256 i; i <= terminateOutputIndex + 1; i++) { + uint256 nextOutputIndex = oracle.nextOutputIndex(); + poolTerminated = pool.isTerminated(nextOutputIndex); + if (nextOutputIndex <= terminateOutputIndex) { + assertFalse(poolTerminated); + } else { + assertTrue(poolTerminated); + } + + warpToSubmitTime(); + uint256 nextBlockNumber = oracle.nextBlockNumber(); + bytes32 outputRoot = keccak256(abi.encode(nextBlockNumber)); + vm.prank(pool.nextValidator()); + mockOracle.addOutput(outputRoot, nextBlockNumber); + } + } +} diff --git a/packages/contracts/contracts/test/invariants/KromaPortal.t.sol b/packages/contracts/contracts/test/invariants/KromaPortal.t.sol index ffa4690fc7..5cb6922881 100644 --- a/packages/contracts/contracts/test/invariants/KromaPortal.t.sol +++ b/packages/contracts/contracts/test/invariants/KromaPortal.t.sol @@ -43,7 +43,7 @@ contract KromaPortal_Invariant_Harness is Portal_Initializer { _submittedOutputIndex = oracle.nextOutputIndex(); // Configure the oracle to return the output root we've prepared. - vm.warp(oracle.computeL2Timestamp(_submittedBlockNumber) + 1); + warpToSubmitTime(); vm.prank(trusted); oracle.submitL2Output(_outputRoot, _submittedBlockNumber, 0, 0); diff --git a/packages/contracts/contracts/universal/KromaVestingWallet.sol b/packages/contracts/contracts/universal/KromaVestingWallet.sol new file mode 100644 index 0000000000..0515fa0f87 --- /dev/null +++ b/packages/contracts/contracts/universal/KromaVestingWallet.sol @@ -0,0 +1,118 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.15; + +import "@openzeppelin/contracts-upgradeable/finance/VestingWalletUpgradeable.sol"; + +/** + * @custom:proxied + * @title KromaVestingWallet + * @notice KromaVestingWallet vests funds equally every `vestingCycle` for the duration from the + * start timestamp. `totalAllocation / cliffDivider` amount of the tokens will be vested at + * the start timestamp, and after that remaining tokens will be vested every `vestingCycle` + * for the duration. + */ +contract KromaVestingWallet is VestingWalletUpgradeable { + /** + * @notice The divider of total allocation to calculate the cliff amount to be vested at the + * start timestamp. + */ + uint256 public immutable CLIFF_DIVIDER; + + /** + * @notice The cycle that represents how often the funds are vested (unit: seconds). + */ + uint256 public immutable VESTING_CYCLE; + + /** + * @notice A modifier that only allows beneficiary to call. + */ + modifier onlyBeneficiary() { + require(msg.sender == beneficiary(), "KromaVestingWallet: caller is not beneficiary"); + _; + } + + /** + * @notice Constructs the KromaVestingWallet contract. + * + * @param _cliffDivider The divider to calculate the cliff amount at start timestamp. + * @param _vestingCycleSeconds The cycle that represents how often funds are vested. + */ + constructor(uint64 _cliffDivider, uint64 _vestingCycleSeconds) { + require(_cliffDivider > 0, "KromaVestingWallet: cliff divider is zero"); + require(_vestingCycleSeconds > 0, "KromaVestingWallet: vesting cycle is zero"); + + CLIFF_DIVIDER = _cliffDivider; + VESTING_CYCLE = _vestingCycleSeconds; + + _disableInitializers(); + } + + /** + * @notice Initializer. + * + * @param _beneficiary Address that can release funds and receives released funds. + * @param _startTimestamp The timestamp to start vesting. + * @param _durationSeconds The time period for funds to fully vest. + */ + function initialize( + address _beneficiary, + uint64 _startTimestamp, + uint64 _durationSeconds + ) public initializer { + require( + _durationSeconds % VESTING_CYCLE == 0, + "KromaVestingWallet: duration should be multiple of vesting cycle" + ); + + __VestingWallet_init(_beneficiary, _startTimestamp, _durationSeconds); + } + + /** + * @notice Releases the tokens that have already vested; only beneficiary can call. + * + * @param token Address of ERC20 token to release. + */ + function release(address token) public override onlyBeneficiary { + super.release(token); + } + + /** + * @notice Releases the native token (ether) that have already vested; only beneficiary can call. + */ + function release() public override onlyBeneficiary { + super.release(); + } + + /** + * @notice Overrides vesting formula. This returns the amount vested, as a function of time, for + * an asset given its total historical allocation. + * + * @param totalAllocation Total historical allocation of the asset. + * @param timestamp Timestamp to be used to calculate the vested amount. + * + * @return The amount vested, as a function of time, for an asset given its total historical + * allocation. + */ + function _vestingSchedule( + uint256 totalAllocation, + uint64 timestamp + ) internal view override returns (uint256) { + if (timestamp < start()) { + return 0; + } else if (timestamp >= start() + duration()) { + return totalAllocation; + } else { + // At the start date, cliff amount of the assets are immediately vested. + // After, the assets will be vested proportionally every vesting cycle for the duration. + uint256 cliffAmount = totalAllocation / CLIFF_DIVIDER; + + // Since vested in units of cycle, remove any seconds over the end of last cycle. + uint256 vestedSeconds = timestamp - start(); + uint256 vestedSecondsFloored = vestedSeconds - (vestedSeconds % VESTING_CYCLE); + uint256 afterVestedAmount = ((totalAllocation - cliffAmount) * vestedSecondsFloored) / + duration(); + + return cliffAmount + afterVestedAmount; + } + } +} diff --git a/packages/contracts/deploy-config/devnetL1-template.json b/packages/contracts/deploy-config/devnetL1-template.json index 823a3b505a..7ddeb0d090 100644 --- a/packages/contracts/deploy-config/devnetL1-template.json +++ b/packages/contracts/deploy-config/devnetL1-template.json @@ -25,9 +25,6 @@ "gasPriceOracleOverhead": 2100, "gasPriceOracleScalar": 1000000, "enableGovernance": true, - "governanceTokenSymbol": "KRO", - "governanceTokenName": "Kroma", - "governanceTokenOwner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "eip1559Denominator": 50, "eip1559DenominatorCanyon": 250, "eip1559Elasticity": 6, @@ -37,16 +34,29 @@ "l2GenesisDeltaTimeOffset": "0x0", "l2GenesisEcotoneTimeOffset": "0x2", "systemConfigStartBlock": 0, - "validatorRewardScalar": 5000, "validatorPoolTrustedValidator": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", "validatorPoolRequiredBondAmount": "0x1", "validatorPoolMaxUnbond": 10, "validatorPoolRoundDuration": 4, + "validatorPoolTerminateOutputIndex": "0x32", + "validatorManagerTrustedValidator": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + "validatorManagerMinRegisterAmount": "0x32", + "validatorManagerMinActivateAmount": "0x64", + "validatorManagerCommissionChangeDelaySeconds": 120, + "validatorManagerRoundDurationSeconds": 4, + "validatorManagerSoftJailPeriodSeconds": 60, + "validatorManagerHardJailPeriodSeconds": 120, + "validatorManagerJailThreshold": 2, + "validatorManagerMaxFinalizations": 10, + "validatorManagerBaseReward": "0x14", + "assetManagerKgh": "0xff000000000000000000000000000000000000ff", + "assetManagerVault": "0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f", + "assetManagerMinDelegationPeriod": 120, + "assetManagerBondAmount": "0xa", "securityCouncilOwners": [ "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", - "0x71bE63f3384f5fb98995898A86B02Fb2426c5788", - "0xFABB0ac9d68B0B445fB7357272Ff202C5651694a" + "0x1CBd3b2770909D4e10f157cABC84C7264073C9Ec" ], "governorVotingDelayBlocks": 0, "governorVotingPeriodBlocks": 100, @@ -55,7 +65,7 @@ "timeLockMinDelaySeconds": 1, "l2GovernorVotingPeriodBlocks": 150, "l2TimeLockMinDelaySeconds": 300, - "colosseumCreationPeriodSeconds": 60, + "colosseumCreationPeriodSeconds": 100, "colosseumBisectionTimeout": 30, "colosseumProvingTimeout": 30, "colosseumDummyHash": "0xa1235b834d6f1f78f78bc4db856fbc49302cce2c519921347600693021e087f7", @@ -63,5 +73,34 @@ "colosseumSegmentsLengths": "2,2,3,3", "zkVerifierHashScalar": "0xb54142d3712f03ff5c15914a3dce82c0d8a8d537e165e2342048adf14e34aa", "zkVerifierM56Px": "0x175a2d1aaf07ee184a955e35f3deac123ef1088b68c38bace37056dcfc9d304d", - "zkVerifierM56Py": "0x150856c3d1750c2578b823cb3c7d74ed3e94c1cfece7e1bfdaaff36eea788fb9" + "zkVerifierM56Py": "0x150856c3d1750c2578b823cb3c7d74ed3e94c1cfece7e1bfdaaff36eea788fb9", + "governanceTokenNotUseCreate2": true, + "governanceTokenProxySalt": "0x0000000000000000000000000000000000000000000000000000004b726f6d61", + "mintManagerOwner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "l1MintManagerRecipients": [ + "0x14dC79964da2C08b23698B3D3cc7Ca32193d9955", + "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720" + ], + "l1MintManagerShares": [ + 2000, + 3000 + ], + "l2MintManagerRecipients": [ + "0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65", + "0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f", + "0x2546BcD3c84621e976D8185a91A922aE77ECEc30", + "0x8626f6940E2eb28930eFb4CeF49B2d1F2C9C1199", + "0x90F79bf6EB2c4f870365E785982E1f101E93b906", + "0x976EA74026E726554dB657fA54763abd0C3a0aa9", + "0xBcd4042DE499D14e55001CcbB24a551F3b954096" + ], + "l2MintManagerShares": [ + 2000, + 16000, + 7000, + 13000, + 25000, + 15000, + 17000 + ] } diff --git a/packages/contracts/deploy-config/mainnet.json b/packages/contracts/deploy-config/mainnet.json index 63715b0762..042f653bc3 100644 --- a/packages/contracts/deploy-config/mainnet.json +++ b/packages/contracts/deploy-config/mainnet.json @@ -46,5 +46,29 @@ "l2TimeLockMinDelaySeconds": 604800, "zkVerifierHashScalar": "0x2FC715229F110C0240EEE5BDE4C9A1AD3BCD8F344A7450BB54D83BF2AB204F57", "zkVerifierM56Px": "0x13AFF223C765EE57720AD99D4DAEF90D6509B97318A84CB5D926295874DFB9A8", - "zkVerifierM56Py": "0x2F94CE8D448F4C3FC89DBDF3320EE1850B3FFDC50D260E2BB09F6FEAED846B1B" + "zkVerifierM56Py": "0x2F94CE8D448F4C3FC89DBDF3320EE1850B3FFDC50D260E2BB09F6FEAED846B1B", + "governanceTokenProxySalt": "0x62770b858e90d560f80deb05ad8edbcc48e12d3b38110ce709025d5545a9d3c8", + "mintManagerOwner": "0xc0ab283E81aE99197Cfe1C8BEE9C593CD4FF7FB3", + "l1MintManagerRecipients": [ + "0x17969605cdaF78CEFE7d5BFAd3a8563F8cEaBf4D" + ], + "l1MintManagerShares": [ + 5200 + ], + "l2MintManagerRecipients": [ + "0xCaBEA75d7DfB70648e54b2a94ae1BA169f8a1114", + "0x7e5d87915Ed5d3380513f92180579B2497624DDF", + "0xcf4C24793C24E177976e37bF70751a9d78B90140", + "0xd94954f3A323A7947e65D978b55BCa4144c44Ae9", + "0xf4dE61D01028E4e7f1Eb62169723C990Faa09f04", + "0x06F6e40D72Fc57B625aDC995D721E5a41A603a08" + ], + "l2MintManagerShares": [ + 40000, + 17000, + 7000, + 15800, + 2000, + 13000 + ] } diff --git a/packages/contracts/deploy-config/sepolia.json b/packages/contracts/deploy-config/sepolia.json index 78cba23259..1d494dfa6a 100644 --- a/packages/contracts/deploy-config/sepolia.json +++ b/packages/contracts/deploy-config/sepolia.json @@ -53,5 +53,29 @@ "l2TimeLockMinDelaySeconds": 300, "zkVerifierHashScalar": "0xD7496D9D15F9DB7697DF22201FBD73BDC504FBCCBDB34FAA64D43A80361484D", "zkVerifierM56Px": "0x59F73EE44B2ACAC480F776270FBF58A5974CE47EC9F7682844E89F17CAEA4F2", - "zkVerifierM56Py": "0xD7DC3CAC83BA451AB1DD0428B4593FA07198058425B9D672C6F0C087432AF73" + "zkVerifierM56Py": "0xD7DC3CAC83BA451AB1DD0428B4593FA07198058425B9D672C6F0C087432AF73", + "governanceTokenProxySalt": "0x62770b858e90d560f80deb05ad8edbcc48e12d3b38110ce709025d5545a9d3c8", + "mintManagerOwner": "0x80e695eceb5bea3b1788c4dfb40b72afc59f60d8", + "l1MintManagerRecipients": [ + "0xc2da150ecfaa2e275577203bb177dd4de4a2536e" + ], + "l1MintManagerShares": [ + 5200 + ], + "l2MintManagerRecipients": [ + "0x0c75dc81a35109e2a8b7b7e3589e91bb1b82c7d7", + "0xefedaa42551d57083b798bc2c48b9d7a41135b55", + "0xc4d6d492d5141939faee016057596e0f3038b840", + "0xbe5cc7e6725798958a8f79c63b3a986c6881c3ca", + "0xa9a3af107fb75663b09c6ea7c22b8931b15a08da", + "0x9fd58bb76cfa959bc8d2ff3c0101c1243e513da4" + ], + "l2MintManagerShares": [ + 40000, + 17000, + 7000, + 15800, + 2000, + 13000 + ] } diff --git a/packages/contracts/deploy/L1/001-Proxies.ts b/packages/contracts/deploy/L1/001-Proxies.ts index f11fe6ffea..ec6227cea4 100644 --- a/packages/contracts/deploy/L1/001-Proxies.ts +++ b/packages/contracts/deploy/L1/001-Proxies.ts @@ -17,7 +17,8 @@ const PROXY_NAMES = [ 'SecurityCouncilTokenProxy', 'TimeLockProxy', 'UpgradeGovernorProxy', - 'L1GovernanceTokenProxy', + 'AssetManagerProxy', + 'ValidatorManagerProxy', ] const deployFn: DeployFunction = async (hre) => { diff --git a/packages/contracts/deploy/L1/007-ValidatorPool.ts b/packages/contracts/deploy/L1/007-ValidatorPool.ts index 5bd4db3fa6..c0f452c4dd 100644 --- a/packages/contracts/deploy/L1/007-ValidatorPool.ts +++ b/packages/contracts/deploy/L1/007-ValidatorPool.ts @@ -24,6 +24,7 @@ const deployFn: DeployFunction = async (hre) => { hre.deployConfig.validatorPoolRequiredBondAmount, hre.deployConfig.validatorPoolMaxUnbond, hre.deployConfig.validatorPoolRoundDuration, + hre.deployConfig.validatorPoolTerminateOutputIndex, ], isProxyImpl: true, initArgs: [], @@ -55,10 +56,15 @@ const deployFn: DeployFunction = async (hre) => { 'ROUND_DURATION', hre.deployConfig.validatorPoolRoundDuration ) + await assertContractVariable( + contract, + 'TERMINATE_OUTPUT_INDEX', + hre.deployConfig.validatorPoolTerminateOutputIndex + ) }, }) } -deployFn.tags = ['ValidatorPool', 'setup', 'l1'] +deployFn.tags = ['ValidatorPool', 'setup', 'l1', 'validatorSystemUpgrade'] export default deployFn diff --git a/packages/contracts/deploy/L1/008-L2OutputOracle.ts b/packages/contracts/deploy/L1/008-L2OutputOracle.ts index 432d15bc30..be5644a5c9 100644 --- a/packages/contracts/deploy/L1/008-L2OutputOracle.ts +++ b/packages/contracts/deploy/L1/008-L2OutputOracle.ts @@ -13,6 +13,10 @@ const deployFn: DeployFunction = async (hre) => { hre, 'ValidatorPoolProxy' ) + const validatorManagerProxyAddress = await getDeploymentAddress( + hre, + 'ValidatorManagerProxy' + ) const colosseumProxyAddress = await getDeploymentAddress( hre, 'ColosseumProxy' @@ -36,6 +40,7 @@ const deployFn: DeployFunction = async (hre) => { await deploy(hre, 'L2OutputOracle', { args: [ validatorPoolProxyAddress, + validatorManagerProxyAddress, colosseumProxyAddress, hre.deployConfig.l2OutputOracleSubmissionInterval, hre.deployConfig.l2BlockTime, @@ -59,15 +64,16 @@ const deployFn: DeployFunction = async (hre) => { 'L2_BLOCK_TIME', hre.deployConfig.l2BlockTime ) + await assertContractVariable(contract, 'COLOSSEUM', colosseumProxyAddress) await assertContractVariable( contract, - 'COLOSSEUM', - colosseumProxyAddress + 'VALIDATOR_POOL', + validatorPoolProxyAddress ) await assertContractVariable( contract, - 'VALIDATOR_POOL', - validatorPoolProxyAddress + 'VALIDATOR_MANAGER', + validatorManagerProxyAddress ) await assertContractVariable( contract, @@ -78,6 +84,6 @@ const deployFn: DeployFunction = async (hre) => { }) } -deployFn.tags = ['L2OutputOracle', 'setup', 'l1'] +deployFn.tags = ['L2OutputOracle', 'setup', 'l1', 'validatorSystemUpgrade'] export default deployFn diff --git a/packages/contracts/deploy/L1/010-Colosseum.ts b/packages/contracts/deploy/L1/010-Colosseum.ts index 6496dd1230..f0c3684a3c 100644 --- a/packages/contracts/deploy/L1/010-Colosseum.ts +++ b/packages/contracts/deploy/L1/010-Colosseum.ts @@ -8,7 +8,10 @@ import { } from '../../src/deploy-utils' const deployFn: DeployFunction = async (hre) => { - const zkVerifierProxyAddress = await getDeploymentAddress(hre, 'ZKVerifierProxy') + const zkVerifierProxyAddress = await getDeploymentAddress( + hre, + 'ZKVerifierProxy' + ) const l2OutputOracleProxyAddress = await getDeploymentAddress( hre, 'L2OutputOracleProxy' @@ -90,6 +93,6 @@ const deployFn: DeployFunction = async (hre) => { }) } -deployFn.tags = ['Colosseum', 'setup', 'l1'] +deployFn.tags = ['Colosseum', 'setup', 'l1', 'validatorSystemUpgrade'] export default deployFn diff --git a/packages/contracts/deploy/L1/017-GovernanceToken.ts b/packages/contracts/deploy/L1/017-GovernanceToken.ts deleted file mode 100644 index 7a40bc6c50..0000000000 --- a/packages/contracts/deploy/L1/017-GovernanceToken.ts +++ /dev/null @@ -1,43 +0,0 @@ -import '@kroma/hardhat-deploy-config' -import { ethers } from 'ethers' -import { DeployFunction } from 'hardhat-deploy/dist/types' - -import { predeploys } from '../../src' -import { - assertContractVariable, - deploy, - getDeploymentAddress, -} from '../../src/deploy-utils' - -const deployFn: DeployFunction = async (hre) => { - const zeroAddress = ethers.constants.AddressZero - const l1StandardBridgeProxyAddress = await getDeploymentAddress( - hre, - 'L1StandardBridgeProxy' - ) - - await deploy(hre, 'L1GovernanceToken', { - contract: 'GovernanceToken', - args: [ - l1StandardBridgeProxyAddress, - predeploys.GovernanceToken, - ], - isProxyImpl: true, - postDeployAction: async (contract) => { - await assertContractVariable( - contract, - 'BRIDGE', - l1StandardBridgeProxyAddress - ) - await assertContractVariable( - contract, - 'REMOTE_TOKEN', - predeploys.GovernanceToken - ) - }, - }) -} - -deployFn.tags = ['L1GovernanceToken', 'setup', 'l1', 'tge'] - -export default deployFn diff --git a/packages/contracts/deploy/L1/017-L1GovernanceTokenProxy.ts b/packages/contracts/deploy/L1/017-L1GovernanceTokenProxy.ts new file mode 100644 index 0000000000..54639badb7 --- /dev/null +++ b/packages/contracts/deploy/L1/017-L1GovernanceTokenProxy.ts @@ -0,0 +1,24 @@ +import { DeployFunction } from 'hardhat-deploy/dist/types' + +import { deployDeterministicProxy, deployProxy } from '../../src/deploy-utils' + +const deployFn: DeployFunction = async (hre) => { + // Deploy proxy contract with deployer as admin + const { deployer } = await hre.getNamedAccounts() + const name = 'L1GovernanceTokenProxy' + + if (hre.deployConfig.governanceTokenNotUseCreate2) { + await deployProxy(hre, name, deployer) + } else { + await deployDeterministicProxy( + hre, + name, + deployer, + hre.deployConfig.governanceTokenProxySalt + ) + } +} + +deployFn.tags = ['L1GovernanceTokenProxy', 'setup', 'l1', 'tge'] + +export default deployFn diff --git a/packages/contracts/deploy/L1/018-L1MintManager.ts b/packages/contracts/deploy/L1/018-L1MintManager.ts new file mode 100644 index 0000000000..9b9ce6c878 --- /dev/null +++ b/packages/contracts/deploy/L1/018-L1MintManager.ts @@ -0,0 +1,41 @@ +import '@kroma/hardhat-deploy-config' +import { DeployFunction } from 'hardhat-deploy/dist/types' + +import { + assertContractVariable, + deploy, + getDeploymentAddress, +} from '../../src/deploy-utils' + +const deployFn: DeployFunction = async (hre) => { + const l1GovernanceTokenProxyAddress = await getDeploymentAddress( + hre, + 'L1GovernanceTokenProxy' + ) + + await deploy(hre, 'L1MintManager', { + contract: 'MintManager', + args: [ + l1GovernanceTokenProxyAddress, + hre.deployConfig.mintManagerOwner, + hre.deployConfig.l1MintManagerRecipients, + hre.deployConfig.l1MintManagerShares, + ], + postDeployAction: async (contract) => { + await assertContractVariable( + contract, + 'GOVERNANCE_TOKEN', + l1GovernanceTokenProxyAddress + ) + await assertContractVariable( + contract, + 'pendingOwner', + hre.deployConfig.mintManagerOwner + ) + }, + }) +} + +deployFn.tags = ['L1MintManager', 'setup', 'l1', 'tge'] + +export default deployFn diff --git a/packages/contracts/deploy/L1/019-L1GovernanceToken.ts b/packages/contracts/deploy/L1/019-L1GovernanceToken.ts new file mode 100644 index 0000000000..29d6bc8ada --- /dev/null +++ b/packages/contracts/deploy/L1/019-L1GovernanceToken.ts @@ -0,0 +1,65 @@ +import '@kroma/hardhat-deploy-config' +import { DeployFunction } from 'hardhat-deploy/dist/types' + +import { + assertContractVariable, + deployAndUpgradeByDeployer, + getDeploymentAddress, +} from '../../src/deploy-utils' + +const deployFn: DeployFunction = async (hre) => { + const l1StandardBridgeProxyAddress = await getDeploymentAddress( + hre, + 'L1StandardBridgeProxy' + ) + const governanceTokenProxyAddress = await getDeploymentAddress( + hre, + 'L1GovernanceTokenProxy' + ) + const l1MintManagerAddress = await getDeploymentAddress(hre, 'L1MintManager') + + await deployAndUpgradeByDeployer(hre, 'L1GovernanceToken', { + contract: 'GovernanceToken', + args: [l1StandardBridgeProxyAddress, governanceTokenProxyAddress], + initArgs: [l1MintManagerAddress], + postDeployAction: async (contract) => { + await assertContractVariable( + contract, + 'BRIDGE', + l1StandardBridgeProxyAddress + ) + await assertContractVariable( + contract, + 'REMOTE_TOKEN', + governanceTokenProxyAddress + ) + }, + }) + + // Ensure variables are set correctly after initialization + const upgradedProxy = await hre.ethers.getContractAt( + 'GovernanceToken', + governanceTokenProxyAddress + ) + assertContractVariable(upgradedProxy, 'pendingOwner', l1MintManagerAddress) + + // Change admin of L1GovernanceTokenProxy to mintManagerOwner + const { deployer } = await hre.getNamedAccounts() + const signer = hre.ethers.provider.getSigner(deployer) + const l1GovernanceTokenProxy = await hre.ethers.getContractAt( + 'Proxy', + governanceTokenProxyAddress + ) + const contractWithSigner = l1GovernanceTokenProxy.connect(signer) + const tx = await contractWithSigner.changeAdmin( + hre.deployConfig.mintManagerOwner + ) + await tx.wait() + console.log( + `changed admin of "L1GovernanceTokenProxy" to ${hre.deployConfig.mintManagerOwner}` + ) +} + +deployFn.tags = ['L1GovernanceToken', 'setup', 'l1', 'tge'] + +export default deployFn diff --git a/packages/contracts/deploy/L1/020-AssetManager.ts b/packages/contracts/deploy/L1/020-AssetManager.ts new file mode 100644 index 0000000000..3c6a6d2b61 --- /dev/null +++ b/packages/contracts/deploy/L1/020-AssetManager.ts @@ -0,0 +1,71 @@ +import '@kroma/hardhat-deploy-config' +import '@nomiclabs/hardhat-ethers' +import { DeployFunction } from 'hardhat-deploy/dist/types' + +import { + assertContractVariable, + deploy, + getDeploymentAddress, +} from '../../src/deploy-utils' + +const deployFn: DeployFunction = async (hre) => { + const l1GovernanceTokenProxyAddress = await getDeploymentAddress( + hre, + 'L1GovernanceTokenProxy' + ) + const scProxyAddress = await getDeploymentAddress(hre, 'SecurityCouncilProxy') + const valMgrProxyAddress = await getDeploymentAddress( + hre, + 'ValidatorManagerProxy' + ) + + await deploy(hre, 'AssetManager', { + args: [ + l1GovernanceTokenProxyAddress, + hre.deployConfig.assetManagerKgh, + scProxyAddress, + hre.deployConfig.assetManagerVault, + valMgrProxyAddress, + hre.deployConfig.assetManagerMinDelegationPeriod, + hre.deployConfig.assetManagerBondAmount, + ], + isProxyImpl: true, + postDeployAction: async (contract) => { + await assertContractVariable( + contract, + 'ASSET_TOKEN', + l1GovernanceTokenProxyAddress + ) + await assertContractVariable( + contract, + 'KGH', + hre.deployConfig.assetManagerKgh + ) + await assertContractVariable(contract, 'SECURITY_COUNCIL', scProxyAddress) + await assertContractVariable( + contract, + 'VALIDATOR_REWARD_VAULT', + hre.deployConfig.assetManagerVault + ) + await assertContractVariable( + contract, + 'VALIDATOR_MANAGER', + valMgrProxyAddress + ) + await assertContractVariable( + contract, + 'MIN_DELEGATION_PERIOD', + hre.deployConfig.assetManagerMinDelegationPeriod + ) + await assertContractVariable( + contract, + 'BOND_AMOUNT', + hre.deployConfig.assetManagerBondAmount + ) + }, + }) +} + +deployFn.tags = ['AssetManager', 'setup', 'l1', 'validatorSystemUpgrade'] + +export default deployFn diff --git a/packages/contracts/deploy/L1/021-ValidatorManager.ts b/packages/contracts/deploy/L1/021-ValidatorManager.ts new file mode 100644 index 0000000000..733a08ac09 --- /dev/null +++ b/packages/contracts/deploy/L1/021-ValidatorManager.ts @@ -0,0 +1,120 @@ +import '@kroma/hardhat-deploy-config' +import '@nomiclabs/hardhat-ethers' +import assert from 'assert' + +import { DeployFunction } from 'hardhat-deploy/dist/types' + +import { + assertContractVariable, + deploy, + getDeploymentAddress, +} from '../../src/deploy-utils' + +const deployFn: DeployFunction = async (hre) => { + const l2OutputOracleProxyAddress = await getDeploymentAddress( + hre, + 'L2OutputOracleProxy' + ) + const assetManagerProxyAddress = await getDeploymentAddress( + hre, + 'AssetManagerProxy' + ) + + assert( + (hre.deployConfig.l2OutputOracleSubmissionInterval * + hre.deployConfig.l2BlockTime) / + 2 === + hre.deployConfig.validatorManagerRoundDurationSeconds + ) + + await deploy(hre, 'ValidatorManager', { + args: [ + { + _l2Oracle: l2OutputOracleProxyAddress, + _assetManager: assetManagerProxyAddress, + _trustedValidator: hre.deployConfig.validatorManagerTrustedValidator, + _commissionChangeDelaySeconds: + hre.deployConfig.validatorManagerCommissionChangeDelaySeconds, + _roundDurationSeconds: + hre.deployConfig.validatorManagerRoundDurationSeconds, + _softJailPeriodSeconds: + hre.deployConfig.validatorManagerSoftJailPeriodSeconds, + _hardJailPeriodSeconds: + hre.deployConfig.validatorManagerHardJailPeriodSeconds, + _jailThreshold: hre.deployConfig.validatorManagerJailThreshold, + _maxOutputFinalizations: + hre.deployConfig.validatorManagerMaxFinalizations, + _baseReward: hre.deployConfig.validatorManagerBaseReward, + _minRegisterAmount: hre.deployConfig.validatorManagerMinRegisterAmount, + _minActivateAmount: hre.deployConfig.validatorManagerMinActivateAmount, + }, + ], + isProxyImpl: true, + postDeployAction: async (contract) => { + await assertContractVariable( + contract, + 'L2_ORACLE', + l2OutputOracleProxyAddress + ) + await assertContractVariable( + contract, + 'ASSET_MANAGER', + assetManagerProxyAddress + ) + await assertContractVariable( + contract, + 'TRUSTED_VALIDATOR', + hre.deployConfig.validatorManagerTrustedValidator + ) + await assertContractVariable( + contract, + 'MIN_REGISTER_AMOUNT', + hre.deployConfig.validatorManagerMinRegisterAmount + ) + await assertContractVariable( + contract, + 'MIN_ACTIVATE_AMOUNT', + hre.deployConfig.validatorManagerMinActivateAmount + ) + await assertContractVariable( + contract, + 'COMMISSION_CHANGE_DELAY_SECONDS', + hre.deployConfig.validatorManagerCommissionChangeDelaySeconds + ) + await assertContractVariable( + contract, + 'ROUND_DURATION_SECONDS', + hre.deployConfig.validatorManagerRoundDurationSeconds + ) + await assertContractVariable( + contract, + 'SOFT_JAIL_PERIOD_SECONDS', + hre.deployConfig.validatorManagerSoftJailPeriodSeconds + ) + await assertContractVariable( + contract, + 'HARD_JAIL_PERIOD_SECONDS', + hre.deployConfig.validatorManagerHardJailPeriodSeconds + ) + await assertContractVariable( + contract, + 'JAIL_THRESHOLD', + hre.deployConfig.validatorManagerJailThreshold + ) + await assertContractVariable( + contract, + 'MAX_OUTPUT_FINALIZATIONS', + hre.deployConfig.validatorManagerMaxFinalizations + ) + await assertContractVariable( + contract, + 'BASE_REWARD', + hre.deployConfig.validatorManagerBaseReward + ) + }, + }) +} + +deployFn.tags = ['ValidatorManager', 'setup', 'l1', 'validatorSystemUpgrade'] + +export default deployFn diff --git a/packages/contracts/deploy/L2/011-GovernanceToken.ts b/packages/contracts/deploy/L2/011-GovernanceToken.ts deleted file mode 100644 index aae27c9939..0000000000 --- a/packages/contracts/deploy/L2/011-GovernanceToken.ts +++ /dev/null @@ -1,38 +0,0 @@ -import '@kroma/hardhat-deploy-config' -import { DeployFunction } from 'hardhat-deploy/dist/types' - -import { assertContractVariable, deploy, getDeploymentAddress } from '../../src/deploy-utils' - -const deployFn: DeployFunction = async (hre) => { - const Artifact__L1GovernanceTokenProxy = await hre.companionNetworks[ - 'l1' - ].deployments.get('L1GovernanceTokenProxy') - const l2StandardBridgeProxyAddress = await getDeploymentAddress( - hre, - 'L2StandardBridgeProxy' - ) - - await deploy(hre, 'GovernanceToken', { - args: [ - l2StandardBridgeProxyAddress, - Artifact__L1GovernanceTokenProxy.address, - ], - isProxyImpl: true, - postDeployAction: async (contract) => { - await assertContractVariable( - contract, - 'BRIDGE', - l2StandardBridgeProxyAddress - ) - await assertContractVariable( - contract, - 'REMOTE_TOKEN', - Artifact__L1GovernanceTokenProxy.address, - ) - }, - }) -} - -deployFn.tags = ['GovernanceToken', 'setup', 'l2', 'tge'] - -export default deployFn diff --git a/packages/contracts/deploy/L2/011-GovernanceTokenProxy.ts b/packages/contracts/deploy/L2/011-GovernanceTokenProxy.ts new file mode 100644 index 0000000000..f44d4c2166 --- /dev/null +++ b/packages/contracts/deploy/L2/011-GovernanceTokenProxy.ts @@ -0,0 +1,22 @@ +import { DeployFunction } from 'hardhat-deploy/dist/types' + +import { deployDeterministicProxy } from '../../src/deploy-utils' + +const deployFn: DeployFunction = async (hre) => { + // Deploy proxy contract with deployer as admin + const { deployer } = await hre.getNamedAccounts() + + const l1 = hre.network.companionNetworks['l1'] + const deployConfig = hre.getDeployConfig(l1) + + await deployDeterministicProxy( + hre, + 'GovernanceTokenProxy', + deployer, + deployConfig.governanceTokenProxySalt + ) +} + +deployFn.tags = ['GovernanceTokenProxy', 'l2', 'tge'] + +export default deployFn diff --git a/packages/contracts/deploy/L2/012-MintManager.ts b/packages/contracts/deploy/L2/012-MintManager.ts new file mode 100644 index 0000000000..55e18f8be0 --- /dev/null +++ b/packages/contracts/deploy/L2/012-MintManager.ts @@ -0,0 +1,43 @@ +import '@kroma/hardhat-deploy-config' +import { DeployFunction } from 'hardhat-deploy/dist/types' + +import { + assertContractVariable, + deploy, + getDeploymentAddress, +} from '../../src/deploy-utils' + +const deployFn: DeployFunction = async (hre) => { + const l1 = hre.network.companionNetworks['l1'] + const deployConfig = hre.getDeployConfig(l1) + + const GovernanceTokenProxyAddress = await getDeploymentAddress( + hre, + 'GovernanceTokenProxy' + ) + + await deploy(hre, 'MintManager', { + args: [ + GovernanceTokenProxyAddress, + deployConfig.mintManagerOwner, + deployConfig.l2MintManagerRecipients, + deployConfig.l2MintManagerShares, + ], + postDeployAction: async (contract) => { + await assertContractVariable( + contract, + 'GOVERNANCE_TOKEN', + GovernanceTokenProxyAddress + ) + await assertContractVariable( + contract, + 'pendingOwner', + deployConfig.mintManagerOwner + ) + }, + }) +} + +deployFn.tags = ['MintManager', 'l2', 'tge'] + +export default deployFn diff --git a/packages/contracts/deploy/L2/013-GovernanceToken.ts b/packages/contracts/deploy/L2/013-GovernanceToken.ts new file mode 100644 index 0000000000..0c5dae2cef --- /dev/null +++ b/packages/contracts/deploy/L2/013-GovernanceToken.ts @@ -0,0 +1,62 @@ +import '@kroma/hardhat-deploy-config' +import { DeployFunction } from 'hardhat-deploy/dist/types' + +import { predeploys } from '../../src' +import { + assertContractVariable, + deployAndUpgradeByDeployer, + getDeploymentAddress, +} from '../../src/deploy-utils' + +const deployFn: DeployFunction = async (hre) => { + const l1 = hre.network.companionNetworks['l1'] + const deployConfig = hre.getDeployConfig(l1) + + const governanceTokenProxyAddress = await getDeploymentAddress( + hre, + 'GovernanceTokenProxy' + ) + const mintManagerAddress = await getDeploymentAddress(hre, 'MintManager') + + await deployAndUpgradeByDeployer(hre, 'GovernanceToken', { + args: [predeploys.L2StandardBridge, governanceTokenProxyAddress], + initArgs: [mintManagerAddress], + postDeployAction: async (contract) => { + await assertContractVariable( + contract, + 'BRIDGE', + predeploys.L2StandardBridge + ) + await assertContractVariable( + contract, + 'REMOTE_TOKEN', + governanceTokenProxyAddress + ) + }, + }) + + // Ensure variables are set correctly after initialization + const upgradedProxy = await hre.ethers.getContractAt( + 'GovernanceToken', + governanceTokenProxyAddress + ) + assertContractVariable(upgradedProxy, 'pendingOwner', mintManagerAddress) + + // Change admin of GovernanceTokenProxy to mintManagerOwner + const { deployer } = await hre.getNamedAccounts() + const signer = hre.ethers.provider.getSigner(deployer) + const governanceTokenProxy = await hre.ethers.getContractAt( + 'Proxy', + governanceTokenProxyAddress + ) + const contractWithSigner = governanceTokenProxy.connect(signer) + const tx = await contractWithSigner.changeAdmin(deployConfig.mintManagerOwner) + await tx.wait() + console.log( + `changed admin of "GovernanceTokenProxy" to ${deployConfig.mintManagerOwner}` + ) +} + +deployFn.tags = ['GovernanceToken', 'l2', 'tge'] + +export default deployFn diff --git a/packages/contracts/deployments/kroma/GovernanceToken.json b/packages/contracts/deployments/kroma/GovernanceToken.json new file mode 100644 index 0000000000..4a66899cc0 --- /dev/null +++ b/packages/contracts/deployments/kroma/GovernanceToken.json @@ -0,0 +1,1272 @@ +{ + "address": "0xe53d264f398c8E3A55e91962b8C446Ec2381d1f8", + "abi": [ + { + "type": "constructor", + "inputs": [ + { + "name": "_bridge", + "type": "address", + "internalType": "address" + }, + { + "name": "_remoteToken", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "BRIDGE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "CLOCK_MODE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "DOMAIN_SEPARATOR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "REMOTE_TOKEN", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "acceptOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "allowance", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "spender", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "spender", + "type": "address", + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "burn", + "inputs": [ + { + "name": "_from", + "type": "address", + "internalType": "address" + }, + { + "name": "_amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "checkpoints", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + }, + { + "name": "pos", + "type": "uint32", + "internalType": "uint32" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct ERC20Votes.Checkpoint", + "components": [ + { + "name": "fromBlock", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "votes", + "type": "uint224", + "internalType": "uint224" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "clock", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint48", + "internalType": "uint48" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "decimals", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "decreaseAllowance", + "inputs": [ + { + "name": "spender", + "type": "address", + "internalType": "address" + }, + { + "name": "subtractedValue", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "delegate", + "inputs": [ + { + "name": "delegatee", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "delegateBySig", + "inputs": [ + { + "name": "delegatee", + "type": "address", + "internalType": "address" + }, + { + "name": "nonce", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "expiry", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "v", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "r", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "s", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "delegates", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "eip712Domain", + "inputs": [], + "outputs": [ + { + "name": "fields", + "type": "bytes1", + "internalType": "bytes1" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "version", + "type": "string", + "internalType": "string" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "verifyingContract", + "type": "address", + "internalType": "address" + }, + { + "name": "salt", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "extensions", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPastTotalSupply", + "inputs": [ + { + "name": "timepoint", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPastVotes", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + }, + { + "name": "timepoint", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getVotes", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "increaseAllowance", + "inputs": [ + { + "name": "spender", + "type": "address", + "internalType": "address" + }, + { + "name": "addedValue", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "initialize", + "inputs": [ + { + "name": "_owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "mint", + "inputs": [ + { + "name": "_to", + "type": "address", + "internalType": "address" + }, + { + "name": "_amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "nonces", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "numCheckpoints", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint32", + "internalType": "uint32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "pendingOwner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "permit", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "spender", + "type": "address", + "internalType": "address" + }, + { + "name": "value", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "deadline", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "v", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "r", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "s", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "renounceOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "supportsInterface", + "inputs": [ + { + "name": "_interfaceId", + "type": "bytes4", + "internalType": "bytes4" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "totalSupply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transfer", + "inputs": [ + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "transferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "version", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "spender", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "value", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Burn", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "DelegateChanged", + "inputs": [ + { + "name": "delegator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "fromDelegate", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "toDelegate", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "DelegateVotesChanged", + "inputs": [ + { + "name": "delegate", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "previousBalance", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "newBalance", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "EIP712DomainChanged", + "inputs": [], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint8", + "indexed": false, + "internalType": "uint8" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Mint", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferStarted", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "value", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "InvalidShortString", + "inputs": [] + }, + { + "type": "error", + "name": "StringTooLong", + "inputs": [ + { + "name": "str", + "type": "string", + "internalType": "string" + } + ] + } + ], + "transactionHash": "0x056d80cabef69c57e05c6367b4763eefc2bde44bb57d9055d2a0880ff8b23811", + "receipt": { + "to": null, + "from": "0xcc56801a72463d39903A4a4632E600289178F6bC", + "contractAddress": "0xe53d264f398c8E3A55e91962b8C446Ec2381d1f8", + "transactionIndex": 1, + "gasUsed": "2788747", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000080000000000000000000200000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x7bdf9a687dd25028b88c1e010acaf98deb259a7a9ad35c0a04f470e2394ec48f", + "transactionHash": "0x056d80cabef69c57e05c6367b4763eefc2bde44bb57d9055d2a0880ff8b23811", + "logs": [ + { + "transactionIndex": 1, + "blockNumber": 13309685, + "transactionHash": "0x056d80cabef69c57e05c6367b4763eefc2bde44bb57d9055d2a0880ff8b23811", + "address": "0xe53d264f398c8E3A55e91962b8C446Ec2381d1f8", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", + "logIndex": 0, + "blockHash": "0x7bdf9a687dd25028b88c1e010acaf98deb259a7a9ad35c0a04f470e2394ec48f" + } + ], + "blockNumber": 13309685, + "cumulativeGasUsed": "2834931", + "status": 1, + "byzantium": true + }, + "args": [ + "0x4200000000000000000000000000000000000009", + "0x25500000d700bbE27104577CCcce8eAbCC96c8ad" + ], + "numDeployments": 1, + "solcInputHash": "1cc21f973aa4cfc73d832518987f54f8", + "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_bridge\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_remoteToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidShortString\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"str\",\"type\":\"string\"}],\"name\":\"StringTooLong\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Burn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fromDelegate\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toDelegate\",\"type\":\"address\"}],\"name\":\"DelegateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegate\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"DelegateVotesChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EIP712DomainChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Mint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BRIDGE\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"CLOCK_MODE\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REMOTE_TOKEN\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"pos\",\"type\":\"uint32\"}],\"name\":\"checkpoints\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fromBlock\",\"type\":\"uint32\"},{\"internalType\":\"uint224\",\"name\":\"votes\",\"type\":\"uint224\"}],\"internalType\":\"struct ERC20Votes.Checkpoint\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clock\",\"outputs\":[{\"internalType\":\"uint48\",\"name\":\"\",\"type\":\"uint48\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"delegateBySig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"delegates\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eip712Domain\",\"outputs\":[{\"internalType\":\"bytes1\",\"name\":\"fields\",\"type\":\"bytes1\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"verifyingContract\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"extensions\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"timepoint\",\"type\":\"uint256\"}],\"name\":\"getPastTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"timepoint\",\"type\":\"uint256\"}],\"name\":\"getPastVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"numCheckpoints\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"_interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"custom:proxied\":\"@title GovernanceToken\",\"kind\":\"dev\",\"methods\":{\"CLOCK_MODE()\":{\"details\":\"Description of the clock\"},\"DOMAIN_SEPARATOR()\":{\"details\":\"See {IERC20Permit-DOMAIN_SEPARATOR}.\"},\"acceptOwnership()\":{\"details\":\"The new owner accepts the ownership transfer.\"},\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"burn(address,uint256)\":{\"params\":{\"_amount\":\"Amount of tokens to burn.\",\"_from\":\"Address to burn tokens from.\"}},\"checkpoints(address,uint32)\":{\"details\":\"Get the `pos`-th checkpoint for `account`.\"},\"clock()\":{\"details\":\"Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting).\"},\"constructor\":{\"params\":{\"_bridge\":\"Address of the StandardBridge contract on this network.\",\"_remoteToken\":\"Address of the corresponding token on the remote chain.\"}},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"delegate(address)\":{\"details\":\"Delegate votes from the sender to `delegatee`.\"},\"delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Delegates votes from signer to `delegatee`\"},\"delegates(address)\":{\"details\":\"Get the address `account` is currently delegating to.\"},\"eip712Domain()\":{\"details\":\"See {EIP-5267}. _Available since v4.9._\"},\"getPastTotalSupply(uint256)\":{\"details\":\"Retrieve the `totalSupply` at the end of `timepoint`. Note, this value is the sum of all balances. It is NOT the sum of all the delegated votes! Requirements: - `timepoint` must be in the past\"},\"getPastVotes(address,uint256)\":{\"details\":\"Retrieve the number of votes for `account` at the end of `timepoint`. Requirements: - `timepoint` must be in the past\"},\"getVotes(address)\":{\"details\":\"Gets the current votes balance for `account`\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"initialize(address)\":{\"params\":{\"_owner\":\"The owner of this contract.\"}},\"mint(address,uint256)\":{\"params\":{\"_amount\":\"Amount of tokens to mint.\",\"_to\":\"Address to mint tokens to.\"}},\"name()\":{\"details\":\"Returns the name of the token.\"},\"nonces(address)\":{\"details\":\"See {IERC20Permit-nonces}.\"},\"numCheckpoints(address)\":{\"details\":\"Get number of checkpoints for `account`.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"pendingOwner()\":{\"details\":\"Returns the address of the pending owner.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"See {IERC20Permit-permit}.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"supportsInterface(bytes4)\":{\"params\":{\"_interfaceId\":\"Interface ID to check.\"},\"returns\":{\"_0\":\"Whether or not the interface is supported by this contract.\"}},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"},\"transferOwnership(address)\":{\"details\":\"Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"events\":{\"Burn(address,uint256)\":{\"notice\":\"Emitted whenever tokens are burned from an account.\"},\"Mint(address,uint256)\":{\"notice\":\"Emitted whenever tokens are minted for an account.\"}},\"kind\":\"user\",\"methods\":{\"BRIDGE()\":{\"notice\":\"Address of the StandardBridge on this network.\"},\"REMOTE_TOKEN()\":{\"notice\":\"Address of the corresponding version of this token on the remote chain.\"},\"burn(address,uint256)\":{\"notice\":\"Allows the StandardBridge on this network to burn tokens.\"},\"constructor\":{\"notice\":\"Constructs the GovernanceToken contract.\"},\"initialize(address)\":{\"notice\":\"Initializer.\"},\"mint(address,uint256)\":{\"notice\":\"Allows StandardBridge or the owner to mint tokens.\"},\"supportsInterface(bytes4)\":{\"notice\":\"ERC165 interface check function.\"},\"version()\":{\"notice\":\"Semantic version.\"}},\"notice\":\"The KRO token used in governance, supporting voting and delegation. Implements EIP 2612 allowing signed approvals. `mint` function is only allowed to the owner or `Bridge`, and the total supply amount is minted at once (TGE). `Bridge` has the permission to `mint` and `burn`, for the purpose of bridging KRO to the remote chain.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/governance/GovernanceToken.sol\":\"GovernanceToken\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/\",\":@rari-capital/solmate/=node_modules/@rari-capital/solmate/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\",\":hardhat-deploy/=node_modules/hardhat-deploy/\",\":hardhat/=node_modules/hardhat/\"]},\"sources\":{\"contracts/governance/GovernanceToken.sol\":{\"keccak256\":\"0x98304239f5ca6cc0c68dedf47b31ec5ceaeb11fed78d007dc16afb72d6a152a5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6cffce351c0d797a1c46e2eb3355324c86693cd9d48cd291cc30f0badb1843b4\",\"dweb:/ipfs/QmajzzFw1GT51LH1VBKh378xxwSLXxs6erBvUVxzFVkeLj\"]},\"contracts/universal/IKromaMintableERC20.sol\":{\"keccak256\":\"0x1a95268117456ddb1e0a16eb2ba773b9540c7b8b9520e66d4d167ddc6ace6fcb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f93d2e6f5121a3dfe272e399d6774e0584d59a20c4f63db78e5a0b644d92fa59\",\"dweb:/ipfs/QmbwM7kCpmwZs348jCeNwF86H8SDBURsGCGCUCyoSS1ffy\"]},\"contracts/universal/ISemver.sol\":{\"keccak256\":\"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a\",\"dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR\"]},\"contracts/universal/KromaMintableERC20.sol\":{\"keccak256\":\"0x30dccac5fe2d7c75bbe1411004ad03c40afe6dce8c7d22a89abb783f74bd2674\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://de3f8062e170498d71069529cb83681b0acaeb41643892c092111b07df2895f6\",\"dweb:/ipfs/QmNsZa5vHYQ8eG3dQ7PjkfweXzxKc6nbDj9P455Mp1Waxx\"]},\"node_modules/@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\":{\"keccak256\":\"0x84efb8889801b0ac817324aff6acc691d07bbee816b671817132911d287a8c63\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ec6df2255fadc251ea905043c47bf55170ee6cb5d7ca8b5c8ed54c84eac9d09e\",\"dweb:/ipfs/QmaokWfuL59uarki5yoDGbPzh4cErzEfnAzfmesTNJNXE9\"]},\"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://99c8cb3cd19a44bbfb6612605affb7d8b06cee1f6aa9362a37a8672b4f7eeaf8\",\"dweb:/ipfs/QmasyxFDBUp7k5KFgfDWEzM8PYSKEq7GVznzMJ1VxVRF4B\"]},\"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f103ee2e4aecd37aac6ceefe670709cdd7613dee25fa2d4d9feaf7fc0aaa155e\",\"dweb:/ipfs/QmRiNZLoJk5k3HPMYGPGjZFd2ke1ZxjhJZkM45Ec9GH9hv\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://310136ad60820af4177a11a61d77a3686faf5fca4942b600e08fc940db38396b\",\"dweb:/ipfs/QmbCzMNSTL7Zi7M4UCSqBrkHtp4jjxUnGbkneCZKdR1qeq\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"keccak256\":\"0x1618ddebe73377660f6da71afcba35d5ac4c4600918b3a381d9c6f37eba613eb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://666c8d7c62478b55e082f1835275b7acfc1595491998df6d67183ff2c70eab96\",\"dweb:/ipfs/QmVXmnXfxNaLhoX283dqyKJ8DJbF5thUd9sMuRoFpNMwr7\"]},\"node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol\":{\"keccak256\":\"0xac6c2efc64baccbde4904ae18ed45139c9aa8cff96d6888344d1e4d2eb8b659f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6e416a280c610b6b7a5f158e4a41aacfaec01ef14d5d1de13b46be9e090265fc\",\"dweb:/ipfs/QmYZP2KrdyccBbhLZT42auhvBTMkwiwUS3V6HWb42rbwbG\"]},\"node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol\":{\"keccak256\":\"0xfc12b717f6a2cd0d67adc8700097d4464d37f18ce933d4fc9c948ab6aec35e80\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://82386e69ebe902a2edfd4f8a5ecbeaeb2e00f6cc6481a973729e974373fb492e\",\"dweb:/ipfs/QmSXg4wBMBd83mQvkekT1GsiRX2Qyv5gvrqzv5qJx2M7Kc\"]},\"node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol\":{\"keccak256\":\"0xcaea9aeda3816ba872358c828f4f01455c22ae48ced49c4c7d72bd74176c09b9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://16ff22d8df5aee94510ee43d361b6147caef164941a684cedcb75be44f351fe6\",\"dweb:/ipfs/QmaCCwMdHVdPApuEJHLZapSJyA7mp5dAugpma3VUzWGd8E\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0xa56ca923f70c1748830700250b19c61b70db9a683516dc5e216694a50445d99c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cac938788bc4be12101e59d45588b4e059579f4e61062e1cda8d6b06c0191b15\",\"dweb:/ipfs/QmV2JKCyjTVH3rkWNrfdJRhAT7tZ3usAN2XcnD4h53Mvih\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bd39944e8fc06be6dbe2dd1d8449b5336e23c6a7ba3e8e9ae5ae0f37f35283f5\",\"dweb:/ipfs/QmPV3FGYjVwvKSgAXKUN3r9T9GwniZz83CxBpM7vyj2G53\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol\":{\"keccak256\":\"0x36c00327e3f9afd929cc2721aaa111ab57eff78a630cc364b279ad576b899295\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f5bf927f4c8b71a5809be184c3107b915b0445ab2c4a33208331e5376692eb5a\",\"dweb:/ipfs/QmVXirsCY1sf4kodhbL6w3NWZkeZeaMuQB7M6DBAdZNqFE\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\":{\"keccak256\":\"0x4e560f86662b6f72ab76122fff53317677154f14bac4a80dbd46a54172b3abfa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ca5c2518d247417cb01164f04eff57b7e87b5346bc03478ada916f26117aa7fd\",\"dweb:/ipfs/QmVgK66XGZCiH9x4mhqejKUTujtu68DyE6KrYi6MPuaHRJ\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd\",\"dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\":{\"keccak256\":\"0xec63854014a5b4f2b3290ab9103a21bdf902a508d0f41a8573fea49e98bf571a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bc5b5dc12fbc4002f282eaa7a5f06d8310ed62c1c77c5770f6283e058454c39a\",\"dweb:/ipfs/Qme9rE2wS3yBuyJq9GgbmzbsBQsW2M2sVFqYYLw7bosGrv\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"node_modules/@openzeppelin/contracts/utils/Counters.sol\":{\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://59e1c62884d55b70f3ae5432b44bb3166ad71ae3acd19c57ab6ddc3c87c325ee\",\"dweb:/ipfs/QmezuXg5GK5oeA4F91EZhozBFekhq5TD966bHPH18cCqhu\"]},\"node_modules/@openzeppelin/contracts/utils/ShortStrings.sol\":{\"keccak256\":\"0xc0e310c163edf15db45d4ff938113ab357f94fa86e61ea8e790853c4d2e13256\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://04db5bc05dcb05ba1f6ca2dfbead17adc8a2e2f911aa80b05e7a36d9eaf96516\",\"dweb:/ipfs/QmVkfHZbXVBUPsTopueCn3qGJX8aEjahFF3Fn4NcygLNm5\"]},\"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xf09e68aa0dc6722a25bc46490e8d48ed864466d17313b8a0b254c36b54e49899\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e26daf81e2252dc1fe1ce0e4b55c2eb7c6d1ee84ae6558d1a9554432ea1d32da\",\"dweb:/ipfs/Qmb1UANWiWq5pCKbmHSu772hd4nt374dVaghGmwSVNuk8Q\"]},\"node_modules/@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b81d9ff6559ea5c47fc573e17ece6d9ba5d6839e213e6ebc3b4c5c8fe4199d7f\",\"dweb:/ipfs/QmPCW1bFisUzJkyjroY3yipwfism9RRCigCcK1hbXtVM8n\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0x809bc3edb4bcbef8263fa616c1b60ee0004b50a8a1bfa164d8f57fd31f520c58\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8b93a1e39a4a19eba1600b92c96f435442db88cac91e315c8291547a2a7bcfe2\",\"dweb:/ipfs/QmTm34KVe6uZBZwq8dZDNWwPcm24qBJdxqL3rPxBJ4LrMv\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol\":{\"keccak256\":\"0x8432884527a7ad91e6eed1cfc5a0811ae2073e5bca107bd0ca442e9236b03dbd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e3aa0eadab7aafcf91a95684765f778f64386f0368de88522ce873c21385278a\",\"dweb:/ipfs/QmPfaVAqWgH1QsT3dHVuL6jwMZbVKdoP8w1PvpiPT2FPWd\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f\",\"dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy\"]},\"node_modules/@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cc8841b3cd48ad125e2f46323c8bad3aa0e88e399ec62acb9e57efa7e7c8058c\",\"dweb:/ipfs/QmSqE4mXHA2BXW58deDbXE8MTcsL5JSKNDbm23sVQxRLPS\"]},\"node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x52a8cfb0f5239d11b457dcdd1b326992ef672714ca8da71a157255bddd13f3ad\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://495145362c7ff1c9ca88c58bbbbcb412e3c2004406647412394486552ff6c278\",\"dweb:/ipfs/QmNNCeng6d5eRPDn6tkWSQhjE39XWfQEfjA63rRwHmr1iH\"]},\"node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c50fcc459e49a9858b6d8ad5f911295cb7c9ab57567845a250bf0153f84a95c7\",\"dweb:/ipfs/QmcEW85JRzvDkQggxiBBLVAasXWdkhEysqypj9EaB6H2g6\"]}},\"version\":1}", + "bytecode": "0x6101a06040523480156200001257600080fd5b506040516200369838038062003698833981016040819052620000359162000321565b604051806040016040528060058152602001644b726f6d6160d81b81525080604051806040016040528060018152602001603160f81b8152508484604051806020016040528060008152506040518060200160405280600081525081818160039081620000a39190620003fe565b506004620000b28282620003fe565b505050506001600160a01b03918216608052501660a052620000e2826005620001ac602090811b620012fb17901c565b61016052620000ff816006620001ac602090811b620012fb17901c565b61018052815160208084019190912061012052815190820120610140524660e0526200018f6101205161014051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60c0525050306101005250620001a4620001fc565b505062000547565b6000602083511015620001cc57620001c483620002be565b9050620001f6565b82620001e3836200030160201b6200132c1760201c565b90620001f09082620003fe565b5060ff90505b92915050565b600c54610100900460ff16156200026a5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084015b60405180910390fd5b600c5460ff90811614620002bc57600c805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b600080829050601f81511115620002ec578260405163305a27a960e01b8152600401620002619190620004ca565b8051620002f98262000522565b179392505050565b90565b80516001600160a01b03811681146200031c57600080fd5b919050565b600080604083850312156200033557600080fd5b620003408362000304565b9150620003506020840162000304565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200038457607f821691505b602082108103620003a557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003f957600081815260208120601f850160051c81016020861015620003d45750805b601f850160051c820191505b81811015620003f557828155600101620003e0565b5050505b505050565b81516001600160401b038111156200041a576200041a62000359565b62000432816200042b84546200036f565b84620003ab565b602080601f8311600181146200046a5760008415620004515750858301515b600019600386901b1c1916600185901b178555620003f5565b600085815260208120601f198616915b828110156200049b578886015182559484019460019091019084016200047a565b5085821015620004ba5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208083528351808285015260005b81811015620004f957858101830151858201604001528201620004db565b818111156200050c576000604083870101525b50601f01601f1916929092016040019392505050565b80516020808301519190811015620003a55760001960209190910360031b1b16919050565b60805160a05160c05160e05161010051610120516101405161016051610180516130d2620005c66000396000610ad001526000610aa5015260006117e6015260006117be01526000611719015260006117430152600061176d0152600081816106110152818161085d0152610c69015260006102a901526130d26000f3fe608060405234801561001057600080fd5b50600436106102775760003560e01c806379ba509711610160578063a457c2d7116100d8578063dd62ed3e1161008c578063ee9a31a211610071578063ee9a31a21461060c578063f1127ed814610633578063f2fde38b1461068557600080fd5b8063dd62ed3e146105c2578063e30c3978146105fb57600080fd5b8063c3cda520116100bd578063c3cda52014610589578063c4d66de81461059c578063d505accf146105af57600080fd5b8063a457c2d714610563578063a9059cbb1461057657600080fd5b80638e539e8c1161012f57806395d89b411161011457806395d89b41146105045780639ab24eb01461053d5780639dc29fac1461055057600080fd5b80638e539e8c146104d257806391ddadf4146104e557600080fd5b806379ba50971461048b5780637ecebe001461049357806384b0196e146104a65780638da5cb5b146104c157600080fd5b80633a46b1a8116101f3578063587cde1e116101c25780636fcfff45116101a75780636fcfff451461043257806370a082311461045a578063715018a61461048357600080fd5b8063587cde1e146103f35780635c19a95c1461041f57600080fd5b80633a46b1a81461038757806340c10f191461039a5780634bf5d7e9146103af57806354fd4d50146103b757600080fd5b806318160ddd1161024a578063313ce5671161022f578063313ce5671461035d5780633644e5151461036c578063395093511461037457600080fd5b806318160ddd1461033857806323b872dd1461034a57600080fd5b806301ffc9a71461027c578063033964be146102a457806306fdde03146102e3578063095ea7b314610325575b600080fd5b61028f61028a366004612a65565b610698565b60405190151581526020015b60405180910390f35b6102cb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161029b565b60408051808201909152600581527f4b726f6d6100000000000000000000000000000000000000000000000000000060208201525b60405161029b9190612b12565b61028f610333366004612b41565b610738565b6002545b60405190815260200161029b565b61028f610358366004612b6b565b610752565b6040516012815260200161029b565b61033c610776565b61028f610382366004612b41565b610785565b61033c610395366004612b41565b6107c4565b6103ad6103a8366004612b41565b610852565b005b610318610913565b6103186040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6102cb610401366004612ba7565b6001600160a01b039081166000908152600960205260409020541690565b6103ad61042d366004612ba7565b6109ab565b610445610440366004612ba7565b6109b8565b60405163ffffffff909116815260200161029b565b61033c610468366004612ba7565b6001600160a01b031660009081526020819052604090205490565b6103ad6109da565b6103ad6109ee565b61033c6104a1366004612ba7565b610a79565b6104ae610a97565b60405161029b9796959493929190612bc2565b603f546001600160a01b03166102cb565b61033c6104e0366004612c74565b610b3c565b6104ed610ba7565b60405165ffffffffffff909116815260200161029b565b60408051808201909152600381527f4b524f00000000000000000000000000000000000000000000000000000000006020820152610318565b61033c61054b366004612ba7565b610bb2565b6103ad61055e366004612b41565b610c5e565b61028f610571366004612b41565b610d06565b61028f610584366004612b41565b610db0565b6103ad610597366004612c9e565b610dbe565b6103ad6105aa366004612ba7565b610ef4565b6103ad6105bd366004612cf6565b611075565b61033c6105d0366004612d60565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6071546001600160a01b03166102cb565b6102cb7f000000000000000000000000000000000000000000000000000000000000000081565b610646610641366004612d93565b6111d9565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16928101929092520161029b565b6103ad610693366004612ba7565b611272565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f30a0c5a9000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000841682148061073057507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b60003361074681858561132f565b60019150505b92915050565b600033610760858285611487565b61076b858585611519565b506001949350505050565b600061078061170c565b905090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919061074690829086906107bf908790612e02565b61132f565b60006107ce610ba7565b65ffffffffffff1682106108295760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20667574757265206c6f6f6b75700000000000000060448201526064015b60405180910390fd5b6001600160a01b0383166000908152600a6020526040902061084b9083611837565b9392505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108935750603f546001600160a01b031633145b6109055760405162461bcd60e51b815260206004820152602e60248201527f476f7665726e616e6365546f6b656e3a206f6e6c7920627269646765206f722060448201527f6f776e65722063616e206d696e740000000000000000000000000000000000006064820152608401610820565b61090f828261194a565b5050565b60604361091e610ba7565b65ffffffffffff16146109735760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a2062726f6b656e20636c6f636b206d6f64650000006044820152606401610820565b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b6109b5338261199b565b50565b6001600160a01b0381166000908152600a602052604081205461074c90611a2c565b6109e2611aac565b6109ec6000611b06565b565b60715433906001600160a01b03168114610a705760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610820565b6109b581611b06565b6001600160a01b03811660009081526007602052604081205461074c565b600060608082808083610acb7f00000000000000000000000000000000000000000000000000000000000000006005611b37565b610af67f00000000000000000000000000000000000000000000000000000000000000006006611b37565b604080516000808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6000610b46610ba7565b65ffffffffffff168210610b9c5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20667574757265206c6f6f6b7570000000000000006044820152606401610820565b61074c600b83611837565b600061078043611bdb565b6001600160a01b0381166000908152600a60205260408120548015610c36576001600160a01b0383166000908152600a6020526040902080546000198301908110610bff57610bff612e49565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610c39565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cfc5760405162461bcd60e51b815260206004820152603160248201527f4b726f6d614d696e7461626c6545524332303a206f6e6c79206272696467652060448201527f63616e206d696e7420616e64206275726e0000000000000000000000000000006064820152608401610820565b61090f8282611c59565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919083811015610da35760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610820565b61076b828686840361132f565b600033610746818585611519565b83421115610e0e5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610820565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610e8890610e809060a00160405160208183030381529060405280519060200120611c9e565b858585611ce6565b9050610e9381611d0e565b8614610ee15760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610820565b610eeb818861199b565b50505050505050565b600c54610100900460ff1615808015610f145750600c54600160ff909116105b80610f2e5750303b158015610f2e5750600c5460ff166001145b610fa05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610820565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610ffe57600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b611006611d36565b61100f82611272565b801561090f57600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b834211156110c55760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610820565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886110f48c611d0e565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061114f82611c9e565b9050600061115f82878787611ce6565b9050896001600160a01b0316816001600160a01b0316146111c25760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610820565b6111cd8a8a8a61132f565b50505050505050505050565b60408051808201909152600080825260208201526001600160a01b0383166000908152600a60205260409020805463ffffffff841690811061121d5761121d612e49565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b61127a611aac565b607180546001600160a01b0383167fffffffffffffffffffffffff000000000000000000000000000000000000000090911681179091556112c3603f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60006020835110156113175761131083611dbb565b905061074c565b816113228482612f13565b5060ff905061074c565b90565b6001600160a01b0383166113aa5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166114265760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461151357818110156115065760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610820565b611513848484840361132f565b50505050565b6001600160a01b0383166115955760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166116115760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b038316600090815260208190526040902054818110156116a05760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611513848484611e17565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561176557507f000000000000000000000000000000000000000000000000000000000000000046145b1561178f57507f000000000000000000000000000000000000000000000000000000000000000090565b610780604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b81546000908181600581111561189157600061185284611e22565b61185c9085612ff1565b600088815260209020909150869082015463ffffffff1611156118815780915061188f565b61188c816001612e02565b92505b505b808210156118de5760006118a58383611f0a565b600088815260209020909150869082015463ffffffff1611156118ca578091506118d8565b6118d5816001612e02565b92505b50611891565b801561191f576000868152602090208101600019015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611922565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169695505050505050565b6119548282611f25565b816001600160a01b03167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161198f91815260200190565b60405180910390a25050565b6001600160a01b038281166000818152600960208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611513828483611fd1565b600063ffffffff821115611aa85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610820565b5090565b603f546001600160a01b031633146109ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610820565b607180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556109b58161210e565b606060ff8314611b4a5761131083612178565b818054611b5690612e78565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8290612e78565b8015611bcf5780601f10611ba457610100808354040283529160200191611bcf565b820191906000526020600020905b815481529060010190602001808311611bb257829003601f168201915b5050505050905061074c565b600065ffffffffffff821115611aa85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201527f38206269747300000000000000000000000000000000000000000000000000006064820152608401610820565b611c6382826121b7565b816001600160a01b03167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161198f91815260200190565b600061074c611cab61170c565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6000806000611cf7878787876121cf565b91509150611d04816122b1565b5095945050505050565b6001600160a01b03811660009081526007602052604090208054600181018255905b50919050565b600c54610100900460ff16611db35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610820565b6109ec612416565b600080829050601f81511115611dff57826040517f305a27a90000000000000000000000000000000000000000000000000000000081526004016108209190612b12565b8051611e0a82613008565b179392505050565b505050565b611e1283838361249c565b600081600003611e3457506000919050565b60006001611e41846124ce565b901c6001901b90506001818481611e5a57611e5a61302c565b048201901c90506001818481611e7257611e7261302c565b048201901c90506001818481611e8a57611e8a61302c565b048201901c90506001818481611ea257611ea261302c565b048201901c90506001818481611eba57611eba61302c565b048201901c90506001818481611ed257611ed261302c565b048201901c90506001818481611eea57611eea61302c565b048201901c905061084b81828581611f0457611f0461302c565b04612562565b6000611f19600284841861305b565b61084b90848416612e02565b611f2f8282612578565b6002547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1015611fc35760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610820565b611513600b61263f8361264b565b816001600160a01b0316836001600160a01b031614158015611ff35750600081115b15611e12576001600160a01b03831615612081576001600160a01b0383166000908152600a60205260408120819061202e906128148561264b565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612076929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611e12576001600160a01b0382166000908152600a6020526040812081906120b79061263f8561264b565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516120ff929190918252602082015260400190565b60405180910390a25050505050565b603f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060600061218583612820565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b6121c18282612861565b611513600b6128148361264b565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561220657506000905060036122a8565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561225a573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b0381166122a1576000600192509250506122a8565b9150600090505b94509492505050565b60008160048111156122c5576122c5613096565b036122cd5750565b60018160048111156122e1576122e1613096565b0361232e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610820565b600281600481111561234257612342613096565b0361238f5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610820565b60038160048111156123a3576123a3613096565b036109b55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610820565b600c54610100900460ff166124935760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610820565b6109ec33611b06565b6001600160a01b03838116600090815260096020526040808220548584168352912054611e1292918216911683611fd1565b600080608083901c156124e357608092831c92015b604083901c156124f557604092831c92015b602083901c1561250757602092831c92015b601083901c1561251957601092831c92015b600883901c1561252b57600892831c92015b600483901c1561253d57600492831c92015b600283901c1561254f57600292831c92015b600183901c1561074c5760010192915050565b6000818310612571578161084b565b5090919050565b6001600160a01b0382166125ce5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610820565b80600260008282546125e09190612e02565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361090f60008383611e17565b600061084b8284612e02565b825460009081908181156126ad5760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660208201526126c2565b60408051808201909152600080825260208201525b905080602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1693506126f784868863ffffffff16565b9250600082118015612721575061270c610ba7565b65ffffffffffff16816000015163ffffffff16145b1561277b5761272f836129d1565b60008881526020902083016000190180547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092166401000000000263ffffffff90921691909117905561280a565b86604051806040016040528061279f612792610ba7565b65ffffffffffff16611a2c565b63ffffffff1681526020016127b3866129d1565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b600061084b8284612ff1565b600060ff8216601f81111561074c576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166128dd5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166000908152602081905260409020548181101561296c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611e1283600084611e17565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821115611aa85760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610820565b600060208284031215612a7757600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461084b57600080fd5b6000815180845260005b81811015612acd57602081850181015186830182015201612ab1565b81811115612adf576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061084b6020830184612aa7565b80356001600160a01b0381168114612b3c57600080fd5b919050565b60008060408385031215612b5457600080fd5b612b5d83612b25565b946020939093013593505050565b600080600060608486031215612b8057600080fd5b612b8984612b25565b9250612b9760208501612b25565b9150604084013590509250925092565b600060208284031215612bb957600080fd5b61084b82612b25565b7fff00000000000000000000000000000000000000000000000000000000000000881681526000602060e081840152612bfe60e084018a612aa7565b8381036040850152612c10818a612aa7565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b81811015612c6257835183529284019291840191600101612c46565b50909c9b505050505050505050505050565b600060208284031215612c8657600080fd5b5035919050565b803560ff81168114612b3c57600080fd5b60008060008060008060c08789031215612cb757600080fd5b612cc087612b25565b95506020870135945060408701359350612cdc60608801612c8d565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a031215612d1157600080fd5b612d1a88612b25565b9650612d2860208901612b25565b95506040880135945060608801359350612d4460808901612c8d565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612d7357600080fd5b612d7c83612b25565b9150612d8a60208401612b25565b90509250929050565b60008060408385031215612da657600080fd5b612daf83612b25565b9150602083013563ffffffff81168114612dc857600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612e1557612e15612dd3565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c90821680612e8c57607f821691505b602082108103611d30577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f821115611e1257600081815260208120601f850160051c81016020861015612eec5750805b601f850160051c820191505b81811015612f0b57828155600101612ef8565b505050505050565b815167ffffffffffffffff811115612f2d57612f2d612e1a565b612f4181612f3b8454612e78565b84612ec5565b602080601f831160018114612f765760008415612f5e5750858301515b600019600386901b1c1916600185901b178555612f0b565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015612fc357888601518255948401946001909101908401612fa4565b5085821015612fe15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008282101561300357613003612dd3565b500390565b80516020808301519190811015611d305760001960209190910360031b1b16919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613091577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102775760003560e01c806379ba509711610160578063a457c2d7116100d8578063dd62ed3e1161008c578063ee9a31a211610071578063ee9a31a21461060c578063f1127ed814610633578063f2fde38b1461068557600080fd5b8063dd62ed3e146105c2578063e30c3978146105fb57600080fd5b8063c3cda520116100bd578063c3cda52014610589578063c4d66de81461059c578063d505accf146105af57600080fd5b8063a457c2d714610563578063a9059cbb1461057657600080fd5b80638e539e8c1161012f57806395d89b411161011457806395d89b41146105045780639ab24eb01461053d5780639dc29fac1461055057600080fd5b80638e539e8c146104d257806391ddadf4146104e557600080fd5b806379ba50971461048b5780637ecebe001461049357806384b0196e146104a65780638da5cb5b146104c157600080fd5b80633a46b1a8116101f3578063587cde1e116101c25780636fcfff45116101a75780636fcfff451461043257806370a082311461045a578063715018a61461048357600080fd5b8063587cde1e146103f35780635c19a95c1461041f57600080fd5b80633a46b1a81461038757806340c10f191461039a5780634bf5d7e9146103af57806354fd4d50146103b757600080fd5b806318160ddd1161024a578063313ce5671161022f578063313ce5671461035d5780633644e5151461036c578063395093511461037457600080fd5b806318160ddd1461033857806323b872dd1461034a57600080fd5b806301ffc9a71461027c578063033964be146102a457806306fdde03146102e3578063095ea7b314610325575b600080fd5b61028f61028a366004612a65565b610698565b60405190151581526020015b60405180910390f35b6102cb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161029b565b60408051808201909152600581527f4b726f6d6100000000000000000000000000000000000000000000000000000060208201525b60405161029b9190612b12565b61028f610333366004612b41565b610738565b6002545b60405190815260200161029b565b61028f610358366004612b6b565b610752565b6040516012815260200161029b565b61033c610776565b61028f610382366004612b41565b610785565b61033c610395366004612b41565b6107c4565b6103ad6103a8366004612b41565b610852565b005b610318610913565b6103186040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6102cb610401366004612ba7565b6001600160a01b039081166000908152600960205260409020541690565b6103ad61042d366004612ba7565b6109ab565b610445610440366004612ba7565b6109b8565b60405163ffffffff909116815260200161029b565b61033c610468366004612ba7565b6001600160a01b031660009081526020819052604090205490565b6103ad6109da565b6103ad6109ee565b61033c6104a1366004612ba7565b610a79565b6104ae610a97565b60405161029b9796959493929190612bc2565b603f546001600160a01b03166102cb565b61033c6104e0366004612c74565b610b3c565b6104ed610ba7565b60405165ffffffffffff909116815260200161029b565b60408051808201909152600381527f4b524f00000000000000000000000000000000000000000000000000000000006020820152610318565b61033c61054b366004612ba7565b610bb2565b6103ad61055e366004612b41565b610c5e565b61028f610571366004612b41565b610d06565b61028f610584366004612b41565b610db0565b6103ad610597366004612c9e565b610dbe565b6103ad6105aa366004612ba7565b610ef4565b6103ad6105bd366004612cf6565b611075565b61033c6105d0366004612d60565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6071546001600160a01b03166102cb565b6102cb7f000000000000000000000000000000000000000000000000000000000000000081565b610646610641366004612d93565b6111d9565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16928101929092520161029b565b6103ad610693366004612ba7565b611272565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f30a0c5a9000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000841682148061073057507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b60003361074681858561132f565b60019150505b92915050565b600033610760858285611487565b61076b858585611519565b506001949350505050565b600061078061170c565b905090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919061074690829086906107bf908790612e02565b61132f565b60006107ce610ba7565b65ffffffffffff1682106108295760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20667574757265206c6f6f6b75700000000000000060448201526064015b60405180910390fd5b6001600160a01b0383166000908152600a6020526040902061084b9083611837565b9392505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108935750603f546001600160a01b031633145b6109055760405162461bcd60e51b815260206004820152602e60248201527f476f7665726e616e6365546f6b656e3a206f6e6c7920627269646765206f722060448201527f6f776e65722063616e206d696e740000000000000000000000000000000000006064820152608401610820565b61090f828261194a565b5050565b60604361091e610ba7565b65ffffffffffff16146109735760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a2062726f6b656e20636c6f636b206d6f64650000006044820152606401610820565b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b6109b5338261199b565b50565b6001600160a01b0381166000908152600a602052604081205461074c90611a2c565b6109e2611aac565b6109ec6000611b06565b565b60715433906001600160a01b03168114610a705760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610820565b6109b581611b06565b6001600160a01b03811660009081526007602052604081205461074c565b600060608082808083610acb7f00000000000000000000000000000000000000000000000000000000000000006005611b37565b610af67f00000000000000000000000000000000000000000000000000000000000000006006611b37565b604080516000808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6000610b46610ba7565b65ffffffffffff168210610b9c5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20667574757265206c6f6f6b7570000000000000006044820152606401610820565b61074c600b83611837565b600061078043611bdb565b6001600160a01b0381166000908152600a60205260408120548015610c36576001600160a01b0383166000908152600a6020526040902080546000198301908110610bff57610bff612e49565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610c39565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cfc5760405162461bcd60e51b815260206004820152603160248201527f4b726f6d614d696e7461626c6545524332303a206f6e6c79206272696467652060448201527f63616e206d696e7420616e64206275726e0000000000000000000000000000006064820152608401610820565b61090f8282611c59565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919083811015610da35760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610820565b61076b828686840361132f565b600033610746818585611519565b83421115610e0e5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610820565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610e8890610e809060a00160405160208183030381529060405280519060200120611c9e565b858585611ce6565b9050610e9381611d0e565b8614610ee15760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610820565b610eeb818861199b565b50505050505050565b600c54610100900460ff1615808015610f145750600c54600160ff909116105b80610f2e5750303b158015610f2e5750600c5460ff166001145b610fa05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610820565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610ffe57600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b611006611d36565b61100f82611272565b801561090f57600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b834211156110c55760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610820565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886110f48c611d0e565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061114f82611c9e565b9050600061115f82878787611ce6565b9050896001600160a01b0316816001600160a01b0316146111c25760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610820565b6111cd8a8a8a61132f565b50505050505050505050565b60408051808201909152600080825260208201526001600160a01b0383166000908152600a60205260409020805463ffffffff841690811061121d5761121d612e49565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b61127a611aac565b607180546001600160a01b0383167fffffffffffffffffffffffff000000000000000000000000000000000000000090911681179091556112c3603f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60006020835110156113175761131083611dbb565b905061074c565b816113228482612f13565b5060ff905061074c565b90565b6001600160a01b0383166113aa5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166114265760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461151357818110156115065760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610820565b611513848484840361132f565b50505050565b6001600160a01b0383166115955760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166116115760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b038316600090815260208190526040902054818110156116a05760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611513848484611e17565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561176557507f000000000000000000000000000000000000000000000000000000000000000046145b1561178f57507f000000000000000000000000000000000000000000000000000000000000000090565b610780604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b81546000908181600581111561189157600061185284611e22565b61185c9085612ff1565b600088815260209020909150869082015463ffffffff1611156118815780915061188f565b61188c816001612e02565b92505b505b808210156118de5760006118a58383611f0a565b600088815260209020909150869082015463ffffffff1611156118ca578091506118d8565b6118d5816001612e02565b92505b50611891565b801561191f576000868152602090208101600019015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611922565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169695505050505050565b6119548282611f25565b816001600160a01b03167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161198f91815260200190565b60405180910390a25050565b6001600160a01b038281166000818152600960208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611513828483611fd1565b600063ffffffff821115611aa85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610820565b5090565b603f546001600160a01b031633146109ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610820565b607180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556109b58161210e565b606060ff8314611b4a5761131083612178565b818054611b5690612e78565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8290612e78565b8015611bcf5780601f10611ba457610100808354040283529160200191611bcf565b820191906000526020600020905b815481529060010190602001808311611bb257829003601f168201915b5050505050905061074c565b600065ffffffffffff821115611aa85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201527f38206269747300000000000000000000000000000000000000000000000000006064820152608401610820565b611c6382826121b7565b816001600160a01b03167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161198f91815260200190565b600061074c611cab61170c565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6000806000611cf7878787876121cf565b91509150611d04816122b1565b5095945050505050565b6001600160a01b03811660009081526007602052604090208054600181018255905b50919050565b600c54610100900460ff16611db35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610820565b6109ec612416565b600080829050601f81511115611dff57826040517f305a27a90000000000000000000000000000000000000000000000000000000081526004016108209190612b12565b8051611e0a82613008565b179392505050565b505050565b611e1283838361249c565b600081600003611e3457506000919050565b60006001611e41846124ce565b901c6001901b90506001818481611e5a57611e5a61302c565b048201901c90506001818481611e7257611e7261302c565b048201901c90506001818481611e8a57611e8a61302c565b048201901c90506001818481611ea257611ea261302c565b048201901c90506001818481611eba57611eba61302c565b048201901c90506001818481611ed257611ed261302c565b048201901c90506001818481611eea57611eea61302c565b048201901c905061084b81828581611f0457611f0461302c565b04612562565b6000611f19600284841861305b565b61084b90848416612e02565b611f2f8282612578565b6002547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1015611fc35760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610820565b611513600b61263f8361264b565b816001600160a01b0316836001600160a01b031614158015611ff35750600081115b15611e12576001600160a01b03831615612081576001600160a01b0383166000908152600a60205260408120819061202e906128148561264b565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612076929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611e12576001600160a01b0382166000908152600a6020526040812081906120b79061263f8561264b565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516120ff929190918252602082015260400190565b60405180910390a25050505050565b603f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060600061218583612820565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b6121c18282612861565b611513600b6128148361264b565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561220657506000905060036122a8565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561225a573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b0381166122a1576000600192509250506122a8565b9150600090505b94509492505050565b60008160048111156122c5576122c5613096565b036122cd5750565b60018160048111156122e1576122e1613096565b0361232e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610820565b600281600481111561234257612342613096565b0361238f5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610820565b60038160048111156123a3576123a3613096565b036109b55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610820565b600c54610100900460ff166124935760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610820565b6109ec33611b06565b6001600160a01b03838116600090815260096020526040808220548584168352912054611e1292918216911683611fd1565b600080608083901c156124e357608092831c92015b604083901c156124f557604092831c92015b602083901c1561250757602092831c92015b601083901c1561251957601092831c92015b600883901c1561252b57600892831c92015b600483901c1561253d57600492831c92015b600283901c1561254f57600292831c92015b600183901c1561074c5760010192915050565b6000818310612571578161084b565b5090919050565b6001600160a01b0382166125ce5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610820565b80600260008282546125e09190612e02565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361090f60008383611e17565b600061084b8284612e02565b825460009081908181156126ad5760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660208201526126c2565b60408051808201909152600080825260208201525b905080602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1693506126f784868863ffffffff16565b9250600082118015612721575061270c610ba7565b65ffffffffffff16816000015163ffffffff16145b1561277b5761272f836129d1565b60008881526020902083016000190180547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092166401000000000263ffffffff90921691909117905561280a565b86604051806040016040528061279f612792610ba7565b65ffffffffffff16611a2c565b63ffffffff1681526020016127b3866129d1565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b600061084b8284612ff1565b600060ff8216601f81111561074c576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166128dd5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166000908152602081905260409020548181101561296c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611e1283600084611e17565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821115611aa85760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610820565b600060208284031215612a7757600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461084b57600080fd5b6000815180845260005b81811015612acd57602081850181015186830182015201612ab1565b81811115612adf576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061084b6020830184612aa7565b80356001600160a01b0381168114612b3c57600080fd5b919050565b60008060408385031215612b5457600080fd5b612b5d83612b25565b946020939093013593505050565b600080600060608486031215612b8057600080fd5b612b8984612b25565b9250612b9760208501612b25565b9150604084013590509250925092565b600060208284031215612bb957600080fd5b61084b82612b25565b7fff00000000000000000000000000000000000000000000000000000000000000881681526000602060e081840152612bfe60e084018a612aa7565b8381036040850152612c10818a612aa7565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b81811015612c6257835183529284019291840191600101612c46565b50909c9b505050505050505050505050565b600060208284031215612c8657600080fd5b5035919050565b803560ff81168114612b3c57600080fd5b60008060008060008060c08789031215612cb757600080fd5b612cc087612b25565b95506020870135945060408701359350612cdc60608801612c8d565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a031215612d1157600080fd5b612d1a88612b25565b9650612d2860208901612b25565b95506040880135945060608801359350612d4460808901612c8d565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612d7357600080fd5b612d7c83612b25565b9150612d8a60208401612b25565b90509250929050565b60008060408385031215612da657600080fd5b612daf83612b25565b9150602083013563ffffffff81168114612dc857600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612e1557612e15612dd3565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c90821680612e8c57607f821691505b602082108103611d30577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f821115611e1257600081815260208120601f850160051c81016020861015612eec5750805b601f850160051c820191505b81811015612f0b57828155600101612ef8565b505050505050565b815167ffffffffffffffff811115612f2d57612f2d612e1a565b612f4181612f3b8454612e78565b84612ec5565b602080601f831160018114612f765760008415612f5e5750858301515b600019600386901b1c1916600185901b178555612f0b565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015612fc357888601518255948401946001909101908401612fa4565b5085821015612fe15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008282101561300357613003612dd3565b500390565b80516020808301519190811015611d305760001960209190910360031b1b16919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613091577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a", + "devdoc": {}, + "userdoc": {}, + "storageLayout": { + "storage": [ + { + "astId": 1333, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_balances", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 1339, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_allowances", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" + }, + { + "astId": 1341, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_totalSupply", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 1343, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_name", + "offset": 0, + "slot": "3", + "type": "t_string_storage" + }, + { + "astId": 1345, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_symbol", + "offset": 0, + "slot": "4", + "type": "t_string_storage" + }, + { + "astId": 3999, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_nameFallback", + "offset": 0, + "slot": "5", + "type": "t_string_storage" + }, + { + "astId": 4001, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_versionFallback", + "offset": 0, + "slot": "6", + "type": "t_string_storage" + }, + { + "astId": 2005, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_nonces", + "offset": 0, + "slot": "7", + "type": "t_mapping(t_address,t_struct(Counter)2977_storage)" + }, + { + "astId": 2013, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_PERMIT_TYPEHASH_DEPRECATED_SLOT", + "offset": 0, + "slot": "8", + "type": "t_bytes32" + }, + { + "astId": 2180, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_delegates", + "offset": 0, + "slot": "9", + "type": "t_mapping(t_address,t_address)" + }, + { + "astId": 2186, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_checkpoints", + "offset": 0, + "slot": "10", + "type": "t_mapping(t_address,t_array(t_struct(Checkpoint)2171_storage)dyn_storage)" + }, + { + "astId": 2190, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_totalSupplyCheckpoints", + "offset": 0, + "slot": "11", + "type": "t_array(t_struct(Checkpoint)2171_storage)dyn_storage" + }, + { + "astId": 656, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_initialized", + "offset": 0, + "slot": "12", + "type": "t_uint8" + }, + { + "astId": 659, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_initializing", + "offset": 1, + "slot": "12", + "type": "t_bool" + }, + { + "astId": 1189, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "__gap", + "offset": 0, + "slot": "13", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 528, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_owner", + "offset": 0, + "slot": "63", + "type": "t_address" + }, + { + "astId": 648, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "__gap", + "offset": 0, + "slot": "64", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 437, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_pendingOwner", + "offset": 0, + "slot": "113", + "type": "t_address" + }, + { + "astId": 516, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "__gap", + "offset": 0, + "slot": "114", + "type": "t_array(t_uint256)49_storage" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_struct(Checkpoint)2171_storage)dyn_storage": { + "encoding": "dynamic_array", + "label": "struct ERC20Votes.Checkpoint[]", + "numberOfBytes": "32", + "base": "t_struct(Checkpoint)2171_storage" + }, + "t_array(t_uint256)49_storage": { + "encoding": "inplace", + "label": "uint256[49]", + "numberOfBytes": "1568", + "base": "t_uint256" + }, + "t_array(t_uint256)50_storage": { + "encoding": "inplace", + "label": "uint256[50]", + "numberOfBytes": "1600", + "base": "t_uint256" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_address)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => address)", + "numberOfBytes": "32", + "value": "t_address" + }, + "t_mapping(t_address,t_array(t_struct(Checkpoint)2171_storage)dyn_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => struct ERC20Votes.Checkpoint[])", + "numberOfBytes": "32", + "value": "t_array(t_struct(Checkpoint)2171_storage)dyn_storage" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => uint256))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_uint256)" + }, + "t_mapping(t_address,t_struct(Counter)2977_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => struct Counters.Counter)", + "numberOfBytes": "32", + "value": "t_struct(Counter)2977_storage" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(Checkpoint)2171_storage": { + "encoding": "inplace", + "label": "struct ERC20Votes.Checkpoint", + "numberOfBytes": "32", + "members": [ + { + "astId": 2168, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "fromBlock", + "offset": 0, + "slot": "0", + "type": "t_uint32" + }, + { + "astId": 2170, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "votes", + "offset": 4, + "slot": "0", + "type": "t_uint224" + } + ] + }, + "t_struct(Counter)2977_storage": { + "encoding": "inplace", + "label": "struct Counters.Counter", + "numberOfBytes": "32", + "members": [ + { + "astId": 2976, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_value", + "offset": 0, + "slot": "0", + "type": "t_uint256" + } + ] + }, + "t_uint224": { + "encoding": "inplace", + "label": "uint224", + "numberOfBytes": "28" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "encoding": "inplace", + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint8": { + "encoding": "inplace", + "label": "uint8", + "numberOfBytes": "1" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/kroma/GovernanceTokenProxy.json b/packages/contracts/deployments/kroma/GovernanceTokenProxy.json new file mode 100644 index 0000000000..1d57dbb884 --- /dev/null +++ b/packages/contracts/deployments/kroma/GovernanceTokenProxy.json @@ -0,0 +1,152 @@ +{ + "address": "0x25500000d700bbE27104577CCcce8eAbCC96c8ad", + "abi": [ + { + "type": "constructor", + "payable": false, + "inputs": [ + { + "type": "address", + "name": "_admin" + } + ] + }, + { + "type": "function", + "name": "admin", + "constant": false, + "payable": false, + "inputs": [], + "outputs": [ + { + "type": "address" + } + ] + }, + { + "type": "function", + "name": "changeAdmin", + "constant": false, + "payable": false, + "inputs": [ + { + "type": "address", + "name": "_admin" + } + ], + "outputs": [] + }, + { + "type": "function", + "name": "implementation", + "constant": false, + "payable": false, + "inputs": [], + "outputs": [ + { + "type": "address" + } + ] + }, + { + "type": "function", + "name": "upgradeTo", + "constant": false, + "payable": false, + "inputs": [ + { + "type": "address", + "name": "_implementation" + } + ], + "outputs": [] + }, + { + "type": "function", + "name": "upgradeToAndCall", + "constant": false, + "stateMutability": "payable", + "payable": true, + "inputs": [ + { + "type": "address", + "name": "_implementation" + }, + { + "type": "bytes", + "name": "_data" + } + ], + "outputs": [ + { + "type": "bytes" + } + ] + }, + { + "type": "event", + "anonymous": false, + "name": "AdminChanged", + "inputs": [ + { + "type": "address", + "name": "previousAdmin", + "indexed": false + }, + { + "type": "address", + "name": "newAdmin", + "indexed": false + } + ] + }, + { + "type": "event", + "anonymous": false, + "name": "Upgraded", + "inputs": [ + { + "type": "address", + "name": "implementation", + "indexed": true + } + ] + } + ], + "transactionHash": "0x2700d66f8218581b3d569e67c8c5b3ab745666011a2f12d6fce204756a425986", + "receipt": { + "to": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "from": "0xcc56801a72463d39903A4a4632E600289178F6bC", + "contractAddress": null, + "transactionIndex": 2, + "gasUsed": "528801", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000400000000000000000000000000000004000000000000000000000000000000000000000000000000000000", + "blockHash": "0x156342cab041e93b26a5db7c095ae7d9b6228910095a4286221b3682fb1b8d2a", + "transactionHash": "0x2700d66f8218581b3d569e67c8c5b3ab745666011a2f12d6fce204756a425986", + "logs": [ + { + "transactionIndex": 2, + "blockNumber": 13309680, + "transactionHash": "0x2700d66f8218581b3d569e67c8c5b3ab745666011a2f12d6fce204756a425986", + "address": "0x25500000d700bbE27104577CCcce8eAbCC96c8ad", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cc56801a72463d39903a4a4632e600289178f6bc", + "logIndex": 3, + "blockHash": "0x156342cab041e93b26a5db7c095ae7d9b6228910095a4286221b3682fb1b8d2a" + } + ], + "blockNumber": 13309680, + "cumulativeGasUsed": "965470", + "status": 1, + "byzantium": true + }, + "args": [ + "0xcc56801a72463d39903A4a4632E600289178F6bC" + ], + "numDeployments": 1, + "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_admin\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_admin\",\"type\":\"address\"}],\"name\":\"changeAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_implementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_implementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"events\":{\"AdminChanged(address,address)\":{\"params\":{\"newAdmin\":\"The new owner of the contract\",\"previousAdmin\":\"The previous owner of the contract\"}},\"Upgraded(address)\":{\"params\":{\"implementation\":\"The address of the implementation contract\"}}},\"kind\":\"dev\",\"methods\":{\"admin()\":{\"returns\":{\"_0\":\"Owner address.\"}},\"changeAdmin(address)\":{\"params\":{\"_admin\":\"New owner of the proxy contract.\"}},\"constructor\":{\"params\":{\"_admin\":\"Address of the initial contract admin. Admin as the ability to access the transparent proxy interface.\"}},\"implementation()\":{\"returns\":{\"_0\":\"Implementation address.\"}},\"upgradeTo(address)\":{\"params\":{\"_implementation\":\"Address of the implementation contract.\"}},\"upgradeToAndCall(address,bytes)\":{\"params\":{\"_data\":\"Calldata to delegatecall the new implementation with.\",\"_implementation\":\"Address of the implementation contract.\"}}},\"title\":\"Proxy\",\"version\":1},\"userdoc\":{\"events\":{\"AdminChanged(address,address)\":{\"notice\":\"An event that is emitted each time the owner is upgraded. This event is part of the EIP-1967 specification.\"},\"Upgraded(address)\":{\"notice\":\"An event that is emitted each time the implementation is changed. This event is part of the EIP-1967 specification.\"}},\"kind\":\"user\",\"methods\":{\"admin()\":{\"notice\":\"Gets the owner of the proxy contract.\"},\"changeAdmin(address)\":{\"notice\":\"Changes the owner of the proxy contract. Only callable by the owner.\"},\"constructor\":{\"notice\":\"Sets the initial admin during contract deployment. Admin address is stored at the EIP-1967 admin storage slot so that accidental storage collision with the implementation is not possible.\"},\"implementation()\":{\"notice\":\"Queries the implementation address.\"},\"upgradeTo(address)\":{\"notice\":\"Set the implementation contract address. The code at the given address will execute when this contract is called.\"},\"upgradeToAndCall(address,bytes)\":{\"notice\":\"Set the implementation and call a function in a single transaction. Useful to ensure atomic execution of initialization-based upgrades.\"}},\"notice\":\"Proxy is a transparent proxy that passes through the call if the caller is the owner or if the caller is address(0), meaning that the call originated from an off-chain simulation.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/universal/Proxy.sol\":\"Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/\",\":@rari-capital/solmate/=node_modules/@rari-capital/solmate/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\",\":hardhat-deploy/=node_modules/hardhat-deploy/\",\":hardhat/=node_modules/hardhat/\"]},\"sources\":{\"contracts/universal/Proxy.sol\":{\"keccak256\":\"0xe7b6a14774f21622e1c287faf730c5fbc69f75b73942ee2586ec0c3b07dfe573\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6874d44c7dab7ce269ec546b762f3fd101f73daedb0f247a19116be868643ddf\",\"dweb:/ipfs/QmPwUj5LneorU5bwryiCVcdpH3WTXBRqxsXUfQsJJgX4Gt\"]}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b5060405161091838038061091883398101604081905261002f916100b2565b6100388161003e565b506100e2565b60006100566000805160206108f88339815191525490565b6000805160206108f8833981519152839055604080516001600160a01b038084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b6000602082840312156100c457600080fd5b81516001600160a01b03811681146100db57600080fd5b9392505050565b610807806100f16000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103", + "deployedBytecode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a" +} \ No newline at end of file diff --git a/packages/contracts/deployments/kroma/MintManager.json b/packages/contracts/deployments/kroma/MintManager.json new file mode 100644 index 0000000000..b5b8b6f0f0 --- /dev/null +++ b/packages/contracts/deployments/kroma/MintManager.json @@ -0,0 +1,399 @@ +{ + "address": "0xA9D396A9c3775F8C4c8539de5E85dB5b5aaF42dE", + "abi": [ + { + "type": "constructor", + "inputs": [ + { + "name": "_governanceToken", + "type": "address", + "internalType": "address" + }, + { + "name": "_owner", + "type": "address", + "internalType": "address" + }, + { + "name": "_recipients", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "_shares", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "GOVERNANCE_TOKEN", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "contract GovernanceToken" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "MINT_CAP", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "SHARE_DENOMINATOR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "acceptOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "acceptOwnershipOfToken", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "distribute", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "mint", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "minted", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "pendingOwner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "recipients", + "inputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "renounceOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "renounceOwnershipOfToken", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "shareOf", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "transferOwnershipOfToken", + "inputs": [ + { + "name": "newMintManager", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "OwnershipTransferStarted", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + } + ], + "transactionHash": "0x45f0fa52a5f7aeececf8bb1b4a191833e8cc4571261d9d71e523a1eeb20eb78c", + "receipt": { + "to": null, + "from": "0xcc56801a72463d39903A4a4632E600289178F6bC", + "contractAddress": "0xA9D396A9c3775F8C4c8539de5E85dB5b5aaF42dE", + "transactionIndex": 2, + "gasUsed": "1276367", + "logsBloom": "0x00000000000000000000080000000000200000000000000000800000000000000010000400000000000000000000000000000000000000000000000001000000000000000000000000000000000000000001000000000000000000000000000000000000020000000200000000000800000800000000000000000000001000400000000000080000000000000000000000000000000000000000000000000000000000000000020000000000000000020000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x21acb8521edc5d77f8d6c108f8b135c2940267ab31dd98855a5bcc54d3980f07", + "transactionHash": "0x45f0fa52a5f7aeececf8bb1b4a191833e8cc4571261d9d71e523a1eeb20eb78c", + "logs": [ + { + "transactionIndex": 2, + "blockNumber": 13309683, + "transactionHash": "0x45f0fa52a5f7aeececf8bb1b4a191833e8cc4571261d9d71e523a1eeb20eb78c", + "address": "0xA9D396A9c3775F8C4c8539de5E85dB5b5aaF42dE", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000cc56801a72463d39903a4a4632e600289178f6bc" + ], + "data": "0x", + "logIndex": 4, + "blockHash": "0x21acb8521edc5d77f8d6c108f8b135c2940267ab31dd98855a5bcc54d3980f07" + }, + { + "transactionIndex": 2, + "blockNumber": 13309683, + "transactionHash": "0x45f0fa52a5f7aeececf8bb1b4a191833e8cc4571261d9d71e523a1eeb20eb78c", + "address": "0xA9D396A9c3775F8C4c8539de5E85dB5b5aaF42dE", + "topics": [ + "0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700", + "0x000000000000000000000000cc56801a72463d39903a4a4632e600289178f6bc", + "0x000000000000000000000000c0ab283e81ae99197cfe1c8bee9c593cd4ff7fb3" + ], + "data": "0x", + "logIndex": 5, + "blockHash": "0x21acb8521edc5d77f8d6c108f8b135c2940267ab31dd98855a5bcc54d3980f07" + } + ], + "blockNumber": 13309683, + "cumulativeGasUsed": "1854052", + "status": 1, + "byzantium": true + }, + "args": [ + "0x25500000d700bbE27104577CCcce8eAbCC96c8ad", + "0xc0ab283E81aE99197Cfe1C8BEE9C593CD4FF7FB3", + [ + "0xCaBEA75d7DfB70648e54b2a94ae1BA169f8a1114", + "0x7e5d87915Ed5d3380513f92180579B2497624DDF", + "0xcf4C24793C24E177976e37bF70751a9d78B90140", + "0xd94954f3A323A7947e65D978b55BCa4144c44Ae9", + "0xf4dE61D01028E4e7f1Eb62169723C990Faa09f04", + "0x06F6e40D72Fc57B625aDC995D721E5a41A603a08" + ], + [ + 40000, + 17000, + 7000, + 15800, + 2000, + 13000 + ] + ], + "numDeployments": 1, + "solcInputHash": "37a0cebac478897ae0c20446c8a2494a", + "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_governanceToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"_recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_shares\",\"type\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"GOVERNANCE_TOKEN\",\"outputs\":[{\"internalType\":\"contract GovernanceToken\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINT_CAP\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SHARE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnershipOfToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"distribute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"recipients\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnershipOfToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"shareOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newMintManager\",\"type\":\"address\"}],\"name\":\"transferOwnershipOfToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"acceptOwnership()\":{\"details\":\"The new owner accepts the ownership transfer.\"},\"constructor\":{\"params\":{\"_governanceToken\":\"The GovernanceToken this contract can mint tokens of.\",\"_owner\":\"The owner of this contract.\",\"_recipients\":\"List of the recipients.\",\"_shares\":\"List of token distribution ratios for each recipient.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"pendingOwner()\":{\"details\":\"Returns the address of the pending owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner.\"},\"transferOwnershipOfToken(address)\":{\"params\":{\"newMintManager\":\"The new MintManager to own the GovernanceToken.\"}}},\"title\":\"MintManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"GOVERNANCE_TOKEN()\":{\"notice\":\"The GovernanceToken that the MintManager can mint.\"},\"MINT_CAP()\":{\"notice\":\"The amount of tokens that can be minted.\"},\"SHARE_DENOMINATOR()\":{\"notice\":\"The denominator of each recipient's share.\"},\"acceptOwnershipOfToken()\":{\"notice\":\"Only the owner is allowed to accept the ownership of the GovernanceToken.\"},\"constructor\":{\"notice\":\"Constructs the MintManager contract.\"},\"distribute()\":{\"notice\":\"Only the owner is allowed to distribute the GovernanceToken to specified recipients.\"},\"mint()\":{\"notice\":\"Only the owner is allowed to mint mint cap amount of the GovernanceToken at once.\"},\"minted()\":{\"notice\":\"True when already minted on this chain. MintManager can mint only once on each chain.\"},\"recipients(uint256)\":{\"notice\":\"A list of recipient addresses that will receive tokens to be distributed.\"},\"renounceOwnershipOfToken()\":{\"notice\":\"Only the owner is allowed to renounce the ownership of the GovernanceToken.\"},\"shareOf(address)\":{\"notice\":\"A mapping of the recipient's address to share.\"},\"transferOwnershipOfToken(address)\":{\"notice\":\"Only the owner is allowed to transfer the ownership of the GovernanceToken.\"}},\"notice\":\"MintManager issues mint cap amount of GovernanceToken at once (TGE) and distributes the tokens to specified recipients.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/governance/MintManager.sol\":\"MintManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/\",\":@rari-capital/solmate/=node_modules/@rari-capital/solmate/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\",\":hardhat-deploy/=node_modules/hardhat-deploy/\",\":hardhat/=node_modules/hardhat/\"]},\"sources\":{\"contracts/governance/GovernanceToken.sol\":{\"keccak256\":\"0x98304239f5ca6cc0c68dedf47b31ec5ceaeb11fed78d007dc16afb72d6a152a5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6cffce351c0d797a1c46e2eb3355324c86693cd9d48cd291cc30f0badb1843b4\",\"dweb:/ipfs/QmajzzFw1GT51LH1VBKh378xxwSLXxs6erBvUVxzFVkeLj\"]},\"contracts/governance/MintManager.sol\":{\"keccak256\":\"0xadda6a066e4b12ff23e7ff1cb4fdad43106b1b1e44389ea24453fccb0e5c71c8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2ea61e95d9edbf73c56b92dea9b75f66bb76354cff61547df52efa41cd95d07b\",\"dweb:/ipfs/QmRBpLcAHeDBpV8dLgtRaBdA6BzBU6CJmgyoSHCwK8U5cW\"]},\"contracts/universal/IKromaMintableERC20.sol\":{\"keccak256\":\"0x1a95268117456ddb1e0a16eb2ba773b9540c7b8b9520e66d4d167ddc6ace6fcb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f93d2e6f5121a3dfe272e399d6774e0584d59a20c4f63db78e5a0b644d92fa59\",\"dweb:/ipfs/QmbwM7kCpmwZs348jCeNwF86H8SDBURsGCGCUCyoSS1ffy\"]},\"contracts/universal/ISemver.sol\":{\"keccak256\":\"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a\",\"dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR\"]},\"contracts/universal/KromaMintableERC20.sol\":{\"keccak256\":\"0x30dccac5fe2d7c75bbe1411004ad03c40afe6dce8c7d22a89abb783f74bd2674\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://de3f8062e170498d71069529cb83681b0acaeb41643892c092111b07df2895f6\",\"dweb:/ipfs/QmNsZa5vHYQ8eG3dQ7PjkfweXzxKc6nbDj9P455Mp1Waxx\"]},\"node_modules/@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\":{\"keccak256\":\"0x84efb8889801b0ac817324aff6acc691d07bbee816b671817132911d287a8c63\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ec6df2255fadc251ea905043c47bf55170ee6cb5d7ca8b5c8ed54c84eac9d09e\",\"dweb:/ipfs/QmaokWfuL59uarki5yoDGbPzh4cErzEfnAzfmesTNJNXE9\"]},\"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://99c8cb3cd19a44bbfb6612605affb7d8b06cee1f6aa9362a37a8672b4f7eeaf8\",\"dweb:/ipfs/QmasyxFDBUp7k5KFgfDWEzM8PYSKEq7GVznzMJ1VxVRF4B\"]},\"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f103ee2e4aecd37aac6ceefe670709cdd7613dee25fa2d4d9feaf7fc0aaa155e\",\"dweb:/ipfs/QmRiNZLoJk5k3HPMYGPGjZFd2ke1ZxjhJZkM45Ec9GH9hv\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://310136ad60820af4177a11a61d77a3686faf5fca4942b600e08fc940db38396b\",\"dweb:/ipfs/QmbCzMNSTL7Zi7M4UCSqBrkHtp4jjxUnGbkneCZKdR1qeq\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"node_modules/@openzeppelin/contracts/access/Ownable.sol\":{\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fc980984badf3984b6303b377711220e067722bbd6a135b24669ff5069ef9f32\",\"dweb:/ipfs/QmPHXMSXj99XjSVM21YsY6aNtLLjLVXDbyN76J5HQYvvrz\"]},\"node_modules/@openzeppelin/contracts/access/Ownable2Step.sol\":{\"keccak256\":\"0xde231558366826d7cb61725af8147965a61c53b77a352cc8c9af38fc5a92ac3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1fd55624076bf61d44af5ff351919e32dda748567acfbdd6ba3d6c7be61c758e\",\"dweb:/ipfs/QmSki4dTrf4GPm7MTpG3fk8mC7rnjwd2zMomLp6jLuF63Q\"]},\"node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"keccak256\":\"0x1618ddebe73377660f6da71afcba35d5ac4c4600918b3a381d9c6f37eba613eb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://666c8d7c62478b55e082f1835275b7acfc1595491998df6d67183ff2c70eab96\",\"dweb:/ipfs/QmVXmnXfxNaLhoX283dqyKJ8DJbF5thUd9sMuRoFpNMwr7\"]},\"node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol\":{\"keccak256\":\"0xac6c2efc64baccbde4904ae18ed45139c9aa8cff96d6888344d1e4d2eb8b659f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6e416a280c610b6b7a5f158e4a41aacfaec01ef14d5d1de13b46be9e090265fc\",\"dweb:/ipfs/QmYZP2KrdyccBbhLZT42auhvBTMkwiwUS3V6HWb42rbwbG\"]},\"node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol\":{\"keccak256\":\"0xfc12b717f6a2cd0d67adc8700097d4464d37f18ce933d4fc9c948ab6aec35e80\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://82386e69ebe902a2edfd4f8a5ecbeaeb2e00f6cc6481a973729e974373fb492e\",\"dweb:/ipfs/QmSXg4wBMBd83mQvkekT1GsiRX2Qyv5gvrqzv5qJx2M7Kc\"]},\"node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol\":{\"keccak256\":\"0xcaea9aeda3816ba872358c828f4f01455c22ae48ced49c4c7d72bd74176c09b9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://16ff22d8df5aee94510ee43d361b6147caef164941a684cedcb75be44f351fe6\",\"dweb:/ipfs/QmaCCwMdHVdPApuEJHLZapSJyA7mp5dAugpma3VUzWGd8E\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0xa56ca923f70c1748830700250b19c61b70db9a683516dc5e216694a50445d99c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cac938788bc4be12101e59d45588b4e059579f4e61062e1cda8d6b06c0191b15\",\"dweb:/ipfs/QmV2JKCyjTVH3rkWNrfdJRhAT7tZ3usAN2XcnD4h53Mvih\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bd39944e8fc06be6dbe2dd1d8449b5336e23c6a7ba3e8e9ae5ae0f37f35283f5\",\"dweb:/ipfs/QmPV3FGYjVwvKSgAXKUN3r9T9GwniZz83CxBpM7vyj2G53\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol\":{\"keccak256\":\"0x36c00327e3f9afd929cc2721aaa111ab57eff78a630cc364b279ad576b899295\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f5bf927f4c8b71a5809be184c3107b915b0445ab2c4a33208331e5376692eb5a\",\"dweb:/ipfs/QmVXirsCY1sf4kodhbL6w3NWZkeZeaMuQB7M6DBAdZNqFE\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\":{\"keccak256\":\"0x4e560f86662b6f72ab76122fff53317677154f14bac4a80dbd46a54172b3abfa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ca5c2518d247417cb01164f04eff57b7e87b5346bc03478ada916f26117aa7fd\",\"dweb:/ipfs/QmVgK66XGZCiH9x4mhqejKUTujtu68DyE6KrYi6MPuaHRJ\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd\",\"dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\":{\"keccak256\":\"0xec63854014a5b4f2b3290ab9103a21bdf902a508d0f41a8573fea49e98bf571a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bc5b5dc12fbc4002f282eaa7a5f06d8310ed62c1c77c5770f6283e058454c39a\",\"dweb:/ipfs/Qme9rE2wS3yBuyJq9GgbmzbsBQsW2M2sVFqYYLw7bosGrv\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"node_modules/@openzeppelin/contracts/utils/Counters.sol\":{\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://59e1c62884d55b70f3ae5432b44bb3166ad71ae3acd19c57ab6ddc3c87c325ee\",\"dweb:/ipfs/QmezuXg5GK5oeA4F91EZhozBFekhq5TD966bHPH18cCqhu\"]},\"node_modules/@openzeppelin/contracts/utils/ShortStrings.sol\":{\"keccak256\":\"0xc0e310c163edf15db45d4ff938113ab357f94fa86e61ea8e790853c4d2e13256\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://04db5bc05dcb05ba1f6ca2dfbead17adc8a2e2f911aa80b05e7a36d9eaf96516\",\"dweb:/ipfs/QmVkfHZbXVBUPsTopueCn3qGJX8aEjahFF3Fn4NcygLNm5\"]},\"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xf09e68aa0dc6722a25bc46490e8d48ed864466d17313b8a0b254c36b54e49899\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e26daf81e2252dc1fe1ce0e4b55c2eb7c6d1ee84ae6558d1a9554432ea1d32da\",\"dweb:/ipfs/Qmb1UANWiWq5pCKbmHSu772hd4nt374dVaghGmwSVNuk8Q\"]},\"node_modules/@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b81d9ff6559ea5c47fc573e17ece6d9ba5d6839e213e6ebc3b4c5c8fe4199d7f\",\"dweb:/ipfs/QmPCW1bFisUzJkyjroY3yipwfism9RRCigCcK1hbXtVM8n\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0x809bc3edb4bcbef8263fa616c1b60ee0004b50a8a1bfa164d8f57fd31f520c58\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8b93a1e39a4a19eba1600b92c96f435442db88cac91e315c8291547a2a7bcfe2\",\"dweb:/ipfs/QmTm34KVe6uZBZwq8dZDNWwPcm24qBJdxqL3rPxBJ4LrMv\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol\":{\"keccak256\":\"0x8432884527a7ad91e6eed1cfc5a0811ae2073e5bca107bd0ca442e9236b03dbd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e3aa0eadab7aafcf91a95684765f778f64386f0368de88522ce873c21385278a\",\"dweb:/ipfs/QmPfaVAqWgH1QsT3dHVuL6jwMZbVKdoP8w1PvpiPT2FPWd\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f\",\"dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy\"]},\"node_modules/@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cc8841b3cd48ad125e2f46323c8bad3aa0e88e399ec62acb9e57efa7e7c8058c\",\"dweb:/ipfs/QmSqE4mXHA2BXW58deDbXE8MTcsL5JSKNDbm23sVQxRLPS\"]},\"node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x52a8cfb0f5239d11b457dcdd1b326992ef672714ca8da71a157255bddd13f3ad\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://495145362c7ff1c9ca88c58bbbbcb412e3c2004406647412394486552ff6c278\",\"dweb:/ipfs/QmNNCeng6d5eRPDn6tkWSQhjE39XWfQEfjA63rRwHmr1iH\"]},\"node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c50fcc459e49a9858b6d8ad5f911295cb7c9ab57567845a250bf0153f84a95c7\",\"dweb:/ipfs/QmcEW85JRzvDkQggxiBBLVAasXWdkhEysqypj9EaB6H2g6\"]}},\"version\":1}", + "bytecode": "0x60a06040523480156200001157600080fd5b506040516200169338038062001693833981016040819052620000349162000574565b6200003f336200032a565b6001600160a01b038416608052620000578362000354565b8051825114620000ba5760405162461bcd60e51b8152602060048201526024808201527f4d696e744d616e616765723a20696e76616c6964206c656e677468206f6620616044820152637272617960e01b60648201526084015b60405180910390fd5b6000805b835181101562000295576000848281518110620000df57620000df6200066a565b6020026020010151905060006001600160a01b0316816001600160a01b031603620001605760405162461bcd60e51b815260206004820152602a60248201527f4d696e744d616e616765723a20726563697069656e74206164647265737320636044820152690616e6e6f7420626520360b41b6064820152608401620000b1565b60008483815181106200017757620001776200066a565b6020026020010151905080600003620001d35760405162461bcd60e51b815260206004820152601e60248201527f4d696e744d616e616765723a2073686172652063616e6e6f74206265203000006044820152606401620000b1565b6001600160a01b03821660009081526003602052604081205490036200023f57600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0384161790555b6001600160a01b038216600090815260036020526040812080548392906200026990849062000696565b909155506200027b9050818562000696565b9350505080806200028c90620006b1565b915050620000be565b50620186a08111156200031f5760405162461bcd60e51b8152602060048201526044602482018190527f4d696e744d616e616765723a206d617820746f74616c20736861726520697320908201527f657175616c206f72206c657373207468616e2053484152455f44454e4f4d494e60648201526320aa27a960e11b608482015260a401620000b1565b5050505050620006cd565b600180546001600160a01b03191690556200035181620003c7602090811b62000b5317901c565b50565b6200035e62000417565b600180546001600160a01b0319166001600160a01b0383169081179091556200038f6000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b03163314620004735760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620000b1565b565b80516001600160a01b03811681146200048d57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620004d357620004d362000492565b604052919050565b60006001600160401b03821115620004f757620004f762000492565b5060051b60200190565b600082601f8301126200051357600080fd5b815160206200052c6200052683620004db565b620004a8565b82815260059290921b840181019181810190868411156200054c57600080fd5b8286015b8481101562000569578051835291830191830162000550565b509695505050505050565b600080600080608085870312156200058b57600080fd5b620005968562000475565b93506020620005a781870162000475565b60408701519094506001600160401b0380821115620005c557600080fd5b818801915088601f830112620005da57600080fd5b8151620005eb6200052682620004db565b81815260059190911b8301840190848101908b8311156200060b57600080fd5b938501935b828510156200063457620006248562000475565b8252938501939085019062000610565b60608b015190975094505050808311156200064e57600080fd5b50506200065e8782880162000501565b91505092959194509250565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115620006ac57620006ac62000680565b500190565b600060018201620006c657620006c662000680565b5060010190565b608051610f796200071a6000396000818161014f01528181610331015281816104a3015281816105610152818161062e0152818161080a015281816108b30152610a190152610f796000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80637eb1184511610097578063d1bc76a111610066578063d1bc76a114610229578063e30c39781461023c578063e4fc6b6d1461025a578063f2fde38b1461026257600080fd5b80637eb11845146101ee5780638da5cb5b146101f857806398f1312e14610216578063baee5ed41461022157600080fd5b8063457c3977116100d3578063457c3977146101965780634f02c420146101a9578063715018a6146101de57806379ba5097146101e657600080fd5b80631249c58b1461010557806321e5e2c41461010f57806328df3f18146101425780632efd46d61461014a575b600080fd5b61010d610275565b005b61012f61011d366004610c7a565b60036020526000908152604090205481565b6040519081526020015b60405180910390f35b61010d610557565b6101717f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610139565b61010d6101a4366004610c7a565b6105e1565b6001546101ce9074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610139565b61010d61068d565b61010d6106a1565b61012f620186a081565b60005473ffffffffffffffffffffffffffffffffffffffff16610171565b61012f633b9aca0081565b61010d610756565b610171610237366004610cb7565b610870565b60015473ffffffffffffffffffffffffffffffffffffffff16610171565b61010d6108a7565b61010d610270366004610c7a565b610aa3565b61027d610bc8565b60015474010000000000000000000000000000000000000000900460ff161561032d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4d696e744d616e616765723a20616c7265616479206d696e746564206f6e207460448201527f68697320636861696e000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561039a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103be9190610cd0565b6103c990600a610e44565b6103d790633b9aca00610e53565b90506000805b60025481101561046d576000600282815481106103fc576103fc610e90565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168083526003909152604082205490925090620186a061043f8388610e53565b6104499190610ebf565b90506104558186610efa565b9450505050808061046590610f12565b9150506103dd565b506040517f40c10f19000000000000000000000000000000000000000000000000000000008152306004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906340c10f1990604401600060405180830381600087803b1580156104fc57600080fd5b505af1158015610510573d6000803e3d6000fd5b5050600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905550505050565b61055f610bc8565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379ba50976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105c757600080fd5b505af11580156105db573d6000803e3d6000fd5b50505050565b6105e9610bc8565b6040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063f2fde38b90602401600060405180830381600087803b15801561067257600080fd5b505af1158015610686573d6000803e3d6000fd5b5050505050565b610695610bc8565b61069f6000610c49565b565b600154339073ffffffffffffffffffffffffffffffffffffffff16811461074a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610324565b61075381610c49565b50565b61075e610bc8565b60015474010000000000000000000000000000000000000000900460ff16610808576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4d696e744d616e616765723a206e6f74206d696e746564206265666f7265207260448201527f656e6f756e6365206f776e6572736869700000000000000000000000000000006064820152608401610324565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663715018a66040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105c757600080fd5b6002818154811061088057600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b6108af610bc8565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561091c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109409190610cd0565b61094b90600a610e44565b61095990633b9aca00610e53565b905060005b600254811015610a9f5760006002828154811061097d5761097d610e90565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168083526003909152604082205490925090620186a06109c08387610e53565b6109ca9190610ebf565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af1158015610a64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a889190610f4a565b505050508080610a9790610f12565b91505061095e565b5050565b610aab610bc8565b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009091168117909155610b0e60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461069f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610324565b600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905561075381610b53565b600060208284031215610c8c57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610cb057600080fd5b9392505050565b600060208284031215610cc957600080fd5b5035919050565b600060208284031215610ce257600080fd5b815160ff81168114610cb057600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b80851115610d7b57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610d6157610d61610cf3565b80851615610d6e57918102915b93841c9390800290610d27565b509250929050565b600082610d9257506001610e3e565b81610d9f57506000610e3e565b8160018114610db55760028114610dbf57610ddb565b6001915050610e3e565b60ff841115610dd057610dd0610cf3565b50506001821b610e3e565b5060208310610133831016604e8410600b8410161715610dfe575081810a610e3e565b610e088383610d22565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610e3a57610e3a610cf3565b0290505b92915050565b6000610cb060ff841683610d83565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610e8b57610e8b610cf3565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082610ef5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008219821115610f0d57610f0d610cf3565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610f4357610f43610cf3565b5060010190565b600060208284031215610f5c57600080fd5b81518015158114610cb057600080fdfea164736f6c634300080f000a", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101005760003560e01c80637eb1184511610097578063d1bc76a111610066578063d1bc76a114610229578063e30c39781461023c578063e4fc6b6d1461025a578063f2fde38b1461026257600080fd5b80637eb11845146101ee5780638da5cb5b146101f857806398f1312e14610216578063baee5ed41461022157600080fd5b8063457c3977116100d3578063457c3977146101965780634f02c420146101a9578063715018a6146101de57806379ba5097146101e657600080fd5b80631249c58b1461010557806321e5e2c41461010f57806328df3f18146101425780632efd46d61461014a575b600080fd5b61010d610275565b005b61012f61011d366004610c7a565b60036020526000908152604090205481565b6040519081526020015b60405180910390f35b61010d610557565b6101717f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610139565b61010d6101a4366004610c7a565b6105e1565b6001546101ce9074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610139565b61010d61068d565b61010d6106a1565b61012f620186a081565b60005473ffffffffffffffffffffffffffffffffffffffff16610171565b61012f633b9aca0081565b61010d610756565b610171610237366004610cb7565b610870565b60015473ffffffffffffffffffffffffffffffffffffffff16610171565b61010d6108a7565b61010d610270366004610c7a565b610aa3565b61027d610bc8565b60015474010000000000000000000000000000000000000000900460ff161561032d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4d696e744d616e616765723a20616c7265616479206d696e746564206f6e207460448201527f68697320636861696e000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561039a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103be9190610cd0565b6103c990600a610e44565b6103d790633b9aca00610e53565b90506000805b60025481101561046d576000600282815481106103fc576103fc610e90565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168083526003909152604082205490925090620186a061043f8388610e53565b6104499190610ebf565b90506104558186610efa565b9450505050808061046590610f12565b9150506103dd565b506040517f40c10f19000000000000000000000000000000000000000000000000000000008152306004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906340c10f1990604401600060405180830381600087803b1580156104fc57600080fd5b505af1158015610510573d6000803e3d6000fd5b5050600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905550505050565b61055f610bc8565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379ba50976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105c757600080fd5b505af11580156105db573d6000803e3d6000fd5b50505050565b6105e9610bc8565b6040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063f2fde38b90602401600060405180830381600087803b15801561067257600080fd5b505af1158015610686573d6000803e3d6000fd5b5050505050565b610695610bc8565b61069f6000610c49565b565b600154339073ffffffffffffffffffffffffffffffffffffffff16811461074a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610324565b61075381610c49565b50565b61075e610bc8565b60015474010000000000000000000000000000000000000000900460ff16610808576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4d696e744d616e616765723a206e6f74206d696e746564206265666f7265207260448201527f656e6f756e6365206f776e6572736869700000000000000000000000000000006064820152608401610324565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663715018a66040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105c757600080fd5b6002818154811061088057600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b6108af610bc8565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561091c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109409190610cd0565b61094b90600a610e44565b61095990633b9aca00610e53565b905060005b600254811015610a9f5760006002828154811061097d5761097d610e90565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168083526003909152604082205490925090620186a06109c08387610e53565b6109ca9190610ebf565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af1158015610a64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a889190610f4a565b505050508080610a9790610f12565b91505061095e565b5050565b610aab610bc8565b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009091168117909155610b0e60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461069f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610324565b600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905561075381610b53565b600060208284031215610c8c57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610cb057600080fd5b9392505050565b600060208284031215610cc957600080fd5b5035919050565b600060208284031215610ce257600080fd5b815160ff81168114610cb057600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b80851115610d7b57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610d6157610d61610cf3565b80851615610d6e57918102915b93841c9390800290610d27565b509250929050565b600082610d9257506001610e3e565b81610d9f57506000610e3e565b8160018114610db55760028114610dbf57610ddb565b6001915050610e3e565b60ff841115610dd057610dd0610cf3565b50506001821b610e3e565b5060208310610133831016604e8410600b8410161715610dfe575081810a610e3e565b610e088383610d22565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610e3a57610e3a610cf3565b0290505b92915050565b6000610cb060ff841683610d83565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610e8b57610e8b610cf3565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082610ef5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008219821115610f0d57610f0d610cf3565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610f4357610f43610cf3565b5060010190565b600060208284031215610f5c57600080fd5b81518015158114610cb057600080fdfea164736f6c634300080f000a", + "devdoc": {}, + "userdoc": {}, + "storageLayout": { + "storage": [ + { + "astId": 1524, + "contract": "contracts/governance/MintManager.sol:MintManager", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 1637, + "contract": "contracts/governance/MintManager.sol:MintManager", + "label": "_pendingOwner", + "offset": 0, + "slot": "1", + "type": "t_address" + }, + { + "astId": 240, + "contract": "contracts/governance/MintManager.sol:MintManager", + "label": "minted", + "offset": 20, + "slot": "1", + "type": "t_bool" + }, + { + "astId": 244, + "contract": "contracts/governance/MintManager.sol:MintManager", + "label": "recipients", + "offset": 0, + "slot": "2", + "type": "t_array(t_address)dyn_storage" + }, + { + "astId": 249, + "contract": "contracts/governance/MintManager.sol:MintManager", + "label": "shareOf", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_uint256)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_address)dyn_storage": { + "encoding": "dynamic_array", + "label": "address[]", + "numberOfBytes": "32", + "base": "t_address" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/kroma/solcInputs/1cc21f973aa4cfc73d832518987f54f8.json b/packages/contracts/deployments/kroma/solcInputs/1cc21f973aa4cfc73d832518987f54f8.json new file mode 100644 index 0000000000..2cc08a7522 --- /dev/null +++ b/packages/contracts/deployments/kroma/solcInputs/1cc21f973aa4cfc73d832518987f54f8.json @@ -0,0 +1,132 @@ +{ + "language": "Solidity", + "sources": { + "contracts/governance/GovernanceToken.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.15;\n\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\";\nimport \"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\";\n\nimport { KromaMintableERC20 } from \"../universal/KromaMintableERC20.sol\";\n\n/**\n * @custom:proxied\n * @title GovernanceToken\n * @notice The KRO token used in governance, supporting voting and delegation. Implements\n * EIP 2612 allowing signed approvals. `mint` function is only allowed to the owner or\n * `Bridge`, and the total supply amount is minted at once (TGE). `Bridge` has the\n * permission to `mint` and `burn`, for the purpose of bridging KRO to the remote chain.\n */\ncontract GovernanceToken is KromaMintableERC20, ERC20Votes, Ownable2StepUpgradeable {\n /**\n * @notice Constructs the GovernanceToken contract.\n *\n * @param _bridge Address of the StandardBridge contract on this network.\n * @param _remoteToken Address of the corresponding token on the remote chain.\n */\n constructor(\n address _bridge,\n address _remoteToken\n ) KromaMintableERC20(_bridge, _remoteToken, \"\", \"\") ERC20Permit(\"Kroma\") {\n _disableInitializers();\n }\n\n /**\n * @notice Initializer.\n *\n * @param _owner The owner of this contract.\n */\n function initialize(address _owner) public initializer {\n __Ownable2Step_init();\n transferOwnership(_owner);\n }\n\n /**\n * @notice Allows StandardBridge or the owner to mint tokens.\n *\n * @param _to Address to mint tokens to.\n * @param _amount Amount of tokens to mint.\n */\n function mint(address _to, uint256 _amount) external override {\n require(\n msg.sender == BRIDGE || msg.sender == owner(),\n \"GovernanceToken: only bridge or owner can mint\"\n );\n\n _mint(_to, _amount);\n }\n\n /**\n * @inheritdoc KromaMintableERC20\n */\n function burn(address _from, uint256 _amount) external override onlyBridge {\n _burn(_from, _amount);\n }\n\n /**\n * @inheritdoc ERC20\n */\n function name() public pure override returns (string memory) {\n return \"Kroma\";\n }\n\n /**\n * @inheritdoc ERC20\n */\n function symbol() public pure override returns (string memory) {\n return \"KRO\";\n }\n\n /**\n * @notice Callback called after a token transfer.\n *\n * @param from The account sending tokens.\n * @param to The account receiving tokens.\n * @param amount The amount of tokens being transferred.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20, ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n\n /**\n * @notice Internal mint function.\n *\n * @param account The account receiving minted tokens.\n * @param amount The amount of tokens to mint.\n */\n function _mint(address account, uint256 amount) internal override(ERC20, ERC20Votes) {\n super._mint(account, amount);\n emit Mint(account, amount);\n }\n\n /**\n * @notice Internal burn function.\n *\n * @param account The account that tokens will be burned from.\n * @param amount The amount of tokens that will be burned.\n */\n function _burn(address account, uint256 amount) internal override(ERC20, ERC20Votes) {\n super._burn(account, amount);\n emit Burn(account, amount);\n }\n\n /**\n * @notice Override function.\n */\n function _msgSender() internal view override(Context, ContextUpgradeable) returns (address) {\n return super._msgSender();\n }\n\n /**\n * @notice Override function.\n */\n function _msgData()\n internal\n view\n override(Context, ContextUpgradeable)\n returns (bytes calldata)\n {\n return super._msgData();\n }\n}\n" + }, + "contracts/universal/IKromaMintableERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport { IERC165 } from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\n/**\n * @title IKromaMintableERC20\n * @notice This interface is available on the KromaMintableERC20 contract. We declare it as a\n * separate interface so that it can be used in custom implementations of\n * KromaMintableERC20.\n */\ninterface IKromaMintableERC20 {\n function REMOTE_TOKEN() external view returns (address);\n\n function BRIDGE() external view returns (address);\n\n function mint(address _to, uint256 _amount) external;\n\n function burn(address _from, uint256 _amount) external;\n}\n" + }, + "contracts/universal/ISemver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title ISemver\n/// @notice ISemver is a simple contract for ensuring that contracts are\n/// versioned using semantic versioning.\ninterface ISemver {\n /// @notice Getter for the semantic version of the contract. This is not\n /// meant to be used onchain but instead meant to be used by offchain\n /// tooling.\n /// @return Semver contract version as a string.\n function version() external view returns (string memory);\n}\n" + }, + "contracts/universal/KromaMintableERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.15;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { IERC165 } from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\nimport { ISemver } from \"../universal/ISemver.sol\";\nimport { IKromaMintableERC20 } from \"./IKromaMintableERC20.sol\";\n\n/**\n * @title KromaMintableERC20\n * @notice KromaMintableERC20 is a standard extension of the base ERC20 token contract designed\n * to allow the StandardBridge contracts to mint and burn tokens. This makes it possible to\n * use a KromaMintableRC20 as the L2 representation of an L1 token, or vice-versa.\n * Designed to be backwards compatible with the older StandardL2ERC20 token which was only\n * meant for use on L2.\n */\ncontract KromaMintableERC20 is IKromaMintableERC20, ERC20, ISemver {\n /**\n * @notice Address of the corresponding version of this token on the remote chain.\n */\n address public immutable REMOTE_TOKEN;\n\n /**\n * @notice Address of the StandardBridge on this network.\n */\n address public immutable BRIDGE;\n\n /**\n * @notice Emitted whenever tokens are minted for an account.\n *\n * @param account Address of the account tokens are being minted for.\n * @param amount Amount of tokens minted.\n */\n event Mint(address indexed account, uint256 amount);\n\n /**\n * @notice Emitted whenever tokens are burned from an account.\n *\n * @param account Address of the account tokens are being burned from.\n * @param amount Amount of tokens burned.\n */\n event Burn(address indexed account, uint256 amount);\n\n /**\n * @notice A modifier that only allows the bridge to call\n */\n modifier onlyBridge() {\n require(msg.sender == BRIDGE, \"KromaMintableERC20: only bridge can mint and burn\");\n _;\n }\n\n /**\n * @notice Semantic version.\n * @custom:semver 1.0.0\n */\n string public constant version = \"1.0.0\";\n\n /**\n * @notice Constructs the KromaMintableERC20 contract.\n *\n * @param _bridge Address of the L2 standard bridge.\n * @param _remoteToken Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _bridge,\n address _remoteToken,\n string memory _name,\n string memory _symbol\n ) ERC20(_name, _symbol) {\n REMOTE_TOKEN = _remoteToken;\n BRIDGE = _bridge;\n }\n\n /**\n * @notice Allows the StandardBridge on this network to mint tokens.\n *\n * @param _to Address to mint tokens to.\n * @param _amount Amount of tokens to mint.\n */\n function mint(address _to, uint256 _amount)\n external\n virtual\n override(IKromaMintableERC20)\n onlyBridge\n {\n _mint(_to, _amount);\n emit Mint(_to, _amount);\n }\n\n /**\n * @notice Allows the StandardBridge on this network to burn tokens.\n *\n * @param _from Address to burn tokens from.\n * @param _amount Amount of tokens to burn.\n */\n function burn(address _from, uint256 _amount)\n external\n virtual\n override(IKromaMintableERC20)\n onlyBridge\n {\n _burn(_from, _amount);\n emit Burn(_from, _amount);\n }\n\n /**\n * @notice ERC165 interface check function.\n *\n * @param _interfaceId Interface ID to check.\n *\n * @return Whether or not the interface is supported by this contract.\n */\n function supportsInterface(bytes4 _interfaceId) external pure returns (bool) {\n bytes4 iface1 = type(IERC165).interfaceId;\n // Interface corresponding to the updated KromaMintableERC20 (this contract).\n bytes4 iface2 = type(IKromaMintableERC20).interfaceId;\n return _interfaceId == iface1 || _interfaceId == iface2;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (governance/utils/IVotes.sol)\npragma solidity ^0.8.0;\n\n/**\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\n *\n * _Available since v4.5._\n */\ninterface IVotes {\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Returns the current amount of votes that `account` has.\n */\n function getVotes(address account) external view returns (uint256);\n\n /**\n * @dev Returns the amount of votes that `account` had at a specific moment in the past. If the `clock()` is\n * configured to use block numbers, this will return the value at the end of the corresponding block.\n */\n function getPastVotes(address account, uint256 timepoint) external view returns (uint256);\n\n /**\n * @dev Returns the total supply of votes available at a specific moment in the past. If the `clock()` is\n * configured to use block numbers, this will return the value at the end of the corresponding block.\n *\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\n * vote.\n */\n function getPastTotalSupply(uint256 timepoint) external view returns (uint256);\n\n /**\n * @dev Returns the delegate that `account` has chosen.\n */\n function delegates(address account) external view returns (address);\n\n /**\n * @dev Delegates votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) external;\n\n /**\n * @dev Delegates votes from signer to `delegatee`.\n */\n function delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) external;\n}\n" + }, + "node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5267.sol)\n\npragma solidity ^0.8.0;\n\ninterface IERC5267 {\n /**\n * @dev MAY be emitted to signal that the domain could have changed.\n */\n event EIP712DomainChanged();\n\n /**\n * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712\n * signature.\n */\n function eip712Domain()\n external\n view\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n );\n}\n" + }, + "node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5805.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../governance/utils/IVotes.sol\";\nimport \"./IERC6372.sol\";\n\ninterface IERC5805 is IERC6372, IVotes {}\n" + }, + "node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC6372.sol)\n\npragma solidity ^0.8.0;\n\ninterface IERC6372 {\n /**\n * @dev Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting).\n */\n function clock() external view returns (uint48);\n\n /**\n * @dev Description of the clock\n */\n // solhint-disable-next-line func-name-mixedcase\n function CLOCK_MODE() external view returns (string memory);\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the default value returned by this function, unless\n * it's overridden.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(address from, address to, uint256 amount) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\n // decrementing then incrementing.\n _balances[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n unchecked {\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\n _balances[account] += amount;\n }\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n // Overflow not possible: amount <= accountBalance <= totalSupply.\n _totalSupply -= amount;\n }\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(address owner, address spender, uint256 amount) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20Permit.sol\";\nimport \"../ERC20.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\nimport \"../../../utils/cryptography/EIP712.sol\";\nimport \"../../../utils/Counters.sol\";\n\n/**\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * _Available since v3.4._\n */\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\n using Counters for Counters.Counter;\n\n mapping(address => Counters.Counter) private _nonces;\n\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private constant _PERMIT_TYPEHASH =\n keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n /**\n * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.\n * However, to ensure consistency with the upgradeable transpiler, we will continue\n * to reserve a slot.\n * @custom:oz-renamed-from _PERMIT_TYPEHASH\n */\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;\n\n /**\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n *\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\n */\n constructor(string memory name) EIP712(name, \"1\") {}\n\n /**\n * @dev See {IERC20Permit-permit}.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= deadline, \"ERC20Permit: expired deadline\");\n\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\n\n bytes32 hash = _hashTypedDataV4(structHash);\n\n address signer = ECDSA.recover(hash, v, r, s);\n require(signer == owner, \"ERC20Permit: invalid signature\");\n\n _approve(owner, spender, value);\n }\n\n /**\n * @dev See {IERC20Permit-nonces}.\n */\n function nonces(address owner) public view virtual override returns (uint256) {\n return _nonces[owner].current();\n }\n\n /**\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\n return _domainSeparatorV4();\n }\n\n /**\n * @dev \"Consume a nonce\": return the current value and increment.\n *\n * _Available since v4.1._\n */\n function _useNonce(address owner) internal virtual returns (uint256 current) {\n Counters.Counter storage nonce = _nonces[owner];\n current = nonce.current();\n nonce.increment();\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Votes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20Permit.sol\";\nimport \"../../../interfaces/IERC5805.sol\";\nimport \"../../../utils/math/Math.sol\";\nimport \"../../../utils/math/SafeCast.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is ERC20Permit, IERC5805 {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n /**\n * @dev Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting).\n */\n function clock() public view virtual override returns (uint48) {\n return SafeCast.toUint48(block.number);\n }\n\n /**\n * @dev Description of the clock\n */\n // solhint-disable-next-line func-name-mixedcase\n function CLOCK_MODE() public view virtual override returns (string memory) {\n // Check that the clock was not modified\n require(clock() == block.number, \"ERC20Votes: broken clock mode\");\n return \"mode=blocknumber&from=default\";\n }\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual override returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view virtual override returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n unchecked {\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `timepoint`.\n *\n * Requirements:\n *\n * - `timepoint` must be in the past\n */\n function getPastVotes(address account, uint256 timepoint) public view virtual override returns (uint256) {\n require(timepoint < clock(), \"ERC20Votes: future lookup\");\n return _checkpointsLookup(_checkpoints[account], timepoint);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `timepoint`. Note, this value is the sum of all balances.\n * It is NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `timepoint` must be in the past\n */\n function getPastTotalSupply(uint256 timepoint) public view virtual override returns (uint256) {\n require(timepoint < clock(), \"ERC20Votes: future lookup\");\n return _checkpointsLookup(_totalSupplyCheckpoints, timepoint);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 timepoint) private view returns (uint256) {\n // We run a binary search to look for the last (most recent) checkpoint taken before (or at) `timepoint`.\n //\n // Initially we check if the block is recent to narrow the search range.\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `timepoint`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `timepoint`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `timepoint`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `timepoint`, but it works out\n // the same.\n uint256 length = ckpts.length;\n\n uint256 low = 0;\n uint256 high = length;\n\n if (length > 5) {\n uint256 mid = length - Math.sqrt(length);\n if (_unsafeAccess(ckpts, mid).fromBlock > timepoint) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (_unsafeAccess(ckpts, mid).fromBlock > timepoint) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n unchecked {\n return high == 0 ? 0 : _unsafeAccess(ckpts, high - 1).votes;\n }\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual override {\n _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {IVotes-DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {IVotes-DelegateChanged} and {IVotes-DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(address src, address dst, uint256 amount) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n\n unchecked {\n Checkpoint memory oldCkpt = pos == 0 ? Checkpoint(0, 0) : _unsafeAccess(ckpts, pos - 1);\n\n oldWeight = oldCkpt.votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && oldCkpt.fromBlock == clock()) {\n _unsafeAccess(ckpts, pos - 1).votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(clock()), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n\n /**\n * @dev Access an element of the array without performing bounds check. The position is assumed to be within bounds.\n */\n function _unsafeAccess(Checkpoint[] storage ckpts, uint256 pos) private pure returns (Checkpoint storage result) {\n assembly {\n mstore(0, ckpts.slot)\n result.slot := add(keccak256(0, 0x20), pos)\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/Counters.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/ShortStrings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/ShortStrings.sol)\n\npragma solidity ^0.8.8;\n\nimport \"./StorageSlot.sol\";\n\n// | string | 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |\n// | length | 0x BB |\ntype ShortString is bytes32;\n\n/**\n * @dev This library provides functions to convert short memory strings\n * into a `ShortString` type that can be used as an immutable variable.\n *\n * Strings of arbitrary length can be optimized using this library if\n * they are short enough (up to 31 bytes) by packing them with their\n * length (1 byte) in a single EVM word (32 bytes). Additionally, a\n * fallback mechanism can be used for every other case.\n *\n * Usage example:\n *\n * ```solidity\n * contract Named {\n * using ShortStrings for *;\n *\n * ShortString private immutable _name;\n * string private _nameFallback;\n *\n * constructor(string memory contractName) {\n * _name = contractName.toShortStringWithFallback(_nameFallback);\n * }\n *\n * function name() external view returns (string memory) {\n * return _name.toStringWithFallback(_nameFallback);\n * }\n * }\n * ```\n */\nlibrary ShortStrings {\n // Used as an identifier for strings longer than 31 bytes.\n bytes32 private constant _FALLBACK_SENTINEL = 0x00000000000000000000000000000000000000000000000000000000000000FF;\n\n error StringTooLong(string str);\n error InvalidShortString();\n\n /**\n * @dev Encode a string of at most 31 chars into a `ShortString`.\n *\n * This will trigger a `StringTooLong` error is the input string is too long.\n */\n function toShortString(string memory str) internal pure returns (ShortString) {\n bytes memory bstr = bytes(str);\n if (bstr.length > 31) {\n revert StringTooLong(str);\n }\n return ShortString.wrap(bytes32(uint256(bytes32(bstr)) | bstr.length));\n }\n\n /**\n * @dev Decode a `ShortString` back to a \"normal\" string.\n */\n function toString(ShortString sstr) internal pure returns (string memory) {\n uint256 len = byteLength(sstr);\n // using `new string(len)` would work locally but is not memory safe.\n string memory str = new string(32);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(str, len)\n mstore(add(str, 0x20), sstr)\n }\n return str;\n }\n\n /**\n * @dev Return the length of a `ShortString`.\n */\n function byteLength(ShortString sstr) internal pure returns (uint256) {\n uint256 result = uint256(ShortString.unwrap(sstr)) & 0xFF;\n if (result > 31) {\n revert InvalidShortString();\n }\n return result;\n }\n\n /**\n * @dev Encode a string into a `ShortString`, or write it to storage if it is too long.\n */\n function toShortStringWithFallback(string memory value, string storage store) internal returns (ShortString) {\n if (bytes(value).length < 32) {\n return toShortString(value);\n } else {\n StorageSlot.getStringSlot(store).value = value;\n return ShortString.wrap(_FALLBACK_SENTINEL);\n }\n }\n\n /**\n * @dev Decode a string that was encoded to `ShortString` or written to storage using {setWithFallback}.\n */\n function toStringWithFallback(ShortString value, string storage store) internal pure returns (string memory) {\n if (ShortString.unwrap(value) != _FALLBACK_SENTINEL) {\n return toString(value);\n } else {\n return store;\n }\n }\n\n /**\n * @dev Return the length of a string that was encoded to `ShortString` or written to storage using {setWithFallback}.\n *\n * WARNING: This will return the \"byte length\" of the string. This may not reflect the actual length in terms of\n * actual characters as the UTF-8 encoding of a single character can span over multiple bytes.\n */\n function byteLengthWithFallback(ShortString value, string storage store) internal view returns (uint256) {\n if (ShortString.unwrap(value) != _FALLBACK_SENTINEL) {\n return byteLength(value);\n } else {\n return bytes(store).length;\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/StorageSlot.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n *\n * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._\n * _Available since v4.9 for `string`, `bytes`._\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n struct StringSlot {\n string value;\n }\n\n struct BytesSlot {\n bytes value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` with member `value` located at `slot`.\n */\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n */\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := store.slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` with member `value` located at `slot`.\n */\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n */\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := store.slot\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/Strings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toString(int256 value) internal pure returns (string memory) {\n return string(abi.encodePacked(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value))));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return keccak256(bytes(a)) == keccak256(bytes(b));\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.sol\";\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV // Deprecated in v4.8\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n /// @solidity memory-safe-assembly\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, \"\\x19Ethereum Signed Message:\\n32\")\n mstore(0x1c, hash)\n message := keccak256(0x00, 0x3c)\n }\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from `s`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n\", Strings.toString(s.length), s));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) {\n /// @solidity memory-safe-assembly\n assembly {\n let ptr := mload(0x40)\n mstore(ptr, \"\\x19\\x01\")\n mstore(add(ptr, 0x02), domainSeparator)\n mstore(add(ptr, 0x22), structHash)\n data := keccak256(ptr, 0x42)\n }\n }\n\n /**\n * @dev Returns an Ethereum Signed Data with intended validator, created from a\n * `validator` and `data` according to the version 0 of EIP-191.\n *\n * See {recover}.\n */\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x00\", validator, data));\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.8;\n\nimport \"./ECDSA.sol\";\nimport \"../ShortStrings.sol\";\nimport \"../../interfaces/IERC5267.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain\n * separator of the implementation contract. This will cause the `_domainSeparatorV4` function to always rebuild the\n * separator from the immutable values, which is cheaper than accessing a cached version in cold storage.\n *\n * _Available since v3.4._\n *\n * @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\n */\nabstract contract EIP712 is IERC5267 {\n using ShortStrings for *;\n\n bytes32 private constant _TYPE_HASH =\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\");\n\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _cachedDomainSeparator;\n uint256 private immutable _cachedChainId;\n address private immutable _cachedThis;\n\n bytes32 private immutable _hashedName;\n bytes32 private immutable _hashedVersion;\n\n ShortString private immutable _name;\n ShortString private immutable _version;\n string private _nameFallback;\n string private _versionFallback;\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n _name = name.toShortStringWithFallback(_nameFallback);\n _version = version.toShortStringWithFallback(_versionFallback);\n _hashedName = keccak256(bytes(name));\n _hashedVersion = keccak256(bytes(version));\n\n _cachedChainId = block.chainid;\n _cachedDomainSeparator = _buildDomainSeparator();\n _cachedThis = address(this);\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _cachedThis && block.chainid == _cachedChainId) {\n return _cachedDomainSeparator;\n } else {\n return _buildDomainSeparator();\n }\n }\n\n function _buildDomainSeparator() private view returns (bytes32) {\n return keccak256(abi.encode(_TYPE_HASH, _hashedName, _hashedVersion, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n\n /**\n * @dev See {EIP-5267}.\n *\n * _Available since v4.9._\n */\n function eip712Domain()\n public\n view\n virtual\n override\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n )\n {\n return (\n hex\"0f\", // 01111\n _name.toStringWithFallback(_nameFallback),\n _version.toStringWithFallback(_versionFallback),\n block.chainid,\n address(this),\n bytes32(0),\n new uint256[](0)\n );\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1, \"Math: mulDiv overflow\");\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10 ** 64) {\n value /= 10 ** 64;\n result += 64;\n }\n if (value >= 10 ** 32) {\n value /= 10 ** 32;\n result += 32;\n }\n if (value >= 10 ** 16) {\n value /= 10 ** 16;\n result += 16;\n }\n if (value >= 10 ** 8) {\n value /= 10 ** 8;\n result += 8;\n }\n if (value >= 10 ** 4) {\n value /= 10 ** 4;\n result += 4;\n }\n if (value >= 10 ** 2) {\n value /= 10 ** 2;\n result += 2;\n }\n if (value >= 10 ** 1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SafeCast.sol)\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n require(value <= type(uint248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n require(value <= type(uint240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n require(value <= type(uint232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.2._\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n require(value <= type(uint216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n require(value <= type(uint208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n require(value <= type(uint200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n require(value <= type(uint192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n require(value <= type(uint184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n require(value <= type(uint176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n require(value <= type(uint168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n require(value <= type(uint160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n require(value <= type(uint152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n require(value <= type(uint144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n require(value <= type(uint136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v2.5._\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n require(value <= type(uint120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n require(value <= type(uint112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n require(value <= type(uint104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.2._\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n require(value <= type(uint88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n require(value <= type(uint80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n require(value <= type(uint72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v2.5._\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n require(value <= type(uint56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n require(value <= type(uint48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n require(value <= type(uint40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v2.5._\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n require(value <= type(uint24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v2.5._\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v2.5._\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n *\n * _Available since v3.0._\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toInt248(int256 value) internal pure returns (int248 downcasted) {\n downcasted = int248(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 248 bits\");\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toInt240(int256 value) internal pure returns (int240 downcasted) {\n downcasted = int240(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 240 bits\");\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toInt232(int256 value) internal pure returns (int232 downcasted) {\n downcasted = int232(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 232 bits\");\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.7._\n */\n function toInt224(int256 value) internal pure returns (int224 downcasted) {\n downcasted = int224(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 224 bits\");\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toInt216(int256 value) internal pure returns (int216 downcasted) {\n downcasted = int216(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 216 bits\");\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toInt208(int256 value) internal pure returns (int208 downcasted) {\n downcasted = int208(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 208 bits\");\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toInt200(int256 value) internal pure returns (int200 downcasted) {\n downcasted = int200(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 200 bits\");\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toInt192(int256 value) internal pure returns (int192 downcasted) {\n downcasted = int192(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 192 bits\");\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toInt184(int256 value) internal pure returns (int184 downcasted) {\n downcasted = int184(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 184 bits\");\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toInt176(int256 value) internal pure returns (int176 downcasted) {\n downcasted = int176(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 176 bits\");\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toInt168(int256 value) internal pure returns (int168 downcasted) {\n downcasted = int168(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 168 bits\");\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toInt160(int256 value) internal pure returns (int160 downcasted) {\n downcasted = int160(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 160 bits\");\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toInt152(int256 value) internal pure returns (int152 downcasted) {\n downcasted = int152(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 152 bits\");\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toInt144(int256 value) internal pure returns (int144 downcasted) {\n downcasted = int144(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 144 bits\");\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toInt136(int256 value) internal pure returns (int136 downcasted) {\n downcasted = int136(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 136 bits\");\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128 downcasted) {\n downcasted = int128(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 128 bits\");\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toInt120(int256 value) internal pure returns (int120 downcasted) {\n downcasted = int120(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 120 bits\");\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toInt112(int256 value) internal pure returns (int112 downcasted) {\n downcasted = int112(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 112 bits\");\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toInt104(int256 value) internal pure returns (int104 downcasted) {\n downcasted = int104(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 104 bits\");\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.7._\n */\n function toInt96(int256 value) internal pure returns (int96 downcasted) {\n downcasted = int96(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 96 bits\");\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toInt88(int256 value) internal pure returns (int88 downcasted) {\n downcasted = int88(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 88 bits\");\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toInt80(int256 value) internal pure returns (int80 downcasted) {\n downcasted = int80(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 80 bits\");\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toInt72(int256 value) internal pure returns (int72 downcasted) {\n downcasted = int72(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 72 bits\");\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64 downcasted) {\n downcasted = int64(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 64 bits\");\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toInt56(int256 value) internal pure returns (int56 downcasted) {\n downcasted = int56(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 56 bits\");\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toInt48(int256 value) internal pure returns (int48 downcasted) {\n downcasted = int48(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 48 bits\");\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toInt40(int256 value) internal pure returns (int40 downcasted) {\n downcasted = int40(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 40 bits\");\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32 downcasted) {\n downcasted = int32(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 32 bits\");\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toInt24(int256 value) internal pure returns (int24 downcasted) {\n downcasted = int24(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 24 bits\");\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16 downcasted) {\n downcasted = int16(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 16 bits\");\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8 downcasted) {\n downcasted = int8(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 8 bits\");\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n *\n * _Available since v3.0._\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n /**\n * @dev Returns the largest of two signed numbers.\n */\n function max(int256 a, int256 b) internal pure returns (int256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two signed numbers.\n */\n function min(int256 a, int256 b) internal pure returns (int256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two signed numbers without overflow.\n * The result is rounded towards zero.\n */\n function average(int256 a, int256 b) internal pure returns (int256) {\n // Formula from the book \"Hacker's Delight\"\n int256 x = (a & b) + ((a ^ b) >> 1);\n return x + (int256(uint256(x) >> 255) & (a ^ b));\n }\n\n /**\n * @dev Returns the absolute unsigned value of a signed value.\n */\n function abs(int256 n) internal pure returns (uint256) {\n unchecked {\n // must be unchecked in order to support `n = type(int256).min`\n return uint256(n >= 0 ? n : -n);\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./OwnableUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership} and {acceptOwnership}.\n *\n * This module is used through inheritance. It will make available all functions\n * from parent (Ownable).\n */\nabstract contract Ownable2StepUpgradeable is Initializable, OwnableUpgradeable {\n function __Ownable2Step_init() internal onlyInitializing {\n __Ownable_init_unchained();\n }\n\n function __Ownable2Step_init_unchained() internal onlyInitializing {\n }\n address private _pendingOwner;\n\n event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Returns the address of the pending owner.\n */\n function pendingOwner() public view virtual returns (address) {\n return _pendingOwner;\n }\n\n /**\n * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual override onlyOwner {\n _pendingOwner = newOwner;\n emit OwnershipTransferStarted(owner(), newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual override {\n delete _pendingOwner;\n super._transferOwnership(newOwner);\n }\n\n /**\n * @dev The new owner accepts the ownership transfer.\n */\n function acceptOwnership() public virtual {\n address sender = _msgSender();\n require(pendingOwner() == sender, \"Ownable2Step: caller is not the new owner\");\n _transferOwnership(sender);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n function __Ownable_init() internal onlyInitializing {\n __Ownable_init_unchained();\n }\n\n function __Ownable_init_unchained() internal onlyInitializing {\n _transferOwnership(_msgSender());\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n * @custom:oz-retyped-from bool\n */\n uint8 private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint8 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts.\n *\n * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\n * constructor.\n *\n * Emits an {Initialized} event.\n */\n modifier initializer() {\n bool isTopLevelCall = !_initializing;\n require(\n (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\n \"Initializable: contract is already initialized\"\n );\n _initialized = 1;\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n * are added through upgrades and that require initialization.\n *\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n * cannot be nested. If one is invoked in the context of another, execution will revert.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n *\n * WARNING: setting the version to 255 will prevent any future reinitialization.\n *\n * Emits an {Initialized} event.\n */\n modifier reinitializer(uint8 version) {\n require(!_initializing && _initialized < version, \"Initializable: contract is already initialized\");\n _initialized = version;\n _initializing = true;\n _;\n _initializing = false;\n emit Initialized(version);\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n require(_initializing, \"Initializable: contract is not initializing\");\n _;\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n *\n * Emits an {Initialized} event the first time it is successfully executed.\n */\n function _disableInitializers() internal virtual {\n require(!_initializing, \"Initializable: contract is initializing\");\n if (_initialized != type(uint8).max) {\n _initialized = type(uint8).max;\n emit Initialized(type(uint8).max);\n }\n }\n\n /**\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\n */\n function _getInitializedVersion() internal view returns (uint8) {\n return _initialized;\n }\n\n /**\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n */\n function _isInitializing() internal view returns (bool) {\n return _initializing;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n *\n * Furthermore, `isContract` will also return true if the target contract within\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n * which only has an effect at the end of a transaction.\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal onlyInitializing {\n }\n\n function __Context_init_unchained() internal onlyInitializing {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[50] private __gap;\n}\n" + } + }, + "settings": { + "remappings": [ + "@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/", + "@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/", + "@rari-capital/solmate/=node_modules/@rari-capital/solmate/", + "forge-std/=node_modules/forge-std/src/", + "ds-test/=node_modules/ds-test/src/", + "hardhat-deploy/=node_modules/hardhat-deploy/", + "hardhat/=node_modules/hardhat/" + ], + "optimizer": { + "enabled": true, + "runs": 10000 + }, + "metadata": { + "useLiteralContent": false, + "bytecodeHash": "none" + }, + "outputSelection": { + "*": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + } + }, + "evmVersion": "london", + "viaIR": false, + "libraries": {} + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/kroma/solcInputs/37a0cebac478897ae0c20446c8a2494a.json b/packages/contracts/deployments/kroma/solcInputs/37a0cebac478897ae0c20446c8a2494a.json new file mode 100644 index 0000000000..2469337c2c --- /dev/null +++ b/packages/contracts/deployments/kroma/solcInputs/37a0cebac478897ae0c20446c8a2494a.json @@ -0,0 +1,141 @@ +{ + "language": "Solidity", + "sources": { + "contracts/governance/GovernanceToken.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.15;\n\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\";\nimport \"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\";\n\nimport { KromaMintableERC20 } from \"../universal/KromaMintableERC20.sol\";\n\n/**\n * @custom:proxied\n * @title GovernanceToken\n * @notice The KRO token used in governance, supporting voting and delegation. Implements\n * EIP 2612 allowing signed approvals. `mint` function is only allowed to the owner or\n * `Bridge`, and the total supply amount is minted at once (TGE). `Bridge` has the\n * permission to `mint` and `burn`, for the purpose of bridging KRO to the remote chain.\n */\ncontract GovernanceToken is KromaMintableERC20, ERC20Votes, Ownable2StepUpgradeable {\n /**\n * @notice Constructs the GovernanceToken contract.\n *\n * @param _bridge Address of the StandardBridge contract on this network.\n * @param _remoteToken Address of the corresponding token on the remote chain.\n */\n constructor(\n address _bridge,\n address _remoteToken\n ) KromaMintableERC20(_bridge, _remoteToken, \"\", \"\") ERC20Permit(\"Kroma\") {\n _disableInitializers();\n }\n\n /**\n * @notice Initializer.\n *\n * @param _owner The owner of this contract.\n */\n function initialize(address _owner) public initializer {\n __Ownable2Step_init();\n transferOwnership(_owner);\n }\n\n /**\n * @notice Allows StandardBridge or the owner to mint tokens.\n *\n * @param _to Address to mint tokens to.\n * @param _amount Amount of tokens to mint.\n */\n function mint(address _to, uint256 _amount) external override {\n require(\n msg.sender == BRIDGE || msg.sender == owner(),\n \"GovernanceToken: only bridge or owner can mint\"\n );\n\n _mint(_to, _amount);\n }\n\n /**\n * @inheritdoc KromaMintableERC20\n */\n function burn(address _from, uint256 _amount) external override onlyBridge {\n _burn(_from, _amount);\n }\n\n /**\n * @inheritdoc ERC20\n */\n function name() public pure override returns (string memory) {\n return \"Kroma\";\n }\n\n /**\n * @inheritdoc ERC20\n */\n function symbol() public pure override returns (string memory) {\n return \"KRO\";\n }\n\n /**\n * @notice Callback called after a token transfer.\n *\n * @param from The account sending tokens.\n * @param to The account receiving tokens.\n * @param amount The amount of tokens being transferred.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20, ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n\n /**\n * @notice Internal mint function.\n *\n * @param account The account receiving minted tokens.\n * @param amount The amount of tokens to mint.\n */\n function _mint(address account, uint256 amount) internal override(ERC20, ERC20Votes) {\n super._mint(account, amount);\n emit Mint(account, amount);\n }\n\n /**\n * @notice Internal burn function.\n *\n * @param account The account that tokens will be burned from.\n * @param amount The amount of tokens that will be burned.\n */\n function _burn(address account, uint256 amount) internal override(ERC20, ERC20Votes) {\n super._burn(account, amount);\n emit Burn(account, amount);\n }\n\n /**\n * @notice Override function.\n */\n function _msgSender() internal view override(Context, ContextUpgradeable) returns (address) {\n return super._msgSender();\n }\n\n /**\n * @notice Override function.\n */\n function _msgData()\n internal\n view\n override(Context, ContextUpgradeable)\n returns (bytes calldata)\n {\n return super._msgData();\n }\n}\n" + }, + "contracts/governance/MintManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.15;\n\nimport { Ownable2Step } from \"@openzeppelin/contracts/access/Ownable2Step.sol\";\n\nimport { GovernanceToken } from \"./GovernanceToken.sol\";\n\n/**\n * @title MintManager\n * @notice MintManager issues mint cap amount of GovernanceToken at once (TGE) and distributes the\n * tokens to specified recipients.\n */\ncontract MintManager is Ownable2Step {\n /**\n * @notice The amount of tokens that can be minted.\n */\n uint256 public constant MINT_CAP = 1_000_000_000;\n\n /**\n * @notice The denominator of each recipient's share.\n */\n uint256 public constant SHARE_DENOMINATOR = 10 ** 5;\n\n /**\n * @notice The GovernanceToken that the MintManager can mint.\n */\n GovernanceToken public immutable GOVERNANCE_TOKEN;\n\n /**\n * @notice True when already minted on this chain. MintManager can mint only once on each chain.\n */\n bool public minted;\n\n /**\n * @notice A list of recipient addresses that will receive tokens to be distributed.\n */\n address[] public recipients;\n\n /**\n * @notice A mapping of the recipient's address to share.\n */\n mapping(address => uint256) public shareOf;\n\n /**\n * @notice Constructs the MintManager contract.\n *\n * @param _governanceToken The GovernanceToken this contract can mint tokens of.\n * @param _owner The owner of this contract.\n * @param _recipients List of the recipients.\n * @param _shares List of token distribution ratios for each recipient.\n */\n constructor(\n address _governanceToken,\n address _owner,\n address[] memory _recipients,\n uint256[] memory _shares\n ) {\n GOVERNANCE_TOKEN = GovernanceToken(_governanceToken);\n\n transferOwnership(_owner);\n\n require(_recipients.length == _shares.length, \"MintManager: invalid length of array\");\n\n uint256 totalShares = 0;\n for (uint256 i = 0; i < _recipients.length; i++) {\n address recipient = _recipients[i];\n require(recipient != address(0), \"MintManager: recipient address cannot be 0\");\n\n uint256 share = _shares[i];\n require(share != 0, \"MintManager: share cannot be 0\");\n\n if (shareOf[recipient] == 0) {\n recipients.push(recipient);\n }\n shareOf[recipient] += share;\n totalShares += share;\n }\n\n require(\n totalShares <= SHARE_DENOMINATOR,\n \"MintManager: max total share is equal or less than SHARE_DENOMINATOR\"\n );\n }\n\n /**\n * @notice Only the owner is allowed to mint mint cap amount of the GovernanceToken at once.\n */\n function mint() external onlyOwner {\n require(!minted, \"MintManager: already minted on this chain\");\n\n uint256 mintCap = MINT_CAP * 10 ** GOVERNANCE_TOKEN.decimals();\n\n uint256 totalAmount;\n for (uint256 i = 0; i < recipients.length; i++) {\n address recipient = recipients[i];\n uint256 share = shareOf[recipient];\n uint256 amount = (mintCap * share) / SHARE_DENOMINATOR;\n totalAmount += amount;\n }\n\n GOVERNANCE_TOKEN.mint(address(this), totalAmount);\n\n minted = true;\n }\n\n /**\n * @notice Only the owner is allowed to distribute the GovernanceToken to specified recipients.\n */\n function distribute() external onlyOwner {\n uint256 mintCap = MINT_CAP * 10 ** GOVERNANCE_TOKEN.decimals();\n\n for (uint256 i = 0; i < recipients.length; i++) {\n address recipient = recipients[i];\n uint256 share = shareOf[recipient];\n uint256 amount = (mintCap * share) / SHARE_DENOMINATOR;\n GOVERNANCE_TOKEN.transfer(recipient, amount);\n }\n }\n\n /**\n * @notice Only the owner is allowed to renounce the ownership of the GovernanceToken.\n */\n function renounceOwnershipOfToken() external onlyOwner {\n require(minted, \"MintManager: not minted before renounce ownership\");\n\n GOVERNANCE_TOKEN.renounceOwnership();\n }\n\n /**\n * @notice Only the owner is allowed to transfer the ownership of the GovernanceToken.\n *\n * @param newMintManager The new MintManager to own the GovernanceToken.\n */\n function transferOwnershipOfToken(address newMintManager) external onlyOwner {\n GOVERNANCE_TOKEN.transferOwnership(newMintManager);\n }\n\n /**\n * @notice Only the owner is allowed to accept the ownership of the GovernanceToken.\n */\n function acceptOwnershipOfToken() external onlyOwner {\n GOVERNANCE_TOKEN.acceptOwnership();\n }\n}\n" + }, + "contracts/universal/IKromaMintableERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport { IERC165 } from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\n/**\n * @title IKromaMintableERC20\n * @notice This interface is available on the KromaMintableERC20 contract. We declare it as a\n * separate interface so that it can be used in custom implementations of\n * KromaMintableERC20.\n */\ninterface IKromaMintableERC20 {\n function REMOTE_TOKEN() external view returns (address);\n\n function BRIDGE() external view returns (address);\n\n function mint(address _to, uint256 _amount) external;\n\n function burn(address _from, uint256 _amount) external;\n}\n" + }, + "contracts/universal/ISemver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title ISemver\n/// @notice ISemver is a simple contract for ensuring that contracts are\n/// versioned using semantic versioning.\ninterface ISemver {\n /// @notice Getter for the semantic version of the contract. This is not\n /// meant to be used onchain but instead meant to be used by offchain\n /// tooling.\n /// @return Semver contract version as a string.\n function version() external view returns (string memory);\n}\n" + }, + "contracts/universal/KromaMintableERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.15;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { IERC165 } from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\nimport { ISemver } from \"../universal/ISemver.sol\";\nimport { IKromaMintableERC20 } from \"./IKromaMintableERC20.sol\";\n\n/**\n * @title KromaMintableERC20\n * @notice KromaMintableERC20 is a standard extension of the base ERC20 token contract designed\n * to allow the StandardBridge contracts to mint and burn tokens. This makes it possible to\n * use a KromaMintableRC20 as the L2 representation of an L1 token, or vice-versa.\n * Designed to be backwards compatible with the older StandardL2ERC20 token which was only\n * meant for use on L2.\n */\ncontract KromaMintableERC20 is IKromaMintableERC20, ERC20, ISemver {\n /**\n * @notice Address of the corresponding version of this token on the remote chain.\n */\n address public immutable REMOTE_TOKEN;\n\n /**\n * @notice Address of the StandardBridge on this network.\n */\n address public immutable BRIDGE;\n\n /**\n * @notice Emitted whenever tokens are minted for an account.\n *\n * @param account Address of the account tokens are being minted for.\n * @param amount Amount of tokens minted.\n */\n event Mint(address indexed account, uint256 amount);\n\n /**\n * @notice Emitted whenever tokens are burned from an account.\n *\n * @param account Address of the account tokens are being burned from.\n * @param amount Amount of tokens burned.\n */\n event Burn(address indexed account, uint256 amount);\n\n /**\n * @notice A modifier that only allows the bridge to call\n */\n modifier onlyBridge() {\n require(msg.sender == BRIDGE, \"KromaMintableERC20: only bridge can mint and burn\");\n _;\n }\n\n /**\n * @notice Semantic version.\n * @custom:semver 1.0.0\n */\n string public constant version = \"1.0.0\";\n\n /**\n * @notice Constructs the KromaMintableERC20 contract.\n *\n * @param _bridge Address of the L2 standard bridge.\n * @param _remoteToken Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _bridge,\n address _remoteToken,\n string memory _name,\n string memory _symbol\n ) ERC20(_name, _symbol) {\n REMOTE_TOKEN = _remoteToken;\n BRIDGE = _bridge;\n }\n\n /**\n * @notice Allows the StandardBridge on this network to mint tokens.\n *\n * @param _to Address to mint tokens to.\n * @param _amount Amount of tokens to mint.\n */\n function mint(address _to, uint256 _amount)\n external\n virtual\n override(IKromaMintableERC20)\n onlyBridge\n {\n _mint(_to, _amount);\n emit Mint(_to, _amount);\n }\n\n /**\n * @notice Allows the StandardBridge on this network to burn tokens.\n *\n * @param _from Address to burn tokens from.\n * @param _amount Amount of tokens to burn.\n */\n function burn(address _from, uint256 _amount)\n external\n virtual\n override(IKromaMintableERC20)\n onlyBridge\n {\n _burn(_from, _amount);\n emit Burn(_from, _amount);\n }\n\n /**\n * @notice ERC165 interface check function.\n *\n * @param _interfaceId Interface ID to check.\n *\n * @return Whether or not the interface is supported by this contract.\n */\n function supportsInterface(bytes4 _interfaceId) external pure returns (bool) {\n bytes4 iface1 = type(IERC165).interfaceId;\n // Interface corresponding to the updated KromaMintableERC20 (this contract).\n bytes4 iface2 = type(IKromaMintableERC20).interfaceId;\n return _interfaceId == iface1 || _interfaceId == iface2;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/access/Ownable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _transferOwnership(_msgSender());\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/access/Ownable2Step.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./Ownable.sol\";\n\n/**\n * @dev Contract module which provides access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership} and {acceptOwnership}.\n *\n * This module is used through inheritance. It will make available all functions\n * from parent (Ownable).\n */\nabstract contract Ownable2Step is Ownable {\n address private _pendingOwner;\n\n event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Returns the address of the pending owner.\n */\n function pendingOwner() public view virtual returns (address) {\n return _pendingOwner;\n }\n\n /**\n * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual override onlyOwner {\n _pendingOwner = newOwner;\n emit OwnershipTransferStarted(owner(), newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual override {\n delete _pendingOwner;\n super._transferOwnership(newOwner);\n }\n\n /**\n * @dev The new owner accepts the ownership transfer.\n */\n function acceptOwnership() public virtual {\n address sender = _msgSender();\n require(pendingOwner() == sender, \"Ownable2Step: caller is not the new owner\");\n _transferOwnership(sender);\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (governance/utils/IVotes.sol)\npragma solidity ^0.8.0;\n\n/**\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\n *\n * _Available since v4.5._\n */\ninterface IVotes {\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Returns the current amount of votes that `account` has.\n */\n function getVotes(address account) external view returns (uint256);\n\n /**\n * @dev Returns the amount of votes that `account` had at a specific moment in the past. If the `clock()` is\n * configured to use block numbers, this will return the value at the end of the corresponding block.\n */\n function getPastVotes(address account, uint256 timepoint) external view returns (uint256);\n\n /**\n * @dev Returns the total supply of votes available at a specific moment in the past. If the `clock()` is\n * configured to use block numbers, this will return the value at the end of the corresponding block.\n *\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\n * vote.\n */\n function getPastTotalSupply(uint256 timepoint) external view returns (uint256);\n\n /**\n * @dev Returns the delegate that `account` has chosen.\n */\n function delegates(address account) external view returns (address);\n\n /**\n * @dev Delegates votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) external;\n\n /**\n * @dev Delegates votes from signer to `delegatee`.\n */\n function delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) external;\n}\n" + }, + "node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5267.sol)\n\npragma solidity ^0.8.0;\n\ninterface IERC5267 {\n /**\n * @dev MAY be emitted to signal that the domain could have changed.\n */\n event EIP712DomainChanged();\n\n /**\n * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712\n * signature.\n */\n function eip712Domain()\n external\n view\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n );\n}\n" + }, + "node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5805.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../governance/utils/IVotes.sol\";\nimport \"./IERC6372.sol\";\n\ninterface IERC5805 is IERC6372, IVotes {}\n" + }, + "node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC6372.sol)\n\npragma solidity ^0.8.0;\n\ninterface IERC6372 {\n /**\n * @dev Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting).\n */\n function clock() external view returns (uint48);\n\n /**\n * @dev Description of the clock\n */\n // solhint-disable-next-line func-name-mixedcase\n function CLOCK_MODE() external view returns (string memory);\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the default value returned by this function, unless\n * it's overridden.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(address from, address to, uint256 amount) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\n // decrementing then incrementing.\n _balances[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n unchecked {\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\n _balances[account] += amount;\n }\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n // Overflow not possible: amount <= accountBalance <= totalSupply.\n _totalSupply -= amount;\n }\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(address owner, address spender, uint256 amount) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20Permit.sol\";\nimport \"../ERC20.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\nimport \"../../../utils/cryptography/EIP712.sol\";\nimport \"../../../utils/Counters.sol\";\n\n/**\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * _Available since v3.4._\n */\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\n using Counters for Counters.Counter;\n\n mapping(address => Counters.Counter) private _nonces;\n\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private constant _PERMIT_TYPEHASH =\n keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n /**\n * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.\n * However, to ensure consistency with the upgradeable transpiler, we will continue\n * to reserve a slot.\n * @custom:oz-renamed-from _PERMIT_TYPEHASH\n */\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;\n\n /**\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n *\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\n */\n constructor(string memory name) EIP712(name, \"1\") {}\n\n /**\n * @dev See {IERC20Permit-permit}.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= deadline, \"ERC20Permit: expired deadline\");\n\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\n\n bytes32 hash = _hashTypedDataV4(structHash);\n\n address signer = ECDSA.recover(hash, v, r, s);\n require(signer == owner, \"ERC20Permit: invalid signature\");\n\n _approve(owner, spender, value);\n }\n\n /**\n * @dev See {IERC20Permit-nonces}.\n */\n function nonces(address owner) public view virtual override returns (uint256) {\n return _nonces[owner].current();\n }\n\n /**\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\n return _domainSeparatorV4();\n }\n\n /**\n * @dev \"Consume a nonce\": return the current value and increment.\n *\n * _Available since v4.1._\n */\n function _useNonce(address owner) internal virtual returns (uint256 current) {\n Counters.Counter storage nonce = _nonces[owner];\n current = nonce.current();\n nonce.increment();\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Votes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20Permit.sol\";\nimport \"../../../interfaces/IERC5805.sol\";\nimport \"../../../utils/math/Math.sol\";\nimport \"../../../utils/math/SafeCast.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is ERC20Permit, IERC5805 {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n /**\n * @dev Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting).\n */\n function clock() public view virtual override returns (uint48) {\n return SafeCast.toUint48(block.number);\n }\n\n /**\n * @dev Description of the clock\n */\n // solhint-disable-next-line func-name-mixedcase\n function CLOCK_MODE() public view virtual override returns (string memory) {\n // Check that the clock was not modified\n require(clock() == block.number, \"ERC20Votes: broken clock mode\");\n return \"mode=blocknumber&from=default\";\n }\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual override returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view virtual override returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n unchecked {\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `timepoint`.\n *\n * Requirements:\n *\n * - `timepoint` must be in the past\n */\n function getPastVotes(address account, uint256 timepoint) public view virtual override returns (uint256) {\n require(timepoint < clock(), \"ERC20Votes: future lookup\");\n return _checkpointsLookup(_checkpoints[account], timepoint);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `timepoint`. Note, this value is the sum of all balances.\n * It is NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `timepoint` must be in the past\n */\n function getPastTotalSupply(uint256 timepoint) public view virtual override returns (uint256) {\n require(timepoint < clock(), \"ERC20Votes: future lookup\");\n return _checkpointsLookup(_totalSupplyCheckpoints, timepoint);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 timepoint) private view returns (uint256) {\n // We run a binary search to look for the last (most recent) checkpoint taken before (or at) `timepoint`.\n //\n // Initially we check if the block is recent to narrow the search range.\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `timepoint`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `timepoint`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `timepoint`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `timepoint`, but it works out\n // the same.\n uint256 length = ckpts.length;\n\n uint256 low = 0;\n uint256 high = length;\n\n if (length > 5) {\n uint256 mid = length - Math.sqrt(length);\n if (_unsafeAccess(ckpts, mid).fromBlock > timepoint) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (_unsafeAccess(ckpts, mid).fromBlock > timepoint) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n unchecked {\n return high == 0 ? 0 : _unsafeAccess(ckpts, high - 1).votes;\n }\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual override {\n _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {IVotes-DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {IVotes-DelegateChanged} and {IVotes-DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(address src, address dst, uint256 amount) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n\n unchecked {\n Checkpoint memory oldCkpt = pos == 0 ? Checkpoint(0, 0) : _unsafeAccess(ckpts, pos - 1);\n\n oldWeight = oldCkpt.votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && oldCkpt.fromBlock == clock()) {\n _unsafeAccess(ckpts, pos - 1).votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(clock()), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n\n /**\n * @dev Access an element of the array without performing bounds check. The position is assumed to be within bounds.\n */\n function _unsafeAccess(Checkpoint[] storage ckpts, uint256 pos) private pure returns (Checkpoint storage result) {\n assembly {\n mstore(0, ckpts.slot)\n result.slot := add(keccak256(0, 0x20), pos)\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/Counters.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/ShortStrings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/ShortStrings.sol)\n\npragma solidity ^0.8.8;\n\nimport \"./StorageSlot.sol\";\n\n// | string | 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |\n// | length | 0x BB |\ntype ShortString is bytes32;\n\n/**\n * @dev This library provides functions to convert short memory strings\n * into a `ShortString` type that can be used as an immutable variable.\n *\n * Strings of arbitrary length can be optimized using this library if\n * they are short enough (up to 31 bytes) by packing them with their\n * length (1 byte) in a single EVM word (32 bytes). Additionally, a\n * fallback mechanism can be used for every other case.\n *\n * Usage example:\n *\n * ```solidity\n * contract Named {\n * using ShortStrings for *;\n *\n * ShortString private immutable _name;\n * string private _nameFallback;\n *\n * constructor(string memory contractName) {\n * _name = contractName.toShortStringWithFallback(_nameFallback);\n * }\n *\n * function name() external view returns (string memory) {\n * return _name.toStringWithFallback(_nameFallback);\n * }\n * }\n * ```\n */\nlibrary ShortStrings {\n // Used as an identifier for strings longer than 31 bytes.\n bytes32 private constant _FALLBACK_SENTINEL = 0x00000000000000000000000000000000000000000000000000000000000000FF;\n\n error StringTooLong(string str);\n error InvalidShortString();\n\n /**\n * @dev Encode a string of at most 31 chars into a `ShortString`.\n *\n * This will trigger a `StringTooLong` error is the input string is too long.\n */\n function toShortString(string memory str) internal pure returns (ShortString) {\n bytes memory bstr = bytes(str);\n if (bstr.length > 31) {\n revert StringTooLong(str);\n }\n return ShortString.wrap(bytes32(uint256(bytes32(bstr)) | bstr.length));\n }\n\n /**\n * @dev Decode a `ShortString` back to a \"normal\" string.\n */\n function toString(ShortString sstr) internal pure returns (string memory) {\n uint256 len = byteLength(sstr);\n // using `new string(len)` would work locally but is not memory safe.\n string memory str = new string(32);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(str, len)\n mstore(add(str, 0x20), sstr)\n }\n return str;\n }\n\n /**\n * @dev Return the length of a `ShortString`.\n */\n function byteLength(ShortString sstr) internal pure returns (uint256) {\n uint256 result = uint256(ShortString.unwrap(sstr)) & 0xFF;\n if (result > 31) {\n revert InvalidShortString();\n }\n return result;\n }\n\n /**\n * @dev Encode a string into a `ShortString`, or write it to storage if it is too long.\n */\n function toShortStringWithFallback(string memory value, string storage store) internal returns (ShortString) {\n if (bytes(value).length < 32) {\n return toShortString(value);\n } else {\n StorageSlot.getStringSlot(store).value = value;\n return ShortString.wrap(_FALLBACK_SENTINEL);\n }\n }\n\n /**\n * @dev Decode a string that was encoded to `ShortString` or written to storage using {setWithFallback}.\n */\n function toStringWithFallback(ShortString value, string storage store) internal pure returns (string memory) {\n if (ShortString.unwrap(value) != _FALLBACK_SENTINEL) {\n return toString(value);\n } else {\n return store;\n }\n }\n\n /**\n * @dev Return the length of a string that was encoded to `ShortString` or written to storage using {setWithFallback}.\n *\n * WARNING: This will return the \"byte length\" of the string. This may not reflect the actual length in terms of\n * actual characters as the UTF-8 encoding of a single character can span over multiple bytes.\n */\n function byteLengthWithFallback(ShortString value, string storage store) internal view returns (uint256) {\n if (ShortString.unwrap(value) != _FALLBACK_SENTINEL) {\n return byteLength(value);\n } else {\n return bytes(store).length;\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/StorageSlot.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n *\n * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._\n * _Available since v4.9 for `string`, `bytes`._\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n struct StringSlot {\n string value;\n }\n\n struct BytesSlot {\n bytes value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` with member `value` located at `slot`.\n */\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n */\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := store.slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` with member `value` located at `slot`.\n */\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n */\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := store.slot\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/Strings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toString(int256 value) internal pure returns (string memory) {\n return string(abi.encodePacked(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value))));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return keccak256(bytes(a)) == keccak256(bytes(b));\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.sol\";\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV // Deprecated in v4.8\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n /// @solidity memory-safe-assembly\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, \"\\x19Ethereum Signed Message:\\n32\")\n mstore(0x1c, hash)\n message := keccak256(0x00, 0x3c)\n }\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from `s`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n\", Strings.toString(s.length), s));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) {\n /// @solidity memory-safe-assembly\n assembly {\n let ptr := mload(0x40)\n mstore(ptr, \"\\x19\\x01\")\n mstore(add(ptr, 0x02), domainSeparator)\n mstore(add(ptr, 0x22), structHash)\n data := keccak256(ptr, 0x42)\n }\n }\n\n /**\n * @dev Returns an Ethereum Signed Data with intended validator, created from a\n * `validator` and `data` according to the version 0 of EIP-191.\n *\n * See {recover}.\n */\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x00\", validator, data));\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.8;\n\nimport \"./ECDSA.sol\";\nimport \"../ShortStrings.sol\";\nimport \"../../interfaces/IERC5267.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain\n * separator of the implementation contract. This will cause the `_domainSeparatorV4` function to always rebuild the\n * separator from the immutable values, which is cheaper than accessing a cached version in cold storage.\n *\n * _Available since v3.4._\n *\n * @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\n */\nabstract contract EIP712 is IERC5267 {\n using ShortStrings for *;\n\n bytes32 private constant _TYPE_HASH =\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\");\n\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _cachedDomainSeparator;\n uint256 private immutable _cachedChainId;\n address private immutable _cachedThis;\n\n bytes32 private immutable _hashedName;\n bytes32 private immutable _hashedVersion;\n\n ShortString private immutable _name;\n ShortString private immutable _version;\n string private _nameFallback;\n string private _versionFallback;\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n _name = name.toShortStringWithFallback(_nameFallback);\n _version = version.toShortStringWithFallback(_versionFallback);\n _hashedName = keccak256(bytes(name));\n _hashedVersion = keccak256(bytes(version));\n\n _cachedChainId = block.chainid;\n _cachedDomainSeparator = _buildDomainSeparator();\n _cachedThis = address(this);\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _cachedThis && block.chainid == _cachedChainId) {\n return _cachedDomainSeparator;\n } else {\n return _buildDomainSeparator();\n }\n }\n\n function _buildDomainSeparator() private view returns (bytes32) {\n return keccak256(abi.encode(_TYPE_HASH, _hashedName, _hashedVersion, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n\n /**\n * @dev See {EIP-5267}.\n *\n * _Available since v4.9._\n */\n function eip712Domain()\n public\n view\n virtual\n override\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n )\n {\n return (\n hex\"0f\", // 01111\n _name.toStringWithFallback(_nameFallback),\n _version.toStringWithFallback(_versionFallback),\n block.chainid,\n address(this),\n bytes32(0),\n new uint256[](0)\n );\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1, \"Math: mulDiv overflow\");\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10 ** 64) {\n value /= 10 ** 64;\n result += 64;\n }\n if (value >= 10 ** 32) {\n value /= 10 ** 32;\n result += 32;\n }\n if (value >= 10 ** 16) {\n value /= 10 ** 16;\n result += 16;\n }\n if (value >= 10 ** 8) {\n value /= 10 ** 8;\n result += 8;\n }\n if (value >= 10 ** 4) {\n value /= 10 ** 4;\n result += 4;\n }\n if (value >= 10 ** 2) {\n value /= 10 ** 2;\n result += 2;\n }\n if (value >= 10 ** 1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SafeCast.sol)\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n require(value <= type(uint248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n require(value <= type(uint240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n require(value <= type(uint232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.2._\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n require(value <= type(uint216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n require(value <= type(uint208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n require(value <= type(uint200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n require(value <= type(uint192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n require(value <= type(uint184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n require(value <= type(uint176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n require(value <= type(uint168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n require(value <= type(uint160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n require(value <= type(uint152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n require(value <= type(uint144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n require(value <= type(uint136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v2.5._\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n require(value <= type(uint120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n require(value <= type(uint112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n require(value <= type(uint104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.2._\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n require(value <= type(uint88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n require(value <= type(uint80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n require(value <= type(uint72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v2.5._\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n require(value <= type(uint56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n require(value <= type(uint48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n require(value <= type(uint40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v2.5._\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n require(value <= type(uint24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v2.5._\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v2.5._\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n *\n * _Available since v3.0._\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toInt248(int256 value) internal pure returns (int248 downcasted) {\n downcasted = int248(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 248 bits\");\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toInt240(int256 value) internal pure returns (int240 downcasted) {\n downcasted = int240(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 240 bits\");\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toInt232(int256 value) internal pure returns (int232 downcasted) {\n downcasted = int232(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 232 bits\");\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.7._\n */\n function toInt224(int256 value) internal pure returns (int224 downcasted) {\n downcasted = int224(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 224 bits\");\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toInt216(int256 value) internal pure returns (int216 downcasted) {\n downcasted = int216(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 216 bits\");\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toInt208(int256 value) internal pure returns (int208 downcasted) {\n downcasted = int208(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 208 bits\");\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toInt200(int256 value) internal pure returns (int200 downcasted) {\n downcasted = int200(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 200 bits\");\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toInt192(int256 value) internal pure returns (int192 downcasted) {\n downcasted = int192(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 192 bits\");\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toInt184(int256 value) internal pure returns (int184 downcasted) {\n downcasted = int184(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 184 bits\");\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toInt176(int256 value) internal pure returns (int176 downcasted) {\n downcasted = int176(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 176 bits\");\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toInt168(int256 value) internal pure returns (int168 downcasted) {\n downcasted = int168(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 168 bits\");\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toInt160(int256 value) internal pure returns (int160 downcasted) {\n downcasted = int160(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 160 bits\");\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toInt152(int256 value) internal pure returns (int152 downcasted) {\n downcasted = int152(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 152 bits\");\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toInt144(int256 value) internal pure returns (int144 downcasted) {\n downcasted = int144(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 144 bits\");\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toInt136(int256 value) internal pure returns (int136 downcasted) {\n downcasted = int136(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 136 bits\");\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128 downcasted) {\n downcasted = int128(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 128 bits\");\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toInt120(int256 value) internal pure returns (int120 downcasted) {\n downcasted = int120(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 120 bits\");\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toInt112(int256 value) internal pure returns (int112 downcasted) {\n downcasted = int112(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 112 bits\");\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toInt104(int256 value) internal pure returns (int104 downcasted) {\n downcasted = int104(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 104 bits\");\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.7._\n */\n function toInt96(int256 value) internal pure returns (int96 downcasted) {\n downcasted = int96(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 96 bits\");\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toInt88(int256 value) internal pure returns (int88 downcasted) {\n downcasted = int88(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 88 bits\");\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toInt80(int256 value) internal pure returns (int80 downcasted) {\n downcasted = int80(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 80 bits\");\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toInt72(int256 value) internal pure returns (int72 downcasted) {\n downcasted = int72(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 72 bits\");\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64 downcasted) {\n downcasted = int64(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 64 bits\");\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toInt56(int256 value) internal pure returns (int56 downcasted) {\n downcasted = int56(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 56 bits\");\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toInt48(int256 value) internal pure returns (int48 downcasted) {\n downcasted = int48(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 48 bits\");\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toInt40(int256 value) internal pure returns (int40 downcasted) {\n downcasted = int40(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 40 bits\");\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32 downcasted) {\n downcasted = int32(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 32 bits\");\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toInt24(int256 value) internal pure returns (int24 downcasted) {\n downcasted = int24(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 24 bits\");\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16 downcasted) {\n downcasted = int16(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 16 bits\");\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8 downcasted) {\n downcasted = int8(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 8 bits\");\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n *\n * _Available since v3.0._\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n /**\n * @dev Returns the largest of two signed numbers.\n */\n function max(int256 a, int256 b) internal pure returns (int256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two signed numbers.\n */\n function min(int256 a, int256 b) internal pure returns (int256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two signed numbers without overflow.\n * The result is rounded towards zero.\n */\n function average(int256 a, int256 b) internal pure returns (int256) {\n // Formula from the book \"Hacker's Delight\"\n int256 x = (a & b) + ((a ^ b) >> 1);\n return x + (int256(uint256(x) >> 255) & (a ^ b));\n }\n\n /**\n * @dev Returns the absolute unsigned value of a signed value.\n */\n function abs(int256 n) internal pure returns (uint256) {\n unchecked {\n // must be unchecked in order to support `n = type(int256).min`\n return uint256(n >= 0 ? n : -n);\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./OwnableUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership} and {acceptOwnership}.\n *\n * This module is used through inheritance. It will make available all functions\n * from parent (Ownable).\n */\nabstract contract Ownable2StepUpgradeable is Initializable, OwnableUpgradeable {\n function __Ownable2Step_init() internal onlyInitializing {\n __Ownable_init_unchained();\n }\n\n function __Ownable2Step_init_unchained() internal onlyInitializing {\n }\n address private _pendingOwner;\n\n event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Returns the address of the pending owner.\n */\n function pendingOwner() public view virtual returns (address) {\n return _pendingOwner;\n }\n\n /**\n * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual override onlyOwner {\n _pendingOwner = newOwner;\n emit OwnershipTransferStarted(owner(), newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual override {\n delete _pendingOwner;\n super._transferOwnership(newOwner);\n }\n\n /**\n * @dev The new owner accepts the ownership transfer.\n */\n function acceptOwnership() public virtual {\n address sender = _msgSender();\n require(pendingOwner() == sender, \"Ownable2Step: caller is not the new owner\");\n _transferOwnership(sender);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n function __Ownable_init() internal onlyInitializing {\n __Ownable_init_unchained();\n }\n\n function __Ownable_init_unchained() internal onlyInitializing {\n _transferOwnership(_msgSender());\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n * @custom:oz-retyped-from bool\n */\n uint8 private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint8 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts.\n *\n * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\n * constructor.\n *\n * Emits an {Initialized} event.\n */\n modifier initializer() {\n bool isTopLevelCall = !_initializing;\n require(\n (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\n \"Initializable: contract is already initialized\"\n );\n _initialized = 1;\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n * are added through upgrades and that require initialization.\n *\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n * cannot be nested. If one is invoked in the context of another, execution will revert.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n *\n * WARNING: setting the version to 255 will prevent any future reinitialization.\n *\n * Emits an {Initialized} event.\n */\n modifier reinitializer(uint8 version) {\n require(!_initializing && _initialized < version, \"Initializable: contract is already initialized\");\n _initialized = version;\n _initializing = true;\n _;\n _initializing = false;\n emit Initialized(version);\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n require(_initializing, \"Initializable: contract is not initializing\");\n _;\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n *\n * Emits an {Initialized} event the first time it is successfully executed.\n */\n function _disableInitializers() internal virtual {\n require(!_initializing, \"Initializable: contract is initializing\");\n if (_initialized != type(uint8).max) {\n _initialized = type(uint8).max;\n emit Initialized(type(uint8).max);\n }\n }\n\n /**\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\n */\n function _getInitializedVersion() internal view returns (uint8) {\n return _initialized;\n }\n\n /**\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n */\n function _isInitializing() internal view returns (bool) {\n return _initializing;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n *\n * Furthermore, `isContract` will also return true if the target contract within\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n * which only has an effect at the end of a transaction.\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal onlyInitializing {\n }\n\n function __Context_init_unchained() internal onlyInitializing {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[50] private __gap;\n}\n" + } + }, + "settings": { + "remappings": [ + "@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/", + "@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/", + "@rari-capital/solmate/=node_modules/@rari-capital/solmate/", + "forge-std/=node_modules/forge-std/src/", + "ds-test/=node_modules/ds-test/src/", + "hardhat-deploy/=node_modules/hardhat-deploy/", + "hardhat/=node_modules/hardhat/" + ], + "optimizer": { + "enabled": true, + "runs": 10000 + }, + "metadata": { + "useLiteralContent": false, + "bytecodeHash": "none" + }, + "outputSelection": { + "*": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + } + }, + "evmVersion": "london", + "viaIR": false, + "libraries": {} + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/kromaSepolia/GovernanceToken.json b/packages/contracts/deployments/kromaSepolia/GovernanceToken.json new file mode 100644 index 0000000000..498f743a30 --- /dev/null +++ b/packages/contracts/deployments/kromaSepolia/GovernanceToken.json @@ -0,0 +1,1272 @@ +{ + "address": "0x7EDD3465F7419E7C8d89df2Bf949b3782eDD9fa8", + "abi": [ + { + "type": "constructor", + "inputs": [ + { + "name": "_bridge", + "type": "address", + "internalType": "address" + }, + { + "name": "_remoteToken", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "BRIDGE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "CLOCK_MODE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "DOMAIN_SEPARATOR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "REMOTE_TOKEN", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "acceptOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "allowance", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "spender", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "spender", + "type": "address", + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "burn", + "inputs": [ + { + "name": "_from", + "type": "address", + "internalType": "address" + }, + { + "name": "_amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "checkpoints", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + }, + { + "name": "pos", + "type": "uint32", + "internalType": "uint32" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct ERC20Votes.Checkpoint", + "components": [ + { + "name": "fromBlock", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "votes", + "type": "uint224", + "internalType": "uint224" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "clock", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint48", + "internalType": "uint48" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "decimals", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "decreaseAllowance", + "inputs": [ + { + "name": "spender", + "type": "address", + "internalType": "address" + }, + { + "name": "subtractedValue", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "delegate", + "inputs": [ + { + "name": "delegatee", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "delegateBySig", + "inputs": [ + { + "name": "delegatee", + "type": "address", + "internalType": "address" + }, + { + "name": "nonce", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "expiry", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "v", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "r", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "s", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "delegates", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "eip712Domain", + "inputs": [], + "outputs": [ + { + "name": "fields", + "type": "bytes1", + "internalType": "bytes1" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "version", + "type": "string", + "internalType": "string" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "verifyingContract", + "type": "address", + "internalType": "address" + }, + { + "name": "salt", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "extensions", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPastTotalSupply", + "inputs": [ + { + "name": "timepoint", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPastVotes", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + }, + { + "name": "timepoint", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getVotes", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "increaseAllowance", + "inputs": [ + { + "name": "spender", + "type": "address", + "internalType": "address" + }, + { + "name": "addedValue", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "initialize", + "inputs": [ + { + "name": "_owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "mint", + "inputs": [ + { + "name": "_to", + "type": "address", + "internalType": "address" + }, + { + "name": "_amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "nonces", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "numCheckpoints", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint32", + "internalType": "uint32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "pendingOwner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "permit", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "spender", + "type": "address", + "internalType": "address" + }, + { + "name": "value", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "deadline", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "v", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "r", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "s", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "renounceOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "supportsInterface", + "inputs": [ + { + "name": "_interfaceId", + "type": "bytes4", + "internalType": "bytes4" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "totalSupply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transfer", + "inputs": [ + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "transferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "version", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "spender", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "value", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Burn", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "DelegateChanged", + "inputs": [ + { + "name": "delegator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "fromDelegate", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "toDelegate", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "DelegateVotesChanged", + "inputs": [ + { + "name": "delegate", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "previousBalance", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "newBalance", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "EIP712DomainChanged", + "inputs": [], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint8", + "indexed": false, + "internalType": "uint8" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Mint", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferStarted", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "value", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "InvalidShortString", + "inputs": [] + }, + { + "type": "error", + "name": "StringTooLong", + "inputs": [ + { + "name": "str", + "type": "string", + "internalType": "string" + } + ] + } + ], + "transactionHash": "0x3bd9b41d3da28a53b01be992051330f69fafc569d671aa85a66d304ea717bfa0", + "receipt": { + "to": null, + "from": "0xcc56801a72463d39903A4a4632E600289178F6bC", + "contractAddress": "0x7EDD3465F7419E7C8d89df2Bf949b3782eDD9fa8", + "transactionIndex": 1, + "gasUsed": "2788747", + "logsBloom": "0x00000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000020000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xfaf8e180e61ef43bc33a271232edac6bad91da6ae5cc16b1dc9630b43c3bf749", + "transactionHash": "0x3bd9b41d3da28a53b01be992051330f69fafc569d671aa85a66d304ea717bfa0", + "logs": [ + { + "transactionIndex": 1, + "blockNumber": 15686868, + "transactionHash": "0x3bd9b41d3da28a53b01be992051330f69fafc569d671aa85a66d304ea717bfa0", + "address": "0x7EDD3465F7419E7C8d89df2Bf949b3782eDD9fa8", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", + "logIndex": 0, + "blockHash": "0xfaf8e180e61ef43bc33a271232edac6bad91da6ae5cc16b1dc9630b43c3bf749" + } + ], + "blockNumber": 15686868, + "cumulativeGasUsed": "2834931", + "status": 1, + "byzantium": true + }, + "args": [ + "0x4200000000000000000000000000000000000009", + "0x25500000d700bbE27104577CCcce8eAbCC96c8ad" + ], + "numDeployments": 1, + "solcInputHash": "1cc21f973aa4cfc73d832518987f54f8", + "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_bridge\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_remoteToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidShortString\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"str\",\"type\":\"string\"}],\"name\":\"StringTooLong\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Burn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fromDelegate\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toDelegate\",\"type\":\"address\"}],\"name\":\"DelegateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegate\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"DelegateVotesChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EIP712DomainChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Mint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BRIDGE\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"CLOCK_MODE\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REMOTE_TOKEN\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"pos\",\"type\":\"uint32\"}],\"name\":\"checkpoints\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fromBlock\",\"type\":\"uint32\"},{\"internalType\":\"uint224\",\"name\":\"votes\",\"type\":\"uint224\"}],\"internalType\":\"struct ERC20Votes.Checkpoint\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clock\",\"outputs\":[{\"internalType\":\"uint48\",\"name\":\"\",\"type\":\"uint48\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"delegateBySig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"delegates\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eip712Domain\",\"outputs\":[{\"internalType\":\"bytes1\",\"name\":\"fields\",\"type\":\"bytes1\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"verifyingContract\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"extensions\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"timepoint\",\"type\":\"uint256\"}],\"name\":\"getPastTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"timepoint\",\"type\":\"uint256\"}],\"name\":\"getPastVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"numCheckpoints\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"_interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"custom:proxied\":\"@title GovernanceToken\",\"kind\":\"dev\",\"methods\":{\"CLOCK_MODE()\":{\"details\":\"Description of the clock\"},\"DOMAIN_SEPARATOR()\":{\"details\":\"See {IERC20Permit-DOMAIN_SEPARATOR}.\"},\"acceptOwnership()\":{\"details\":\"The new owner accepts the ownership transfer.\"},\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"burn(address,uint256)\":{\"params\":{\"_amount\":\"Amount of tokens to burn.\",\"_from\":\"Address to burn tokens from.\"}},\"checkpoints(address,uint32)\":{\"details\":\"Get the `pos`-th checkpoint for `account`.\"},\"clock()\":{\"details\":\"Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting).\"},\"constructor\":{\"params\":{\"_bridge\":\"Address of the StandardBridge contract on this network.\",\"_remoteToken\":\"Address of the corresponding token on the remote chain.\"}},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"delegate(address)\":{\"details\":\"Delegate votes from the sender to `delegatee`.\"},\"delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Delegates votes from signer to `delegatee`\"},\"delegates(address)\":{\"details\":\"Get the address `account` is currently delegating to.\"},\"eip712Domain()\":{\"details\":\"See {EIP-5267}. _Available since v4.9._\"},\"getPastTotalSupply(uint256)\":{\"details\":\"Retrieve the `totalSupply` at the end of `timepoint`. Note, this value is the sum of all balances. It is NOT the sum of all the delegated votes! Requirements: - `timepoint` must be in the past\"},\"getPastVotes(address,uint256)\":{\"details\":\"Retrieve the number of votes for `account` at the end of `timepoint`. Requirements: - `timepoint` must be in the past\"},\"getVotes(address)\":{\"details\":\"Gets the current votes balance for `account`\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"initialize(address)\":{\"params\":{\"_owner\":\"The owner of this contract.\"}},\"mint(address,uint256)\":{\"params\":{\"_amount\":\"Amount of tokens to mint.\",\"_to\":\"Address to mint tokens to.\"}},\"name()\":{\"details\":\"Returns the name of the token.\"},\"nonces(address)\":{\"details\":\"See {IERC20Permit-nonces}.\"},\"numCheckpoints(address)\":{\"details\":\"Get number of checkpoints for `account`.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"pendingOwner()\":{\"details\":\"Returns the address of the pending owner.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"See {IERC20Permit-permit}.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"supportsInterface(bytes4)\":{\"params\":{\"_interfaceId\":\"Interface ID to check.\"},\"returns\":{\"_0\":\"Whether or not the interface is supported by this contract.\"}},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"},\"transferOwnership(address)\":{\"details\":\"Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"events\":{\"Burn(address,uint256)\":{\"notice\":\"Emitted whenever tokens are burned from an account.\"},\"Mint(address,uint256)\":{\"notice\":\"Emitted whenever tokens are minted for an account.\"}},\"kind\":\"user\",\"methods\":{\"BRIDGE()\":{\"notice\":\"Address of the StandardBridge on this network.\"},\"REMOTE_TOKEN()\":{\"notice\":\"Address of the corresponding version of this token on the remote chain.\"},\"burn(address,uint256)\":{\"notice\":\"Allows the StandardBridge on this network to burn tokens.\"},\"constructor\":{\"notice\":\"Constructs the GovernanceToken contract.\"},\"initialize(address)\":{\"notice\":\"Initializer.\"},\"mint(address,uint256)\":{\"notice\":\"Allows StandardBridge or the owner to mint tokens.\"},\"supportsInterface(bytes4)\":{\"notice\":\"ERC165 interface check function.\"},\"version()\":{\"notice\":\"Semantic version.\"}},\"notice\":\"The KRO token used in governance, supporting voting and delegation. Implements EIP 2612 allowing signed approvals. `mint` function is only allowed to the owner or `Bridge`, and the total supply amount is minted at once (TGE). `Bridge` has the permission to `mint` and `burn`, for the purpose of bridging KRO to the remote chain.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/governance/GovernanceToken.sol\":\"GovernanceToken\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/\",\":@rari-capital/solmate/=node_modules/@rari-capital/solmate/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\",\":hardhat-deploy/=node_modules/hardhat-deploy/\",\":hardhat/=node_modules/hardhat/\"]},\"sources\":{\"contracts/governance/GovernanceToken.sol\":{\"keccak256\":\"0x98304239f5ca6cc0c68dedf47b31ec5ceaeb11fed78d007dc16afb72d6a152a5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6cffce351c0d797a1c46e2eb3355324c86693cd9d48cd291cc30f0badb1843b4\",\"dweb:/ipfs/QmajzzFw1GT51LH1VBKh378xxwSLXxs6erBvUVxzFVkeLj\"]},\"contracts/universal/IKromaMintableERC20.sol\":{\"keccak256\":\"0x1a95268117456ddb1e0a16eb2ba773b9540c7b8b9520e66d4d167ddc6ace6fcb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f93d2e6f5121a3dfe272e399d6774e0584d59a20c4f63db78e5a0b644d92fa59\",\"dweb:/ipfs/QmbwM7kCpmwZs348jCeNwF86H8SDBURsGCGCUCyoSS1ffy\"]},\"contracts/universal/ISemver.sol\":{\"keccak256\":\"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a\",\"dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR\"]},\"contracts/universal/KromaMintableERC20.sol\":{\"keccak256\":\"0x30dccac5fe2d7c75bbe1411004ad03c40afe6dce8c7d22a89abb783f74bd2674\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://de3f8062e170498d71069529cb83681b0acaeb41643892c092111b07df2895f6\",\"dweb:/ipfs/QmNsZa5vHYQ8eG3dQ7PjkfweXzxKc6nbDj9P455Mp1Waxx\"]},\"node_modules/@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\":{\"keccak256\":\"0x84efb8889801b0ac817324aff6acc691d07bbee816b671817132911d287a8c63\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ec6df2255fadc251ea905043c47bf55170ee6cb5d7ca8b5c8ed54c84eac9d09e\",\"dweb:/ipfs/QmaokWfuL59uarki5yoDGbPzh4cErzEfnAzfmesTNJNXE9\"]},\"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://99c8cb3cd19a44bbfb6612605affb7d8b06cee1f6aa9362a37a8672b4f7eeaf8\",\"dweb:/ipfs/QmasyxFDBUp7k5KFgfDWEzM8PYSKEq7GVznzMJ1VxVRF4B\"]},\"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f103ee2e4aecd37aac6ceefe670709cdd7613dee25fa2d4d9feaf7fc0aaa155e\",\"dweb:/ipfs/QmRiNZLoJk5k3HPMYGPGjZFd2ke1ZxjhJZkM45Ec9GH9hv\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://310136ad60820af4177a11a61d77a3686faf5fca4942b600e08fc940db38396b\",\"dweb:/ipfs/QmbCzMNSTL7Zi7M4UCSqBrkHtp4jjxUnGbkneCZKdR1qeq\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"keccak256\":\"0x1618ddebe73377660f6da71afcba35d5ac4c4600918b3a381d9c6f37eba613eb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://666c8d7c62478b55e082f1835275b7acfc1595491998df6d67183ff2c70eab96\",\"dweb:/ipfs/QmVXmnXfxNaLhoX283dqyKJ8DJbF5thUd9sMuRoFpNMwr7\"]},\"node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol\":{\"keccak256\":\"0xac6c2efc64baccbde4904ae18ed45139c9aa8cff96d6888344d1e4d2eb8b659f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6e416a280c610b6b7a5f158e4a41aacfaec01ef14d5d1de13b46be9e090265fc\",\"dweb:/ipfs/QmYZP2KrdyccBbhLZT42auhvBTMkwiwUS3V6HWb42rbwbG\"]},\"node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol\":{\"keccak256\":\"0xfc12b717f6a2cd0d67adc8700097d4464d37f18ce933d4fc9c948ab6aec35e80\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://82386e69ebe902a2edfd4f8a5ecbeaeb2e00f6cc6481a973729e974373fb492e\",\"dweb:/ipfs/QmSXg4wBMBd83mQvkekT1GsiRX2Qyv5gvrqzv5qJx2M7Kc\"]},\"node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol\":{\"keccak256\":\"0xcaea9aeda3816ba872358c828f4f01455c22ae48ced49c4c7d72bd74176c09b9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://16ff22d8df5aee94510ee43d361b6147caef164941a684cedcb75be44f351fe6\",\"dweb:/ipfs/QmaCCwMdHVdPApuEJHLZapSJyA7mp5dAugpma3VUzWGd8E\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0xa56ca923f70c1748830700250b19c61b70db9a683516dc5e216694a50445d99c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cac938788bc4be12101e59d45588b4e059579f4e61062e1cda8d6b06c0191b15\",\"dweb:/ipfs/QmV2JKCyjTVH3rkWNrfdJRhAT7tZ3usAN2XcnD4h53Mvih\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bd39944e8fc06be6dbe2dd1d8449b5336e23c6a7ba3e8e9ae5ae0f37f35283f5\",\"dweb:/ipfs/QmPV3FGYjVwvKSgAXKUN3r9T9GwniZz83CxBpM7vyj2G53\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol\":{\"keccak256\":\"0x36c00327e3f9afd929cc2721aaa111ab57eff78a630cc364b279ad576b899295\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f5bf927f4c8b71a5809be184c3107b915b0445ab2c4a33208331e5376692eb5a\",\"dweb:/ipfs/QmVXirsCY1sf4kodhbL6w3NWZkeZeaMuQB7M6DBAdZNqFE\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\":{\"keccak256\":\"0x4e560f86662b6f72ab76122fff53317677154f14bac4a80dbd46a54172b3abfa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ca5c2518d247417cb01164f04eff57b7e87b5346bc03478ada916f26117aa7fd\",\"dweb:/ipfs/QmVgK66XGZCiH9x4mhqejKUTujtu68DyE6KrYi6MPuaHRJ\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd\",\"dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\":{\"keccak256\":\"0xec63854014a5b4f2b3290ab9103a21bdf902a508d0f41a8573fea49e98bf571a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bc5b5dc12fbc4002f282eaa7a5f06d8310ed62c1c77c5770f6283e058454c39a\",\"dweb:/ipfs/Qme9rE2wS3yBuyJq9GgbmzbsBQsW2M2sVFqYYLw7bosGrv\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"node_modules/@openzeppelin/contracts/utils/Counters.sol\":{\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://59e1c62884d55b70f3ae5432b44bb3166ad71ae3acd19c57ab6ddc3c87c325ee\",\"dweb:/ipfs/QmezuXg5GK5oeA4F91EZhozBFekhq5TD966bHPH18cCqhu\"]},\"node_modules/@openzeppelin/contracts/utils/ShortStrings.sol\":{\"keccak256\":\"0xc0e310c163edf15db45d4ff938113ab357f94fa86e61ea8e790853c4d2e13256\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://04db5bc05dcb05ba1f6ca2dfbead17adc8a2e2f911aa80b05e7a36d9eaf96516\",\"dweb:/ipfs/QmVkfHZbXVBUPsTopueCn3qGJX8aEjahFF3Fn4NcygLNm5\"]},\"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xf09e68aa0dc6722a25bc46490e8d48ed864466d17313b8a0b254c36b54e49899\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e26daf81e2252dc1fe1ce0e4b55c2eb7c6d1ee84ae6558d1a9554432ea1d32da\",\"dweb:/ipfs/Qmb1UANWiWq5pCKbmHSu772hd4nt374dVaghGmwSVNuk8Q\"]},\"node_modules/@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b81d9ff6559ea5c47fc573e17ece6d9ba5d6839e213e6ebc3b4c5c8fe4199d7f\",\"dweb:/ipfs/QmPCW1bFisUzJkyjroY3yipwfism9RRCigCcK1hbXtVM8n\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0x809bc3edb4bcbef8263fa616c1b60ee0004b50a8a1bfa164d8f57fd31f520c58\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8b93a1e39a4a19eba1600b92c96f435442db88cac91e315c8291547a2a7bcfe2\",\"dweb:/ipfs/QmTm34KVe6uZBZwq8dZDNWwPcm24qBJdxqL3rPxBJ4LrMv\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol\":{\"keccak256\":\"0x8432884527a7ad91e6eed1cfc5a0811ae2073e5bca107bd0ca442e9236b03dbd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e3aa0eadab7aafcf91a95684765f778f64386f0368de88522ce873c21385278a\",\"dweb:/ipfs/QmPfaVAqWgH1QsT3dHVuL6jwMZbVKdoP8w1PvpiPT2FPWd\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f\",\"dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy\"]},\"node_modules/@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cc8841b3cd48ad125e2f46323c8bad3aa0e88e399ec62acb9e57efa7e7c8058c\",\"dweb:/ipfs/QmSqE4mXHA2BXW58deDbXE8MTcsL5JSKNDbm23sVQxRLPS\"]},\"node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x52a8cfb0f5239d11b457dcdd1b326992ef672714ca8da71a157255bddd13f3ad\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://495145362c7ff1c9ca88c58bbbbcb412e3c2004406647412394486552ff6c278\",\"dweb:/ipfs/QmNNCeng6d5eRPDn6tkWSQhjE39XWfQEfjA63rRwHmr1iH\"]},\"node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c50fcc459e49a9858b6d8ad5f911295cb7c9ab57567845a250bf0153f84a95c7\",\"dweb:/ipfs/QmcEW85JRzvDkQggxiBBLVAasXWdkhEysqypj9EaB6H2g6\"]}},\"version\":1}", + "bytecode": "0x6101a06040523480156200001257600080fd5b506040516200369838038062003698833981016040819052620000359162000321565b604051806040016040528060058152602001644b726f6d6160d81b81525080604051806040016040528060018152602001603160f81b8152508484604051806020016040528060008152506040518060200160405280600081525081818160039081620000a39190620003fe565b506004620000b28282620003fe565b505050506001600160a01b03918216608052501660a052620000e2826005620001ac602090811b620012fb17901c565b61016052620000ff816006620001ac602090811b620012fb17901c565b61018052815160208084019190912061012052815190820120610140524660e0526200018f6101205161014051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60c0525050306101005250620001a4620001fc565b505062000547565b6000602083511015620001cc57620001c483620002be565b9050620001f6565b82620001e3836200030160201b6200132c1760201c565b90620001f09082620003fe565b5060ff90505b92915050565b600c54610100900460ff16156200026a5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084015b60405180910390fd5b600c5460ff90811614620002bc57600c805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b600080829050601f81511115620002ec578260405163305a27a960e01b8152600401620002619190620004ca565b8051620002f98262000522565b179392505050565b90565b80516001600160a01b03811681146200031c57600080fd5b919050565b600080604083850312156200033557600080fd5b620003408362000304565b9150620003506020840162000304565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200038457607f821691505b602082108103620003a557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003f957600081815260208120601f850160051c81016020861015620003d45750805b601f850160051c820191505b81811015620003f557828155600101620003e0565b5050505b505050565b81516001600160401b038111156200041a576200041a62000359565b62000432816200042b84546200036f565b84620003ab565b602080601f8311600181146200046a5760008415620004515750858301515b600019600386901b1c1916600185901b178555620003f5565b600085815260208120601f198616915b828110156200049b578886015182559484019460019091019084016200047a565b5085821015620004ba5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208083528351808285015260005b81811015620004f957858101830151858201604001528201620004db565b818111156200050c576000604083870101525b50601f01601f1916929092016040019392505050565b80516020808301519190811015620003a55760001960209190910360031b1b16919050565b60805160a05160c05160e05161010051610120516101405161016051610180516130d2620005c66000396000610ad001526000610aa5015260006117e6015260006117be01526000611719015260006117430152600061176d0152600081816106110152818161085d0152610c69015260006102a901526130d26000f3fe608060405234801561001057600080fd5b50600436106102775760003560e01c806379ba509711610160578063a457c2d7116100d8578063dd62ed3e1161008c578063ee9a31a211610071578063ee9a31a21461060c578063f1127ed814610633578063f2fde38b1461068557600080fd5b8063dd62ed3e146105c2578063e30c3978146105fb57600080fd5b8063c3cda520116100bd578063c3cda52014610589578063c4d66de81461059c578063d505accf146105af57600080fd5b8063a457c2d714610563578063a9059cbb1461057657600080fd5b80638e539e8c1161012f57806395d89b411161011457806395d89b41146105045780639ab24eb01461053d5780639dc29fac1461055057600080fd5b80638e539e8c146104d257806391ddadf4146104e557600080fd5b806379ba50971461048b5780637ecebe001461049357806384b0196e146104a65780638da5cb5b146104c157600080fd5b80633a46b1a8116101f3578063587cde1e116101c25780636fcfff45116101a75780636fcfff451461043257806370a082311461045a578063715018a61461048357600080fd5b8063587cde1e146103f35780635c19a95c1461041f57600080fd5b80633a46b1a81461038757806340c10f191461039a5780634bf5d7e9146103af57806354fd4d50146103b757600080fd5b806318160ddd1161024a578063313ce5671161022f578063313ce5671461035d5780633644e5151461036c578063395093511461037457600080fd5b806318160ddd1461033857806323b872dd1461034a57600080fd5b806301ffc9a71461027c578063033964be146102a457806306fdde03146102e3578063095ea7b314610325575b600080fd5b61028f61028a366004612a65565b610698565b60405190151581526020015b60405180910390f35b6102cb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161029b565b60408051808201909152600581527f4b726f6d6100000000000000000000000000000000000000000000000000000060208201525b60405161029b9190612b12565b61028f610333366004612b41565b610738565b6002545b60405190815260200161029b565b61028f610358366004612b6b565b610752565b6040516012815260200161029b565b61033c610776565b61028f610382366004612b41565b610785565b61033c610395366004612b41565b6107c4565b6103ad6103a8366004612b41565b610852565b005b610318610913565b6103186040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6102cb610401366004612ba7565b6001600160a01b039081166000908152600960205260409020541690565b6103ad61042d366004612ba7565b6109ab565b610445610440366004612ba7565b6109b8565b60405163ffffffff909116815260200161029b565b61033c610468366004612ba7565b6001600160a01b031660009081526020819052604090205490565b6103ad6109da565b6103ad6109ee565b61033c6104a1366004612ba7565b610a79565b6104ae610a97565b60405161029b9796959493929190612bc2565b603f546001600160a01b03166102cb565b61033c6104e0366004612c74565b610b3c565b6104ed610ba7565b60405165ffffffffffff909116815260200161029b565b60408051808201909152600381527f4b524f00000000000000000000000000000000000000000000000000000000006020820152610318565b61033c61054b366004612ba7565b610bb2565b6103ad61055e366004612b41565b610c5e565b61028f610571366004612b41565b610d06565b61028f610584366004612b41565b610db0565b6103ad610597366004612c9e565b610dbe565b6103ad6105aa366004612ba7565b610ef4565b6103ad6105bd366004612cf6565b611075565b61033c6105d0366004612d60565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6071546001600160a01b03166102cb565b6102cb7f000000000000000000000000000000000000000000000000000000000000000081565b610646610641366004612d93565b6111d9565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16928101929092520161029b565b6103ad610693366004612ba7565b611272565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f30a0c5a9000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000841682148061073057507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b60003361074681858561132f565b60019150505b92915050565b600033610760858285611487565b61076b858585611519565b506001949350505050565b600061078061170c565b905090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919061074690829086906107bf908790612e02565b61132f565b60006107ce610ba7565b65ffffffffffff1682106108295760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20667574757265206c6f6f6b75700000000000000060448201526064015b60405180910390fd5b6001600160a01b0383166000908152600a6020526040902061084b9083611837565b9392505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108935750603f546001600160a01b031633145b6109055760405162461bcd60e51b815260206004820152602e60248201527f476f7665726e616e6365546f6b656e3a206f6e6c7920627269646765206f722060448201527f6f776e65722063616e206d696e740000000000000000000000000000000000006064820152608401610820565b61090f828261194a565b5050565b60604361091e610ba7565b65ffffffffffff16146109735760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a2062726f6b656e20636c6f636b206d6f64650000006044820152606401610820565b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b6109b5338261199b565b50565b6001600160a01b0381166000908152600a602052604081205461074c90611a2c565b6109e2611aac565b6109ec6000611b06565b565b60715433906001600160a01b03168114610a705760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610820565b6109b581611b06565b6001600160a01b03811660009081526007602052604081205461074c565b600060608082808083610acb7f00000000000000000000000000000000000000000000000000000000000000006005611b37565b610af67f00000000000000000000000000000000000000000000000000000000000000006006611b37565b604080516000808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6000610b46610ba7565b65ffffffffffff168210610b9c5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20667574757265206c6f6f6b7570000000000000006044820152606401610820565b61074c600b83611837565b600061078043611bdb565b6001600160a01b0381166000908152600a60205260408120548015610c36576001600160a01b0383166000908152600a6020526040902080546000198301908110610bff57610bff612e49565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610c39565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cfc5760405162461bcd60e51b815260206004820152603160248201527f4b726f6d614d696e7461626c6545524332303a206f6e6c79206272696467652060448201527f63616e206d696e7420616e64206275726e0000000000000000000000000000006064820152608401610820565b61090f8282611c59565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919083811015610da35760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610820565b61076b828686840361132f565b600033610746818585611519565b83421115610e0e5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610820565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610e8890610e809060a00160405160208183030381529060405280519060200120611c9e565b858585611ce6565b9050610e9381611d0e565b8614610ee15760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610820565b610eeb818861199b565b50505050505050565b600c54610100900460ff1615808015610f145750600c54600160ff909116105b80610f2e5750303b158015610f2e5750600c5460ff166001145b610fa05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610820565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610ffe57600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b611006611d36565b61100f82611272565b801561090f57600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b834211156110c55760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610820565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886110f48c611d0e565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061114f82611c9e565b9050600061115f82878787611ce6565b9050896001600160a01b0316816001600160a01b0316146111c25760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610820565b6111cd8a8a8a61132f565b50505050505050505050565b60408051808201909152600080825260208201526001600160a01b0383166000908152600a60205260409020805463ffffffff841690811061121d5761121d612e49565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b61127a611aac565b607180546001600160a01b0383167fffffffffffffffffffffffff000000000000000000000000000000000000000090911681179091556112c3603f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60006020835110156113175761131083611dbb565b905061074c565b816113228482612f13565b5060ff905061074c565b90565b6001600160a01b0383166113aa5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166114265760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461151357818110156115065760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610820565b611513848484840361132f565b50505050565b6001600160a01b0383166115955760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166116115760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b038316600090815260208190526040902054818110156116a05760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611513848484611e17565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561176557507f000000000000000000000000000000000000000000000000000000000000000046145b1561178f57507f000000000000000000000000000000000000000000000000000000000000000090565b610780604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b81546000908181600581111561189157600061185284611e22565b61185c9085612ff1565b600088815260209020909150869082015463ffffffff1611156118815780915061188f565b61188c816001612e02565b92505b505b808210156118de5760006118a58383611f0a565b600088815260209020909150869082015463ffffffff1611156118ca578091506118d8565b6118d5816001612e02565b92505b50611891565b801561191f576000868152602090208101600019015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611922565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169695505050505050565b6119548282611f25565b816001600160a01b03167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161198f91815260200190565b60405180910390a25050565b6001600160a01b038281166000818152600960208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611513828483611fd1565b600063ffffffff821115611aa85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610820565b5090565b603f546001600160a01b031633146109ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610820565b607180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556109b58161210e565b606060ff8314611b4a5761131083612178565b818054611b5690612e78565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8290612e78565b8015611bcf5780601f10611ba457610100808354040283529160200191611bcf565b820191906000526020600020905b815481529060010190602001808311611bb257829003601f168201915b5050505050905061074c565b600065ffffffffffff821115611aa85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201527f38206269747300000000000000000000000000000000000000000000000000006064820152608401610820565b611c6382826121b7565b816001600160a01b03167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161198f91815260200190565b600061074c611cab61170c565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6000806000611cf7878787876121cf565b91509150611d04816122b1565b5095945050505050565b6001600160a01b03811660009081526007602052604090208054600181018255905b50919050565b600c54610100900460ff16611db35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610820565b6109ec612416565b600080829050601f81511115611dff57826040517f305a27a90000000000000000000000000000000000000000000000000000000081526004016108209190612b12565b8051611e0a82613008565b179392505050565b505050565b611e1283838361249c565b600081600003611e3457506000919050565b60006001611e41846124ce565b901c6001901b90506001818481611e5a57611e5a61302c565b048201901c90506001818481611e7257611e7261302c565b048201901c90506001818481611e8a57611e8a61302c565b048201901c90506001818481611ea257611ea261302c565b048201901c90506001818481611eba57611eba61302c565b048201901c90506001818481611ed257611ed261302c565b048201901c90506001818481611eea57611eea61302c565b048201901c905061084b81828581611f0457611f0461302c565b04612562565b6000611f19600284841861305b565b61084b90848416612e02565b611f2f8282612578565b6002547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1015611fc35760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610820565b611513600b61263f8361264b565b816001600160a01b0316836001600160a01b031614158015611ff35750600081115b15611e12576001600160a01b03831615612081576001600160a01b0383166000908152600a60205260408120819061202e906128148561264b565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612076929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611e12576001600160a01b0382166000908152600a6020526040812081906120b79061263f8561264b565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516120ff929190918252602082015260400190565b60405180910390a25050505050565b603f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060600061218583612820565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b6121c18282612861565b611513600b6128148361264b565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561220657506000905060036122a8565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561225a573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b0381166122a1576000600192509250506122a8565b9150600090505b94509492505050565b60008160048111156122c5576122c5613096565b036122cd5750565b60018160048111156122e1576122e1613096565b0361232e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610820565b600281600481111561234257612342613096565b0361238f5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610820565b60038160048111156123a3576123a3613096565b036109b55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610820565b600c54610100900460ff166124935760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610820565b6109ec33611b06565b6001600160a01b03838116600090815260096020526040808220548584168352912054611e1292918216911683611fd1565b600080608083901c156124e357608092831c92015b604083901c156124f557604092831c92015b602083901c1561250757602092831c92015b601083901c1561251957601092831c92015b600883901c1561252b57600892831c92015b600483901c1561253d57600492831c92015b600283901c1561254f57600292831c92015b600183901c1561074c5760010192915050565b6000818310612571578161084b565b5090919050565b6001600160a01b0382166125ce5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610820565b80600260008282546125e09190612e02565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361090f60008383611e17565b600061084b8284612e02565b825460009081908181156126ad5760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660208201526126c2565b60408051808201909152600080825260208201525b905080602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1693506126f784868863ffffffff16565b9250600082118015612721575061270c610ba7565b65ffffffffffff16816000015163ffffffff16145b1561277b5761272f836129d1565b60008881526020902083016000190180547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092166401000000000263ffffffff90921691909117905561280a565b86604051806040016040528061279f612792610ba7565b65ffffffffffff16611a2c565b63ffffffff1681526020016127b3866129d1565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b600061084b8284612ff1565b600060ff8216601f81111561074c576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166128dd5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166000908152602081905260409020548181101561296c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611e1283600084611e17565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821115611aa85760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610820565b600060208284031215612a7757600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461084b57600080fd5b6000815180845260005b81811015612acd57602081850181015186830182015201612ab1565b81811115612adf576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061084b6020830184612aa7565b80356001600160a01b0381168114612b3c57600080fd5b919050565b60008060408385031215612b5457600080fd5b612b5d83612b25565b946020939093013593505050565b600080600060608486031215612b8057600080fd5b612b8984612b25565b9250612b9760208501612b25565b9150604084013590509250925092565b600060208284031215612bb957600080fd5b61084b82612b25565b7fff00000000000000000000000000000000000000000000000000000000000000881681526000602060e081840152612bfe60e084018a612aa7565b8381036040850152612c10818a612aa7565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b81811015612c6257835183529284019291840191600101612c46565b50909c9b505050505050505050505050565b600060208284031215612c8657600080fd5b5035919050565b803560ff81168114612b3c57600080fd5b60008060008060008060c08789031215612cb757600080fd5b612cc087612b25565b95506020870135945060408701359350612cdc60608801612c8d565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a031215612d1157600080fd5b612d1a88612b25565b9650612d2860208901612b25565b95506040880135945060608801359350612d4460808901612c8d565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612d7357600080fd5b612d7c83612b25565b9150612d8a60208401612b25565b90509250929050565b60008060408385031215612da657600080fd5b612daf83612b25565b9150602083013563ffffffff81168114612dc857600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612e1557612e15612dd3565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c90821680612e8c57607f821691505b602082108103611d30577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f821115611e1257600081815260208120601f850160051c81016020861015612eec5750805b601f850160051c820191505b81811015612f0b57828155600101612ef8565b505050505050565b815167ffffffffffffffff811115612f2d57612f2d612e1a565b612f4181612f3b8454612e78565b84612ec5565b602080601f831160018114612f765760008415612f5e5750858301515b600019600386901b1c1916600185901b178555612f0b565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015612fc357888601518255948401946001909101908401612fa4565b5085821015612fe15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008282101561300357613003612dd3565b500390565b80516020808301519190811015611d305760001960209190910360031b1b16919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613091577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102775760003560e01c806379ba509711610160578063a457c2d7116100d8578063dd62ed3e1161008c578063ee9a31a211610071578063ee9a31a21461060c578063f1127ed814610633578063f2fde38b1461068557600080fd5b8063dd62ed3e146105c2578063e30c3978146105fb57600080fd5b8063c3cda520116100bd578063c3cda52014610589578063c4d66de81461059c578063d505accf146105af57600080fd5b8063a457c2d714610563578063a9059cbb1461057657600080fd5b80638e539e8c1161012f57806395d89b411161011457806395d89b41146105045780639ab24eb01461053d5780639dc29fac1461055057600080fd5b80638e539e8c146104d257806391ddadf4146104e557600080fd5b806379ba50971461048b5780637ecebe001461049357806384b0196e146104a65780638da5cb5b146104c157600080fd5b80633a46b1a8116101f3578063587cde1e116101c25780636fcfff45116101a75780636fcfff451461043257806370a082311461045a578063715018a61461048357600080fd5b8063587cde1e146103f35780635c19a95c1461041f57600080fd5b80633a46b1a81461038757806340c10f191461039a5780634bf5d7e9146103af57806354fd4d50146103b757600080fd5b806318160ddd1161024a578063313ce5671161022f578063313ce5671461035d5780633644e5151461036c578063395093511461037457600080fd5b806318160ddd1461033857806323b872dd1461034a57600080fd5b806301ffc9a71461027c578063033964be146102a457806306fdde03146102e3578063095ea7b314610325575b600080fd5b61028f61028a366004612a65565b610698565b60405190151581526020015b60405180910390f35b6102cb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161029b565b60408051808201909152600581527f4b726f6d6100000000000000000000000000000000000000000000000000000060208201525b60405161029b9190612b12565b61028f610333366004612b41565b610738565b6002545b60405190815260200161029b565b61028f610358366004612b6b565b610752565b6040516012815260200161029b565b61033c610776565b61028f610382366004612b41565b610785565b61033c610395366004612b41565b6107c4565b6103ad6103a8366004612b41565b610852565b005b610318610913565b6103186040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6102cb610401366004612ba7565b6001600160a01b039081166000908152600960205260409020541690565b6103ad61042d366004612ba7565b6109ab565b610445610440366004612ba7565b6109b8565b60405163ffffffff909116815260200161029b565b61033c610468366004612ba7565b6001600160a01b031660009081526020819052604090205490565b6103ad6109da565b6103ad6109ee565b61033c6104a1366004612ba7565b610a79565b6104ae610a97565b60405161029b9796959493929190612bc2565b603f546001600160a01b03166102cb565b61033c6104e0366004612c74565b610b3c565b6104ed610ba7565b60405165ffffffffffff909116815260200161029b565b60408051808201909152600381527f4b524f00000000000000000000000000000000000000000000000000000000006020820152610318565b61033c61054b366004612ba7565b610bb2565b6103ad61055e366004612b41565b610c5e565b61028f610571366004612b41565b610d06565b61028f610584366004612b41565b610db0565b6103ad610597366004612c9e565b610dbe565b6103ad6105aa366004612ba7565b610ef4565b6103ad6105bd366004612cf6565b611075565b61033c6105d0366004612d60565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6071546001600160a01b03166102cb565b6102cb7f000000000000000000000000000000000000000000000000000000000000000081565b610646610641366004612d93565b6111d9565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16928101929092520161029b565b6103ad610693366004612ba7565b611272565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f30a0c5a9000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000841682148061073057507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b60003361074681858561132f565b60019150505b92915050565b600033610760858285611487565b61076b858585611519565b506001949350505050565b600061078061170c565b905090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919061074690829086906107bf908790612e02565b61132f565b60006107ce610ba7565b65ffffffffffff1682106108295760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20667574757265206c6f6f6b75700000000000000060448201526064015b60405180910390fd5b6001600160a01b0383166000908152600a6020526040902061084b9083611837565b9392505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108935750603f546001600160a01b031633145b6109055760405162461bcd60e51b815260206004820152602e60248201527f476f7665726e616e6365546f6b656e3a206f6e6c7920627269646765206f722060448201527f6f776e65722063616e206d696e740000000000000000000000000000000000006064820152608401610820565b61090f828261194a565b5050565b60604361091e610ba7565b65ffffffffffff16146109735760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a2062726f6b656e20636c6f636b206d6f64650000006044820152606401610820565b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b6109b5338261199b565b50565b6001600160a01b0381166000908152600a602052604081205461074c90611a2c565b6109e2611aac565b6109ec6000611b06565b565b60715433906001600160a01b03168114610a705760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610820565b6109b581611b06565b6001600160a01b03811660009081526007602052604081205461074c565b600060608082808083610acb7f00000000000000000000000000000000000000000000000000000000000000006005611b37565b610af67f00000000000000000000000000000000000000000000000000000000000000006006611b37565b604080516000808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6000610b46610ba7565b65ffffffffffff168210610b9c5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20667574757265206c6f6f6b7570000000000000006044820152606401610820565b61074c600b83611837565b600061078043611bdb565b6001600160a01b0381166000908152600a60205260408120548015610c36576001600160a01b0383166000908152600a6020526040902080546000198301908110610bff57610bff612e49565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610c39565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cfc5760405162461bcd60e51b815260206004820152603160248201527f4b726f6d614d696e7461626c6545524332303a206f6e6c79206272696467652060448201527f63616e206d696e7420616e64206275726e0000000000000000000000000000006064820152608401610820565b61090f8282611c59565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919083811015610da35760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610820565b61076b828686840361132f565b600033610746818585611519565b83421115610e0e5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610820565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610e8890610e809060a00160405160208183030381529060405280519060200120611c9e565b858585611ce6565b9050610e9381611d0e565b8614610ee15760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610820565b610eeb818861199b565b50505050505050565b600c54610100900460ff1615808015610f145750600c54600160ff909116105b80610f2e5750303b158015610f2e5750600c5460ff166001145b610fa05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610820565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610ffe57600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b611006611d36565b61100f82611272565b801561090f57600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b834211156110c55760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610820565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886110f48c611d0e565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061114f82611c9e565b9050600061115f82878787611ce6565b9050896001600160a01b0316816001600160a01b0316146111c25760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610820565b6111cd8a8a8a61132f565b50505050505050505050565b60408051808201909152600080825260208201526001600160a01b0383166000908152600a60205260409020805463ffffffff841690811061121d5761121d612e49565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b61127a611aac565b607180546001600160a01b0383167fffffffffffffffffffffffff000000000000000000000000000000000000000090911681179091556112c3603f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60006020835110156113175761131083611dbb565b905061074c565b816113228482612f13565b5060ff905061074c565b90565b6001600160a01b0383166113aa5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166114265760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461151357818110156115065760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610820565b611513848484840361132f565b50505050565b6001600160a01b0383166115955760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166116115760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b038316600090815260208190526040902054818110156116a05760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611513848484611e17565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561176557507f000000000000000000000000000000000000000000000000000000000000000046145b1561178f57507f000000000000000000000000000000000000000000000000000000000000000090565b610780604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b81546000908181600581111561189157600061185284611e22565b61185c9085612ff1565b600088815260209020909150869082015463ffffffff1611156118815780915061188f565b61188c816001612e02565b92505b505b808210156118de5760006118a58383611f0a565b600088815260209020909150869082015463ffffffff1611156118ca578091506118d8565b6118d5816001612e02565b92505b50611891565b801561191f576000868152602090208101600019015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611922565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169695505050505050565b6119548282611f25565b816001600160a01b03167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161198f91815260200190565b60405180910390a25050565b6001600160a01b038281166000818152600960208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611513828483611fd1565b600063ffffffff821115611aa85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610820565b5090565b603f546001600160a01b031633146109ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610820565b607180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556109b58161210e565b606060ff8314611b4a5761131083612178565b818054611b5690612e78565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8290612e78565b8015611bcf5780601f10611ba457610100808354040283529160200191611bcf565b820191906000526020600020905b815481529060010190602001808311611bb257829003601f168201915b5050505050905061074c565b600065ffffffffffff821115611aa85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201527f38206269747300000000000000000000000000000000000000000000000000006064820152608401610820565b611c6382826121b7565b816001600160a01b03167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161198f91815260200190565b600061074c611cab61170c565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6000806000611cf7878787876121cf565b91509150611d04816122b1565b5095945050505050565b6001600160a01b03811660009081526007602052604090208054600181018255905b50919050565b600c54610100900460ff16611db35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610820565b6109ec612416565b600080829050601f81511115611dff57826040517f305a27a90000000000000000000000000000000000000000000000000000000081526004016108209190612b12565b8051611e0a82613008565b179392505050565b505050565b611e1283838361249c565b600081600003611e3457506000919050565b60006001611e41846124ce565b901c6001901b90506001818481611e5a57611e5a61302c565b048201901c90506001818481611e7257611e7261302c565b048201901c90506001818481611e8a57611e8a61302c565b048201901c90506001818481611ea257611ea261302c565b048201901c90506001818481611eba57611eba61302c565b048201901c90506001818481611ed257611ed261302c565b048201901c90506001818481611eea57611eea61302c565b048201901c905061084b81828581611f0457611f0461302c565b04612562565b6000611f19600284841861305b565b61084b90848416612e02565b611f2f8282612578565b6002547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1015611fc35760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610820565b611513600b61263f8361264b565b816001600160a01b0316836001600160a01b031614158015611ff35750600081115b15611e12576001600160a01b03831615612081576001600160a01b0383166000908152600a60205260408120819061202e906128148561264b565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612076929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611e12576001600160a01b0382166000908152600a6020526040812081906120b79061263f8561264b565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516120ff929190918252602082015260400190565b60405180910390a25050505050565b603f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060600061218583612820565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b6121c18282612861565b611513600b6128148361264b565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561220657506000905060036122a8565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561225a573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b0381166122a1576000600192509250506122a8565b9150600090505b94509492505050565b60008160048111156122c5576122c5613096565b036122cd5750565b60018160048111156122e1576122e1613096565b0361232e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610820565b600281600481111561234257612342613096565b0361238f5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610820565b60038160048111156123a3576123a3613096565b036109b55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610820565b600c54610100900460ff166124935760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610820565b6109ec33611b06565b6001600160a01b03838116600090815260096020526040808220548584168352912054611e1292918216911683611fd1565b600080608083901c156124e357608092831c92015b604083901c156124f557604092831c92015b602083901c1561250757602092831c92015b601083901c1561251957601092831c92015b600883901c1561252b57600892831c92015b600483901c1561253d57600492831c92015b600283901c1561254f57600292831c92015b600183901c1561074c5760010192915050565b6000818310612571578161084b565b5090919050565b6001600160a01b0382166125ce5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610820565b80600260008282546125e09190612e02565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361090f60008383611e17565b600061084b8284612e02565b825460009081908181156126ad5760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660208201526126c2565b60408051808201909152600080825260208201525b905080602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1693506126f784868863ffffffff16565b9250600082118015612721575061270c610ba7565b65ffffffffffff16816000015163ffffffff16145b1561277b5761272f836129d1565b60008881526020902083016000190180547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092166401000000000263ffffffff90921691909117905561280a565b86604051806040016040528061279f612792610ba7565b65ffffffffffff16611a2c565b63ffffffff1681526020016127b3866129d1565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b600061084b8284612ff1565b600060ff8216601f81111561074c576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166128dd5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166000908152602081905260409020548181101561296c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611e1283600084611e17565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821115611aa85760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610820565b600060208284031215612a7757600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461084b57600080fd5b6000815180845260005b81811015612acd57602081850181015186830182015201612ab1565b81811115612adf576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061084b6020830184612aa7565b80356001600160a01b0381168114612b3c57600080fd5b919050565b60008060408385031215612b5457600080fd5b612b5d83612b25565b946020939093013593505050565b600080600060608486031215612b8057600080fd5b612b8984612b25565b9250612b9760208501612b25565b9150604084013590509250925092565b600060208284031215612bb957600080fd5b61084b82612b25565b7fff00000000000000000000000000000000000000000000000000000000000000881681526000602060e081840152612bfe60e084018a612aa7565b8381036040850152612c10818a612aa7565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b81811015612c6257835183529284019291840191600101612c46565b50909c9b505050505050505050505050565b600060208284031215612c8657600080fd5b5035919050565b803560ff81168114612b3c57600080fd5b60008060008060008060c08789031215612cb757600080fd5b612cc087612b25565b95506020870135945060408701359350612cdc60608801612c8d565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a031215612d1157600080fd5b612d1a88612b25565b9650612d2860208901612b25565b95506040880135945060608801359350612d4460808901612c8d565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612d7357600080fd5b612d7c83612b25565b9150612d8a60208401612b25565b90509250929050565b60008060408385031215612da657600080fd5b612daf83612b25565b9150602083013563ffffffff81168114612dc857600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612e1557612e15612dd3565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c90821680612e8c57607f821691505b602082108103611d30577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f821115611e1257600081815260208120601f850160051c81016020861015612eec5750805b601f850160051c820191505b81811015612f0b57828155600101612ef8565b505050505050565b815167ffffffffffffffff811115612f2d57612f2d612e1a565b612f4181612f3b8454612e78565b84612ec5565b602080601f831160018114612f765760008415612f5e5750858301515b600019600386901b1c1916600185901b178555612f0b565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015612fc357888601518255948401946001909101908401612fa4565b5085821015612fe15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008282101561300357613003612dd3565b500390565b80516020808301519190811015611d305760001960209190910360031b1b16919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613091577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a", + "devdoc": {}, + "userdoc": {}, + "storageLayout": { + "storage": [ + { + "astId": 1333, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_balances", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 1339, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_allowances", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" + }, + { + "astId": 1341, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_totalSupply", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 1343, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_name", + "offset": 0, + "slot": "3", + "type": "t_string_storage" + }, + { + "astId": 1345, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_symbol", + "offset": 0, + "slot": "4", + "type": "t_string_storage" + }, + { + "astId": 3999, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_nameFallback", + "offset": 0, + "slot": "5", + "type": "t_string_storage" + }, + { + "astId": 4001, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_versionFallback", + "offset": 0, + "slot": "6", + "type": "t_string_storage" + }, + { + "astId": 2005, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_nonces", + "offset": 0, + "slot": "7", + "type": "t_mapping(t_address,t_struct(Counter)2977_storage)" + }, + { + "astId": 2013, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_PERMIT_TYPEHASH_DEPRECATED_SLOT", + "offset": 0, + "slot": "8", + "type": "t_bytes32" + }, + { + "astId": 2180, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_delegates", + "offset": 0, + "slot": "9", + "type": "t_mapping(t_address,t_address)" + }, + { + "astId": 2186, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_checkpoints", + "offset": 0, + "slot": "10", + "type": "t_mapping(t_address,t_array(t_struct(Checkpoint)2171_storage)dyn_storage)" + }, + { + "astId": 2190, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_totalSupplyCheckpoints", + "offset": 0, + "slot": "11", + "type": "t_array(t_struct(Checkpoint)2171_storage)dyn_storage" + }, + { + "astId": 656, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_initialized", + "offset": 0, + "slot": "12", + "type": "t_uint8" + }, + { + "astId": 659, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_initializing", + "offset": 1, + "slot": "12", + "type": "t_bool" + }, + { + "astId": 1189, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "__gap", + "offset": 0, + "slot": "13", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 528, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_owner", + "offset": 0, + "slot": "63", + "type": "t_address" + }, + { + "astId": 648, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "__gap", + "offset": 0, + "slot": "64", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 437, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_pendingOwner", + "offset": 0, + "slot": "113", + "type": "t_address" + }, + { + "astId": 516, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "__gap", + "offset": 0, + "slot": "114", + "type": "t_array(t_uint256)49_storage" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_struct(Checkpoint)2171_storage)dyn_storage": { + "encoding": "dynamic_array", + "label": "struct ERC20Votes.Checkpoint[]", + "numberOfBytes": "32", + "base": "t_struct(Checkpoint)2171_storage" + }, + "t_array(t_uint256)49_storage": { + "encoding": "inplace", + "label": "uint256[49]", + "numberOfBytes": "1568", + "base": "t_uint256" + }, + "t_array(t_uint256)50_storage": { + "encoding": "inplace", + "label": "uint256[50]", + "numberOfBytes": "1600", + "base": "t_uint256" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_address)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => address)", + "numberOfBytes": "32", + "value": "t_address" + }, + "t_mapping(t_address,t_array(t_struct(Checkpoint)2171_storage)dyn_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => struct ERC20Votes.Checkpoint[])", + "numberOfBytes": "32", + "value": "t_array(t_struct(Checkpoint)2171_storage)dyn_storage" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => uint256))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_uint256)" + }, + "t_mapping(t_address,t_struct(Counter)2977_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => struct Counters.Counter)", + "numberOfBytes": "32", + "value": "t_struct(Counter)2977_storage" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(Checkpoint)2171_storage": { + "encoding": "inplace", + "label": "struct ERC20Votes.Checkpoint", + "numberOfBytes": "32", + "members": [ + { + "astId": 2168, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "fromBlock", + "offset": 0, + "slot": "0", + "type": "t_uint32" + }, + { + "astId": 2170, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "votes", + "offset": 4, + "slot": "0", + "type": "t_uint224" + } + ] + }, + "t_struct(Counter)2977_storage": { + "encoding": "inplace", + "label": "struct Counters.Counter", + "numberOfBytes": "32", + "members": [ + { + "astId": 2976, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_value", + "offset": 0, + "slot": "0", + "type": "t_uint256" + } + ] + }, + "t_uint224": { + "encoding": "inplace", + "label": "uint224", + "numberOfBytes": "28" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "encoding": "inplace", + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint8": { + "encoding": "inplace", + "label": "uint8", + "numberOfBytes": "1" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/kromaSepolia/GovernanceTokenProxy.json b/packages/contracts/deployments/kromaSepolia/GovernanceTokenProxy.json new file mode 100644 index 0000000000..c03eb73890 --- /dev/null +++ b/packages/contracts/deployments/kromaSepolia/GovernanceTokenProxy.json @@ -0,0 +1,152 @@ +{ + "address": "0x25500000d700bbE27104577CCcce8eAbCC96c8ad", + "abi": [ + { + "type": "constructor", + "payable": false, + "inputs": [ + { + "type": "address", + "name": "_admin" + } + ] + }, + { + "type": "function", + "name": "admin", + "constant": false, + "payable": false, + "inputs": [], + "outputs": [ + { + "type": "address" + } + ] + }, + { + "type": "function", + "name": "changeAdmin", + "constant": false, + "payable": false, + "inputs": [ + { + "type": "address", + "name": "_admin" + } + ], + "outputs": [] + }, + { + "type": "function", + "name": "implementation", + "constant": false, + "payable": false, + "inputs": [], + "outputs": [ + { + "type": "address" + } + ] + }, + { + "type": "function", + "name": "upgradeTo", + "constant": false, + "payable": false, + "inputs": [ + { + "type": "address", + "name": "_implementation" + } + ], + "outputs": [] + }, + { + "type": "function", + "name": "upgradeToAndCall", + "constant": false, + "stateMutability": "payable", + "payable": true, + "inputs": [ + { + "type": "address", + "name": "_implementation" + }, + { + "type": "bytes", + "name": "_data" + } + ], + "outputs": [ + { + "type": "bytes" + } + ] + }, + { + "type": "event", + "anonymous": false, + "name": "AdminChanged", + "inputs": [ + { + "type": "address", + "name": "previousAdmin", + "indexed": false + }, + { + "type": "address", + "name": "newAdmin", + "indexed": false + } + ] + }, + { + "type": "event", + "anonymous": false, + "name": "Upgraded", + "inputs": [ + { + "type": "address", + "name": "implementation", + "indexed": true + } + ] + } + ], + "transactionHash": "0xc43c001d27baa1b6f3ec401cb17b08f4bb633043195a37c6f47453c04ccb31dc", + "receipt": { + "to": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "from": "0xcc56801a72463d39903A4a4632E600289178F6bC", + "contractAddress": null, + "transactionIndex": 1, + "gasUsed": "526661", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000400000000000000000000000000000004000000000000000000000000000000000000000000000000000000", + "blockHash": "0x030fc213291b67f02b2c27ec7a27dec12a1a2fb33527ccfec04e69f293d340b3", + "transactionHash": "0xc43c001d27baa1b6f3ec401cb17b08f4bb633043195a37c6f47453c04ccb31dc", + "logs": [ + { + "transactionIndex": 1, + "blockNumber": 15686863, + "transactionHash": "0xc43c001d27baa1b6f3ec401cb17b08f4bb633043195a37c6f47453c04ccb31dc", + "address": "0x25500000d700bbE27104577CCcce8eAbCC96c8ad", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cc56801a72463d39903a4a4632e600289178f6bc", + "logIndex": 0, + "blockHash": "0x030fc213291b67f02b2c27ec7a27dec12a1a2fb33527ccfec04e69f293d340b3" + } + ], + "blockNumber": 15686863, + "cumulativeGasUsed": "572845", + "status": 1, + "byzantium": true + }, + "args": [ + "0xcc56801a72463d39903A4a4632E600289178F6bC" + ], + "numDeployments": 1, + "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_admin\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_admin\",\"type\":\"address\"}],\"name\":\"changeAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_implementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_implementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"events\":{\"AdminChanged(address,address)\":{\"params\":{\"newAdmin\":\"The new owner of the contract\",\"previousAdmin\":\"The previous owner of the contract\"}},\"Upgraded(address)\":{\"params\":{\"implementation\":\"The address of the implementation contract\"}}},\"kind\":\"dev\",\"methods\":{\"admin()\":{\"returns\":{\"_0\":\"Owner address.\"}},\"changeAdmin(address)\":{\"params\":{\"_admin\":\"New owner of the proxy contract.\"}},\"constructor\":{\"params\":{\"_admin\":\"Address of the initial contract admin. Admin as the ability to access the transparent proxy interface.\"}},\"implementation()\":{\"returns\":{\"_0\":\"Implementation address.\"}},\"upgradeTo(address)\":{\"params\":{\"_implementation\":\"Address of the implementation contract.\"}},\"upgradeToAndCall(address,bytes)\":{\"params\":{\"_data\":\"Calldata to delegatecall the new implementation with.\",\"_implementation\":\"Address of the implementation contract.\"}}},\"title\":\"Proxy\",\"version\":1},\"userdoc\":{\"events\":{\"AdminChanged(address,address)\":{\"notice\":\"An event that is emitted each time the owner is upgraded. This event is part of the EIP-1967 specification.\"},\"Upgraded(address)\":{\"notice\":\"An event that is emitted each time the implementation is changed. This event is part of the EIP-1967 specification.\"}},\"kind\":\"user\",\"methods\":{\"admin()\":{\"notice\":\"Gets the owner of the proxy contract.\"},\"changeAdmin(address)\":{\"notice\":\"Changes the owner of the proxy contract. Only callable by the owner.\"},\"constructor\":{\"notice\":\"Sets the initial admin during contract deployment. Admin address is stored at the EIP-1967 admin storage slot so that accidental storage collision with the implementation is not possible.\"},\"implementation()\":{\"notice\":\"Queries the implementation address.\"},\"upgradeTo(address)\":{\"notice\":\"Set the implementation contract address. The code at the given address will execute when this contract is called.\"},\"upgradeToAndCall(address,bytes)\":{\"notice\":\"Set the implementation and call a function in a single transaction. Useful to ensure atomic execution of initialization-based upgrades.\"}},\"notice\":\"Proxy is a transparent proxy that passes through the call if the caller is the owner or if the caller is address(0), meaning that the call originated from an off-chain simulation.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/universal/Proxy.sol\":\"Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/\",\":@rari-capital/solmate/=node_modules/@rari-capital/solmate/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\",\":hardhat-deploy/=node_modules/hardhat-deploy/\",\":hardhat/=node_modules/hardhat/\"]},\"sources\":{\"contracts/universal/Proxy.sol\":{\"keccak256\":\"0xe7b6a14774f21622e1c287faf730c5fbc69f75b73942ee2586ec0c3b07dfe573\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6874d44c7dab7ce269ec546b762f3fd101f73daedb0f247a19116be868643ddf\",\"dweb:/ipfs/QmPwUj5LneorU5bwryiCVcdpH3WTXBRqxsXUfQsJJgX4Gt\"]}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b5060405161091838038061091883398101604081905261002f916100b2565b6100388161003e565b506100e2565b60006100566000805160206108f88339815191525490565b6000805160206108f8833981519152839055604080516001600160a01b038084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b6000602082840312156100c457600080fd5b81516001600160a01b03811681146100db57600080fd5b9392505050565b610807806100f16000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103", + "deployedBytecode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a" +} \ No newline at end of file diff --git a/packages/contracts/deployments/kromaSepolia/MintManager.json b/packages/contracts/deployments/kromaSepolia/MintManager.json new file mode 100644 index 0000000000..405fad26b6 --- /dev/null +++ b/packages/contracts/deployments/kromaSepolia/MintManager.json @@ -0,0 +1,399 @@ +{ + "address": "0xf245130FC5B64FF444E9698fbD4563B64c2aC728", + "abi": [ + { + "type": "constructor", + "inputs": [ + { + "name": "_governanceToken", + "type": "address", + "internalType": "address" + }, + { + "name": "_owner", + "type": "address", + "internalType": "address" + }, + { + "name": "_recipients", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "_shares", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "GOVERNANCE_TOKEN", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "contract GovernanceToken" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "MINT_CAP", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "SHARE_DENOMINATOR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "acceptOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "acceptOwnershipOfToken", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "distribute", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "mint", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "minted", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "pendingOwner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "recipients", + "inputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "renounceOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "renounceOwnershipOfToken", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "shareOf", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "transferOwnershipOfToken", + "inputs": [ + { + "name": "newMintManager", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "OwnershipTransferStarted", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + } + ], + "transactionHash": "0xa67ab6adb6e11186d04cd2d42a02564ab6f5ff30cbd70bd4b9b6ca22c2f9c6ae", + "receipt": { + "to": null, + "from": "0xcc56801a72463d39903A4a4632E600289178F6bC", + "contractAddress": "0xf245130FC5B64FF444E9698fbD4563B64c2aC728", + "transactionIndex": 1, + "gasUsed": "1276367", + "logsBloom": "0x00000000000000000000000000000000200000000000000000800000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000080020000000000000000000800000800000000000000000000000000400000000000080000000002000000000400000000000000000040000000000000000000000000020000000000000000000000000000000000000000000000000000002000000400000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000004000000000", + "blockHash": "0x9bc41440fb54f79b32e910a6728532332db275f02b8b91ea5d57d3b2e79dd202", + "transactionHash": "0xa67ab6adb6e11186d04cd2d42a02564ab6f5ff30cbd70bd4b9b6ca22c2f9c6ae", + "logs": [ + { + "transactionIndex": 1, + "blockNumber": 15686866, + "transactionHash": "0xa67ab6adb6e11186d04cd2d42a02564ab6f5ff30cbd70bd4b9b6ca22c2f9c6ae", + "address": "0xf245130FC5B64FF444E9698fbD4563B64c2aC728", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000cc56801a72463d39903a4a4632e600289178f6bc" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0x9bc41440fb54f79b32e910a6728532332db275f02b8b91ea5d57d3b2e79dd202" + }, + { + "transactionIndex": 1, + "blockNumber": 15686866, + "transactionHash": "0xa67ab6adb6e11186d04cd2d42a02564ab6f5ff30cbd70bd4b9b6ca22c2f9c6ae", + "address": "0xf245130FC5B64FF444E9698fbD4563B64c2aC728", + "topics": [ + "0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700", + "0x000000000000000000000000cc56801a72463d39903a4a4632e600289178f6bc", + "0x00000000000000000000000080e695eceb5bea3b1788c4dfb40b72afc59f60d8" + ], + "data": "0x", + "logIndex": 1, + "blockHash": "0x9bc41440fb54f79b32e910a6728532332db275f02b8b91ea5d57d3b2e79dd202" + } + ], + "blockNumber": 15686866, + "cumulativeGasUsed": "1322551", + "status": 1, + "byzantium": true + }, + "args": [ + "0x25500000d700bbE27104577CCcce8eAbCC96c8ad", + "0x80e695eceb5bea3b1788c4dfb40b72afc59f60d8", + [ + "0x0c75dc81a35109e2a8b7b7e3589e91bb1b82c7d7", + "0xefedaa42551d57083b798bc2c48b9d7a41135b55", + "0xc4d6d492d5141939faee016057596e0f3038b840", + "0xbe5cc7e6725798958a8f79c63b3a986c6881c3ca", + "0xa9a3af107fb75663b09c6ea7c22b8931b15a08da", + "0x9fd58bb76cfa959bc8d2ff3c0101c1243e513da4" + ], + [ + 40000, + 17000, + 7000, + 15800, + 2000, + 13000 + ] + ], + "numDeployments": 1, + "solcInputHash": "37a0cebac478897ae0c20446c8a2494a", + "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_governanceToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"_recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_shares\",\"type\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"GOVERNANCE_TOKEN\",\"outputs\":[{\"internalType\":\"contract GovernanceToken\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINT_CAP\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SHARE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnershipOfToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"distribute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"recipients\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnershipOfToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"shareOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newMintManager\",\"type\":\"address\"}],\"name\":\"transferOwnershipOfToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"acceptOwnership()\":{\"details\":\"The new owner accepts the ownership transfer.\"},\"constructor\":{\"params\":{\"_governanceToken\":\"The GovernanceToken this contract can mint tokens of.\",\"_owner\":\"The owner of this contract.\",\"_recipients\":\"List of the recipients.\",\"_shares\":\"List of token distribution ratios for each recipient.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"pendingOwner()\":{\"details\":\"Returns the address of the pending owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner.\"},\"transferOwnershipOfToken(address)\":{\"params\":{\"newMintManager\":\"The new MintManager to own the GovernanceToken.\"}}},\"title\":\"MintManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"GOVERNANCE_TOKEN()\":{\"notice\":\"The GovernanceToken that the MintManager can mint.\"},\"MINT_CAP()\":{\"notice\":\"The amount of tokens that can be minted.\"},\"SHARE_DENOMINATOR()\":{\"notice\":\"The denominator of each recipient's share.\"},\"acceptOwnershipOfToken()\":{\"notice\":\"Only the owner is allowed to accept the ownership of the GovernanceToken.\"},\"constructor\":{\"notice\":\"Constructs the MintManager contract.\"},\"distribute()\":{\"notice\":\"Only the owner is allowed to distribute the GovernanceToken to specified recipients.\"},\"mint()\":{\"notice\":\"Only the owner is allowed to mint mint cap amount of the GovernanceToken at once.\"},\"minted()\":{\"notice\":\"True when already minted on this chain. MintManager can mint only once on each chain.\"},\"recipients(uint256)\":{\"notice\":\"A list of recipient addresses that will receive tokens to be distributed.\"},\"renounceOwnershipOfToken()\":{\"notice\":\"Only the owner is allowed to renounce the ownership of the GovernanceToken.\"},\"shareOf(address)\":{\"notice\":\"A mapping of the recipient's address to share.\"},\"transferOwnershipOfToken(address)\":{\"notice\":\"Only the owner is allowed to transfer the ownership of the GovernanceToken.\"}},\"notice\":\"MintManager issues mint cap amount of GovernanceToken at once (TGE) and distributes the tokens to specified recipients.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/governance/MintManager.sol\":\"MintManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/\",\":@rari-capital/solmate/=node_modules/@rari-capital/solmate/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\",\":hardhat-deploy/=node_modules/hardhat-deploy/\",\":hardhat/=node_modules/hardhat/\"]},\"sources\":{\"contracts/governance/GovernanceToken.sol\":{\"keccak256\":\"0x98304239f5ca6cc0c68dedf47b31ec5ceaeb11fed78d007dc16afb72d6a152a5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6cffce351c0d797a1c46e2eb3355324c86693cd9d48cd291cc30f0badb1843b4\",\"dweb:/ipfs/QmajzzFw1GT51LH1VBKh378xxwSLXxs6erBvUVxzFVkeLj\"]},\"contracts/governance/MintManager.sol\":{\"keccak256\":\"0xadda6a066e4b12ff23e7ff1cb4fdad43106b1b1e44389ea24453fccb0e5c71c8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2ea61e95d9edbf73c56b92dea9b75f66bb76354cff61547df52efa41cd95d07b\",\"dweb:/ipfs/QmRBpLcAHeDBpV8dLgtRaBdA6BzBU6CJmgyoSHCwK8U5cW\"]},\"contracts/universal/IKromaMintableERC20.sol\":{\"keccak256\":\"0x1a95268117456ddb1e0a16eb2ba773b9540c7b8b9520e66d4d167ddc6ace6fcb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f93d2e6f5121a3dfe272e399d6774e0584d59a20c4f63db78e5a0b644d92fa59\",\"dweb:/ipfs/QmbwM7kCpmwZs348jCeNwF86H8SDBURsGCGCUCyoSS1ffy\"]},\"contracts/universal/ISemver.sol\":{\"keccak256\":\"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a\",\"dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR\"]},\"contracts/universal/KromaMintableERC20.sol\":{\"keccak256\":\"0x30dccac5fe2d7c75bbe1411004ad03c40afe6dce8c7d22a89abb783f74bd2674\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://de3f8062e170498d71069529cb83681b0acaeb41643892c092111b07df2895f6\",\"dweb:/ipfs/QmNsZa5vHYQ8eG3dQ7PjkfweXzxKc6nbDj9P455Mp1Waxx\"]},\"node_modules/@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\":{\"keccak256\":\"0x84efb8889801b0ac817324aff6acc691d07bbee816b671817132911d287a8c63\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ec6df2255fadc251ea905043c47bf55170ee6cb5d7ca8b5c8ed54c84eac9d09e\",\"dweb:/ipfs/QmaokWfuL59uarki5yoDGbPzh4cErzEfnAzfmesTNJNXE9\"]},\"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://99c8cb3cd19a44bbfb6612605affb7d8b06cee1f6aa9362a37a8672b4f7eeaf8\",\"dweb:/ipfs/QmasyxFDBUp7k5KFgfDWEzM8PYSKEq7GVznzMJ1VxVRF4B\"]},\"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f103ee2e4aecd37aac6ceefe670709cdd7613dee25fa2d4d9feaf7fc0aaa155e\",\"dweb:/ipfs/QmRiNZLoJk5k3HPMYGPGjZFd2ke1ZxjhJZkM45Ec9GH9hv\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://310136ad60820af4177a11a61d77a3686faf5fca4942b600e08fc940db38396b\",\"dweb:/ipfs/QmbCzMNSTL7Zi7M4UCSqBrkHtp4jjxUnGbkneCZKdR1qeq\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"node_modules/@openzeppelin/contracts/access/Ownable.sol\":{\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fc980984badf3984b6303b377711220e067722bbd6a135b24669ff5069ef9f32\",\"dweb:/ipfs/QmPHXMSXj99XjSVM21YsY6aNtLLjLVXDbyN76J5HQYvvrz\"]},\"node_modules/@openzeppelin/contracts/access/Ownable2Step.sol\":{\"keccak256\":\"0xde231558366826d7cb61725af8147965a61c53b77a352cc8c9af38fc5a92ac3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1fd55624076bf61d44af5ff351919e32dda748567acfbdd6ba3d6c7be61c758e\",\"dweb:/ipfs/QmSki4dTrf4GPm7MTpG3fk8mC7rnjwd2zMomLp6jLuF63Q\"]},\"node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"keccak256\":\"0x1618ddebe73377660f6da71afcba35d5ac4c4600918b3a381d9c6f37eba613eb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://666c8d7c62478b55e082f1835275b7acfc1595491998df6d67183ff2c70eab96\",\"dweb:/ipfs/QmVXmnXfxNaLhoX283dqyKJ8DJbF5thUd9sMuRoFpNMwr7\"]},\"node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol\":{\"keccak256\":\"0xac6c2efc64baccbde4904ae18ed45139c9aa8cff96d6888344d1e4d2eb8b659f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6e416a280c610b6b7a5f158e4a41aacfaec01ef14d5d1de13b46be9e090265fc\",\"dweb:/ipfs/QmYZP2KrdyccBbhLZT42auhvBTMkwiwUS3V6HWb42rbwbG\"]},\"node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol\":{\"keccak256\":\"0xfc12b717f6a2cd0d67adc8700097d4464d37f18ce933d4fc9c948ab6aec35e80\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://82386e69ebe902a2edfd4f8a5ecbeaeb2e00f6cc6481a973729e974373fb492e\",\"dweb:/ipfs/QmSXg4wBMBd83mQvkekT1GsiRX2Qyv5gvrqzv5qJx2M7Kc\"]},\"node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol\":{\"keccak256\":\"0xcaea9aeda3816ba872358c828f4f01455c22ae48ced49c4c7d72bd74176c09b9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://16ff22d8df5aee94510ee43d361b6147caef164941a684cedcb75be44f351fe6\",\"dweb:/ipfs/QmaCCwMdHVdPApuEJHLZapSJyA7mp5dAugpma3VUzWGd8E\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0xa56ca923f70c1748830700250b19c61b70db9a683516dc5e216694a50445d99c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cac938788bc4be12101e59d45588b4e059579f4e61062e1cda8d6b06c0191b15\",\"dweb:/ipfs/QmV2JKCyjTVH3rkWNrfdJRhAT7tZ3usAN2XcnD4h53Mvih\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bd39944e8fc06be6dbe2dd1d8449b5336e23c6a7ba3e8e9ae5ae0f37f35283f5\",\"dweb:/ipfs/QmPV3FGYjVwvKSgAXKUN3r9T9GwniZz83CxBpM7vyj2G53\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol\":{\"keccak256\":\"0x36c00327e3f9afd929cc2721aaa111ab57eff78a630cc364b279ad576b899295\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f5bf927f4c8b71a5809be184c3107b915b0445ab2c4a33208331e5376692eb5a\",\"dweb:/ipfs/QmVXirsCY1sf4kodhbL6w3NWZkeZeaMuQB7M6DBAdZNqFE\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\":{\"keccak256\":\"0x4e560f86662b6f72ab76122fff53317677154f14bac4a80dbd46a54172b3abfa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ca5c2518d247417cb01164f04eff57b7e87b5346bc03478ada916f26117aa7fd\",\"dweb:/ipfs/QmVgK66XGZCiH9x4mhqejKUTujtu68DyE6KrYi6MPuaHRJ\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd\",\"dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\":{\"keccak256\":\"0xec63854014a5b4f2b3290ab9103a21bdf902a508d0f41a8573fea49e98bf571a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bc5b5dc12fbc4002f282eaa7a5f06d8310ed62c1c77c5770f6283e058454c39a\",\"dweb:/ipfs/Qme9rE2wS3yBuyJq9GgbmzbsBQsW2M2sVFqYYLw7bosGrv\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"node_modules/@openzeppelin/contracts/utils/Counters.sol\":{\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://59e1c62884d55b70f3ae5432b44bb3166ad71ae3acd19c57ab6ddc3c87c325ee\",\"dweb:/ipfs/QmezuXg5GK5oeA4F91EZhozBFekhq5TD966bHPH18cCqhu\"]},\"node_modules/@openzeppelin/contracts/utils/ShortStrings.sol\":{\"keccak256\":\"0xc0e310c163edf15db45d4ff938113ab357f94fa86e61ea8e790853c4d2e13256\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://04db5bc05dcb05ba1f6ca2dfbead17adc8a2e2f911aa80b05e7a36d9eaf96516\",\"dweb:/ipfs/QmVkfHZbXVBUPsTopueCn3qGJX8aEjahFF3Fn4NcygLNm5\"]},\"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xf09e68aa0dc6722a25bc46490e8d48ed864466d17313b8a0b254c36b54e49899\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e26daf81e2252dc1fe1ce0e4b55c2eb7c6d1ee84ae6558d1a9554432ea1d32da\",\"dweb:/ipfs/Qmb1UANWiWq5pCKbmHSu772hd4nt374dVaghGmwSVNuk8Q\"]},\"node_modules/@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b81d9ff6559ea5c47fc573e17ece6d9ba5d6839e213e6ebc3b4c5c8fe4199d7f\",\"dweb:/ipfs/QmPCW1bFisUzJkyjroY3yipwfism9RRCigCcK1hbXtVM8n\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0x809bc3edb4bcbef8263fa616c1b60ee0004b50a8a1bfa164d8f57fd31f520c58\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8b93a1e39a4a19eba1600b92c96f435442db88cac91e315c8291547a2a7bcfe2\",\"dweb:/ipfs/QmTm34KVe6uZBZwq8dZDNWwPcm24qBJdxqL3rPxBJ4LrMv\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol\":{\"keccak256\":\"0x8432884527a7ad91e6eed1cfc5a0811ae2073e5bca107bd0ca442e9236b03dbd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e3aa0eadab7aafcf91a95684765f778f64386f0368de88522ce873c21385278a\",\"dweb:/ipfs/QmPfaVAqWgH1QsT3dHVuL6jwMZbVKdoP8w1PvpiPT2FPWd\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f\",\"dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy\"]},\"node_modules/@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cc8841b3cd48ad125e2f46323c8bad3aa0e88e399ec62acb9e57efa7e7c8058c\",\"dweb:/ipfs/QmSqE4mXHA2BXW58deDbXE8MTcsL5JSKNDbm23sVQxRLPS\"]},\"node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x52a8cfb0f5239d11b457dcdd1b326992ef672714ca8da71a157255bddd13f3ad\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://495145362c7ff1c9ca88c58bbbbcb412e3c2004406647412394486552ff6c278\",\"dweb:/ipfs/QmNNCeng6d5eRPDn6tkWSQhjE39XWfQEfjA63rRwHmr1iH\"]},\"node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c50fcc459e49a9858b6d8ad5f911295cb7c9ab57567845a250bf0153f84a95c7\",\"dweb:/ipfs/QmcEW85JRzvDkQggxiBBLVAasXWdkhEysqypj9EaB6H2g6\"]}},\"version\":1}", + "bytecode": "0x60a06040523480156200001157600080fd5b506040516200169338038062001693833981016040819052620000349162000574565b6200003f336200032a565b6001600160a01b038416608052620000578362000354565b8051825114620000ba5760405162461bcd60e51b8152602060048201526024808201527f4d696e744d616e616765723a20696e76616c6964206c656e677468206f6620616044820152637272617960e01b60648201526084015b60405180910390fd5b6000805b835181101562000295576000848281518110620000df57620000df6200066a565b6020026020010151905060006001600160a01b0316816001600160a01b031603620001605760405162461bcd60e51b815260206004820152602a60248201527f4d696e744d616e616765723a20726563697069656e74206164647265737320636044820152690616e6e6f7420626520360b41b6064820152608401620000b1565b60008483815181106200017757620001776200066a565b6020026020010151905080600003620001d35760405162461bcd60e51b815260206004820152601e60248201527f4d696e744d616e616765723a2073686172652063616e6e6f74206265203000006044820152606401620000b1565b6001600160a01b03821660009081526003602052604081205490036200023f57600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0384161790555b6001600160a01b038216600090815260036020526040812080548392906200026990849062000696565b909155506200027b9050818562000696565b9350505080806200028c90620006b1565b915050620000be565b50620186a08111156200031f5760405162461bcd60e51b8152602060048201526044602482018190527f4d696e744d616e616765723a206d617820746f74616c20736861726520697320908201527f657175616c206f72206c657373207468616e2053484152455f44454e4f4d494e60648201526320aa27a960e11b608482015260a401620000b1565b5050505050620006cd565b600180546001600160a01b03191690556200035181620003c7602090811b62000b5317901c565b50565b6200035e62000417565b600180546001600160a01b0319166001600160a01b0383169081179091556200038f6000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b03163314620004735760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620000b1565b565b80516001600160a01b03811681146200048d57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620004d357620004d362000492565b604052919050565b60006001600160401b03821115620004f757620004f762000492565b5060051b60200190565b600082601f8301126200051357600080fd5b815160206200052c6200052683620004db565b620004a8565b82815260059290921b840181019181810190868411156200054c57600080fd5b8286015b8481101562000569578051835291830191830162000550565b509695505050505050565b600080600080608085870312156200058b57600080fd5b620005968562000475565b93506020620005a781870162000475565b60408701519094506001600160401b0380821115620005c557600080fd5b818801915088601f830112620005da57600080fd5b8151620005eb6200052682620004db565b81815260059190911b8301840190848101908b8311156200060b57600080fd5b938501935b828510156200063457620006248562000475565b8252938501939085019062000610565b60608b015190975094505050808311156200064e57600080fd5b50506200065e8782880162000501565b91505092959194509250565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115620006ac57620006ac62000680565b500190565b600060018201620006c657620006c662000680565b5060010190565b608051610f796200071a6000396000818161014f01528181610331015281816104a3015281816105610152818161062e0152818161080a015281816108b30152610a190152610f796000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80637eb1184511610097578063d1bc76a111610066578063d1bc76a114610229578063e30c39781461023c578063e4fc6b6d1461025a578063f2fde38b1461026257600080fd5b80637eb11845146101ee5780638da5cb5b146101f857806398f1312e14610216578063baee5ed41461022157600080fd5b8063457c3977116100d3578063457c3977146101965780634f02c420146101a9578063715018a6146101de57806379ba5097146101e657600080fd5b80631249c58b1461010557806321e5e2c41461010f57806328df3f18146101425780632efd46d61461014a575b600080fd5b61010d610275565b005b61012f61011d366004610c7a565b60036020526000908152604090205481565b6040519081526020015b60405180910390f35b61010d610557565b6101717f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610139565b61010d6101a4366004610c7a565b6105e1565b6001546101ce9074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610139565b61010d61068d565b61010d6106a1565b61012f620186a081565b60005473ffffffffffffffffffffffffffffffffffffffff16610171565b61012f633b9aca0081565b61010d610756565b610171610237366004610cb7565b610870565b60015473ffffffffffffffffffffffffffffffffffffffff16610171565b61010d6108a7565b61010d610270366004610c7a565b610aa3565b61027d610bc8565b60015474010000000000000000000000000000000000000000900460ff161561032d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4d696e744d616e616765723a20616c7265616479206d696e746564206f6e207460448201527f68697320636861696e000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561039a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103be9190610cd0565b6103c990600a610e44565b6103d790633b9aca00610e53565b90506000805b60025481101561046d576000600282815481106103fc576103fc610e90565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168083526003909152604082205490925090620186a061043f8388610e53565b6104499190610ebf565b90506104558186610efa565b9450505050808061046590610f12565b9150506103dd565b506040517f40c10f19000000000000000000000000000000000000000000000000000000008152306004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906340c10f1990604401600060405180830381600087803b1580156104fc57600080fd5b505af1158015610510573d6000803e3d6000fd5b5050600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905550505050565b61055f610bc8565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379ba50976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105c757600080fd5b505af11580156105db573d6000803e3d6000fd5b50505050565b6105e9610bc8565b6040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063f2fde38b90602401600060405180830381600087803b15801561067257600080fd5b505af1158015610686573d6000803e3d6000fd5b5050505050565b610695610bc8565b61069f6000610c49565b565b600154339073ffffffffffffffffffffffffffffffffffffffff16811461074a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610324565b61075381610c49565b50565b61075e610bc8565b60015474010000000000000000000000000000000000000000900460ff16610808576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4d696e744d616e616765723a206e6f74206d696e746564206265666f7265207260448201527f656e6f756e6365206f776e6572736869700000000000000000000000000000006064820152608401610324565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663715018a66040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105c757600080fd5b6002818154811061088057600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b6108af610bc8565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561091c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109409190610cd0565b61094b90600a610e44565b61095990633b9aca00610e53565b905060005b600254811015610a9f5760006002828154811061097d5761097d610e90565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168083526003909152604082205490925090620186a06109c08387610e53565b6109ca9190610ebf565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af1158015610a64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a889190610f4a565b505050508080610a9790610f12565b91505061095e565b5050565b610aab610bc8565b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009091168117909155610b0e60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461069f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610324565b600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905561075381610b53565b600060208284031215610c8c57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610cb057600080fd5b9392505050565b600060208284031215610cc957600080fd5b5035919050565b600060208284031215610ce257600080fd5b815160ff81168114610cb057600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b80851115610d7b57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610d6157610d61610cf3565b80851615610d6e57918102915b93841c9390800290610d27565b509250929050565b600082610d9257506001610e3e565b81610d9f57506000610e3e565b8160018114610db55760028114610dbf57610ddb565b6001915050610e3e565b60ff841115610dd057610dd0610cf3565b50506001821b610e3e565b5060208310610133831016604e8410600b8410161715610dfe575081810a610e3e565b610e088383610d22565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610e3a57610e3a610cf3565b0290505b92915050565b6000610cb060ff841683610d83565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610e8b57610e8b610cf3565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082610ef5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008219821115610f0d57610f0d610cf3565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610f4357610f43610cf3565b5060010190565b600060208284031215610f5c57600080fd5b81518015158114610cb057600080fdfea164736f6c634300080f000a", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101005760003560e01c80637eb1184511610097578063d1bc76a111610066578063d1bc76a114610229578063e30c39781461023c578063e4fc6b6d1461025a578063f2fde38b1461026257600080fd5b80637eb11845146101ee5780638da5cb5b146101f857806398f1312e14610216578063baee5ed41461022157600080fd5b8063457c3977116100d3578063457c3977146101965780634f02c420146101a9578063715018a6146101de57806379ba5097146101e657600080fd5b80631249c58b1461010557806321e5e2c41461010f57806328df3f18146101425780632efd46d61461014a575b600080fd5b61010d610275565b005b61012f61011d366004610c7a565b60036020526000908152604090205481565b6040519081526020015b60405180910390f35b61010d610557565b6101717f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610139565b61010d6101a4366004610c7a565b6105e1565b6001546101ce9074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610139565b61010d61068d565b61010d6106a1565b61012f620186a081565b60005473ffffffffffffffffffffffffffffffffffffffff16610171565b61012f633b9aca0081565b61010d610756565b610171610237366004610cb7565b610870565b60015473ffffffffffffffffffffffffffffffffffffffff16610171565b61010d6108a7565b61010d610270366004610c7a565b610aa3565b61027d610bc8565b60015474010000000000000000000000000000000000000000900460ff161561032d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4d696e744d616e616765723a20616c7265616479206d696e746564206f6e207460448201527f68697320636861696e000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561039a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103be9190610cd0565b6103c990600a610e44565b6103d790633b9aca00610e53565b90506000805b60025481101561046d576000600282815481106103fc576103fc610e90565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168083526003909152604082205490925090620186a061043f8388610e53565b6104499190610ebf565b90506104558186610efa565b9450505050808061046590610f12565b9150506103dd565b506040517f40c10f19000000000000000000000000000000000000000000000000000000008152306004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906340c10f1990604401600060405180830381600087803b1580156104fc57600080fd5b505af1158015610510573d6000803e3d6000fd5b5050600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905550505050565b61055f610bc8565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379ba50976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105c757600080fd5b505af11580156105db573d6000803e3d6000fd5b50505050565b6105e9610bc8565b6040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063f2fde38b90602401600060405180830381600087803b15801561067257600080fd5b505af1158015610686573d6000803e3d6000fd5b5050505050565b610695610bc8565b61069f6000610c49565b565b600154339073ffffffffffffffffffffffffffffffffffffffff16811461074a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610324565b61075381610c49565b50565b61075e610bc8565b60015474010000000000000000000000000000000000000000900460ff16610808576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4d696e744d616e616765723a206e6f74206d696e746564206265666f7265207260448201527f656e6f756e6365206f776e6572736869700000000000000000000000000000006064820152608401610324565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663715018a66040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105c757600080fd5b6002818154811061088057600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b6108af610bc8565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561091c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109409190610cd0565b61094b90600a610e44565b61095990633b9aca00610e53565b905060005b600254811015610a9f5760006002828154811061097d5761097d610e90565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168083526003909152604082205490925090620186a06109c08387610e53565b6109ca9190610ebf565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af1158015610a64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a889190610f4a565b505050508080610a9790610f12565b91505061095e565b5050565b610aab610bc8565b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009091168117909155610b0e60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461069f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610324565b600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905561075381610b53565b600060208284031215610c8c57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610cb057600080fd5b9392505050565b600060208284031215610cc957600080fd5b5035919050565b600060208284031215610ce257600080fd5b815160ff81168114610cb057600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b80851115610d7b57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610d6157610d61610cf3565b80851615610d6e57918102915b93841c9390800290610d27565b509250929050565b600082610d9257506001610e3e565b81610d9f57506000610e3e565b8160018114610db55760028114610dbf57610ddb565b6001915050610e3e565b60ff841115610dd057610dd0610cf3565b50506001821b610e3e565b5060208310610133831016604e8410600b8410161715610dfe575081810a610e3e565b610e088383610d22565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610e3a57610e3a610cf3565b0290505b92915050565b6000610cb060ff841683610d83565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610e8b57610e8b610cf3565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082610ef5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008219821115610f0d57610f0d610cf3565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610f4357610f43610cf3565b5060010190565b600060208284031215610f5c57600080fd5b81518015158114610cb057600080fdfea164736f6c634300080f000a", + "devdoc": {}, + "userdoc": {}, + "storageLayout": { + "storage": [ + { + "astId": 1524, + "contract": "contracts/governance/MintManager.sol:MintManager", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 1637, + "contract": "contracts/governance/MintManager.sol:MintManager", + "label": "_pendingOwner", + "offset": 0, + "slot": "1", + "type": "t_address" + }, + { + "astId": 240, + "contract": "contracts/governance/MintManager.sol:MintManager", + "label": "minted", + "offset": 20, + "slot": "1", + "type": "t_bool" + }, + { + "astId": 244, + "contract": "contracts/governance/MintManager.sol:MintManager", + "label": "recipients", + "offset": 0, + "slot": "2", + "type": "t_array(t_address)dyn_storage" + }, + { + "astId": 249, + "contract": "contracts/governance/MintManager.sol:MintManager", + "label": "shareOf", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_uint256)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_address)dyn_storage": { + "encoding": "dynamic_array", + "label": "address[]", + "numberOfBytes": "32", + "base": "t_address" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/kromaSepolia/solcInputs/1cc21f973aa4cfc73d832518987f54f8.json b/packages/contracts/deployments/kromaSepolia/solcInputs/1cc21f973aa4cfc73d832518987f54f8.json new file mode 100644 index 0000000000..2cc08a7522 --- /dev/null +++ b/packages/contracts/deployments/kromaSepolia/solcInputs/1cc21f973aa4cfc73d832518987f54f8.json @@ -0,0 +1,132 @@ +{ + "language": "Solidity", + "sources": { + "contracts/governance/GovernanceToken.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.15;\n\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\";\nimport \"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\";\n\nimport { KromaMintableERC20 } from \"../universal/KromaMintableERC20.sol\";\n\n/**\n * @custom:proxied\n * @title GovernanceToken\n * @notice The KRO token used in governance, supporting voting and delegation. Implements\n * EIP 2612 allowing signed approvals. `mint` function is only allowed to the owner or\n * `Bridge`, and the total supply amount is minted at once (TGE). `Bridge` has the\n * permission to `mint` and `burn`, for the purpose of bridging KRO to the remote chain.\n */\ncontract GovernanceToken is KromaMintableERC20, ERC20Votes, Ownable2StepUpgradeable {\n /**\n * @notice Constructs the GovernanceToken contract.\n *\n * @param _bridge Address of the StandardBridge contract on this network.\n * @param _remoteToken Address of the corresponding token on the remote chain.\n */\n constructor(\n address _bridge,\n address _remoteToken\n ) KromaMintableERC20(_bridge, _remoteToken, \"\", \"\") ERC20Permit(\"Kroma\") {\n _disableInitializers();\n }\n\n /**\n * @notice Initializer.\n *\n * @param _owner The owner of this contract.\n */\n function initialize(address _owner) public initializer {\n __Ownable2Step_init();\n transferOwnership(_owner);\n }\n\n /**\n * @notice Allows StandardBridge or the owner to mint tokens.\n *\n * @param _to Address to mint tokens to.\n * @param _amount Amount of tokens to mint.\n */\n function mint(address _to, uint256 _amount) external override {\n require(\n msg.sender == BRIDGE || msg.sender == owner(),\n \"GovernanceToken: only bridge or owner can mint\"\n );\n\n _mint(_to, _amount);\n }\n\n /**\n * @inheritdoc KromaMintableERC20\n */\n function burn(address _from, uint256 _amount) external override onlyBridge {\n _burn(_from, _amount);\n }\n\n /**\n * @inheritdoc ERC20\n */\n function name() public pure override returns (string memory) {\n return \"Kroma\";\n }\n\n /**\n * @inheritdoc ERC20\n */\n function symbol() public pure override returns (string memory) {\n return \"KRO\";\n }\n\n /**\n * @notice Callback called after a token transfer.\n *\n * @param from The account sending tokens.\n * @param to The account receiving tokens.\n * @param amount The amount of tokens being transferred.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20, ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n\n /**\n * @notice Internal mint function.\n *\n * @param account The account receiving minted tokens.\n * @param amount The amount of tokens to mint.\n */\n function _mint(address account, uint256 amount) internal override(ERC20, ERC20Votes) {\n super._mint(account, amount);\n emit Mint(account, amount);\n }\n\n /**\n * @notice Internal burn function.\n *\n * @param account The account that tokens will be burned from.\n * @param amount The amount of tokens that will be burned.\n */\n function _burn(address account, uint256 amount) internal override(ERC20, ERC20Votes) {\n super._burn(account, amount);\n emit Burn(account, amount);\n }\n\n /**\n * @notice Override function.\n */\n function _msgSender() internal view override(Context, ContextUpgradeable) returns (address) {\n return super._msgSender();\n }\n\n /**\n * @notice Override function.\n */\n function _msgData()\n internal\n view\n override(Context, ContextUpgradeable)\n returns (bytes calldata)\n {\n return super._msgData();\n }\n}\n" + }, + "contracts/universal/IKromaMintableERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport { IERC165 } from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\n/**\n * @title IKromaMintableERC20\n * @notice This interface is available on the KromaMintableERC20 contract. We declare it as a\n * separate interface so that it can be used in custom implementations of\n * KromaMintableERC20.\n */\ninterface IKromaMintableERC20 {\n function REMOTE_TOKEN() external view returns (address);\n\n function BRIDGE() external view returns (address);\n\n function mint(address _to, uint256 _amount) external;\n\n function burn(address _from, uint256 _amount) external;\n}\n" + }, + "contracts/universal/ISemver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title ISemver\n/// @notice ISemver is a simple contract for ensuring that contracts are\n/// versioned using semantic versioning.\ninterface ISemver {\n /// @notice Getter for the semantic version of the contract. This is not\n /// meant to be used onchain but instead meant to be used by offchain\n /// tooling.\n /// @return Semver contract version as a string.\n function version() external view returns (string memory);\n}\n" + }, + "contracts/universal/KromaMintableERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.15;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { IERC165 } from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\nimport { ISemver } from \"../universal/ISemver.sol\";\nimport { IKromaMintableERC20 } from \"./IKromaMintableERC20.sol\";\n\n/**\n * @title KromaMintableERC20\n * @notice KromaMintableERC20 is a standard extension of the base ERC20 token contract designed\n * to allow the StandardBridge contracts to mint and burn tokens. This makes it possible to\n * use a KromaMintableRC20 as the L2 representation of an L1 token, or vice-versa.\n * Designed to be backwards compatible with the older StandardL2ERC20 token which was only\n * meant for use on L2.\n */\ncontract KromaMintableERC20 is IKromaMintableERC20, ERC20, ISemver {\n /**\n * @notice Address of the corresponding version of this token on the remote chain.\n */\n address public immutable REMOTE_TOKEN;\n\n /**\n * @notice Address of the StandardBridge on this network.\n */\n address public immutable BRIDGE;\n\n /**\n * @notice Emitted whenever tokens are minted for an account.\n *\n * @param account Address of the account tokens are being minted for.\n * @param amount Amount of tokens minted.\n */\n event Mint(address indexed account, uint256 amount);\n\n /**\n * @notice Emitted whenever tokens are burned from an account.\n *\n * @param account Address of the account tokens are being burned from.\n * @param amount Amount of tokens burned.\n */\n event Burn(address indexed account, uint256 amount);\n\n /**\n * @notice A modifier that only allows the bridge to call\n */\n modifier onlyBridge() {\n require(msg.sender == BRIDGE, \"KromaMintableERC20: only bridge can mint and burn\");\n _;\n }\n\n /**\n * @notice Semantic version.\n * @custom:semver 1.0.0\n */\n string public constant version = \"1.0.0\";\n\n /**\n * @notice Constructs the KromaMintableERC20 contract.\n *\n * @param _bridge Address of the L2 standard bridge.\n * @param _remoteToken Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _bridge,\n address _remoteToken,\n string memory _name,\n string memory _symbol\n ) ERC20(_name, _symbol) {\n REMOTE_TOKEN = _remoteToken;\n BRIDGE = _bridge;\n }\n\n /**\n * @notice Allows the StandardBridge on this network to mint tokens.\n *\n * @param _to Address to mint tokens to.\n * @param _amount Amount of tokens to mint.\n */\n function mint(address _to, uint256 _amount)\n external\n virtual\n override(IKromaMintableERC20)\n onlyBridge\n {\n _mint(_to, _amount);\n emit Mint(_to, _amount);\n }\n\n /**\n * @notice Allows the StandardBridge on this network to burn tokens.\n *\n * @param _from Address to burn tokens from.\n * @param _amount Amount of tokens to burn.\n */\n function burn(address _from, uint256 _amount)\n external\n virtual\n override(IKromaMintableERC20)\n onlyBridge\n {\n _burn(_from, _amount);\n emit Burn(_from, _amount);\n }\n\n /**\n * @notice ERC165 interface check function.\n *\n * @param _interfaceId Interface ID to check.\n *\n * @return Whether or not the interface is supported by this contract.\n */\n function supportsInterface(bytes4 _interfaceId) external pure returns (bool) {\n bytes4 iface1 = type(IERC165).interfaceId;\n // Interface corresponding to the updated KromaMintableERC20 (this contract).\n bytes4 iface2 = type(IKromaMintableERC20).interfaceId;\n return _interfaceId == iface1 || _interfaceId == iface2;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (governance/utils/IVotes.sol)\npragma solidity ^0.8.0;\n\n/**\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\n *\n * _Available since v4.5._\n */\ninterface IVotes {\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Returns the current amount of votes that `account` has.\n */\n function getVotes(address account) external view returns (uint256);\n\n /**\n * @dev Returns the amount of votes that `account` had at a specific moment in the past. If the `clock()` is\n * configured to use block numbers, this will return the value at the end of the corresponding block.\n */\n function getPastVotes(address account, uint256 timepoint) external view returns (uint256);\n\n /**\n * @dev Returns the total supply of votes available at a specific moment in the past. If the `clock()` is\n * configured to use block numbers, this will return the value at the end of the corresponding block.\n *\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\n * vote.\n */\n function getPastTotalSupply(uint256 timepoint) external view returns (uint256);\n\n /**\n * @dev Returns the delegate that `account` has chosen.\n */\n function delegates(address account) external view returns (address);\n\n /**\n * @dev Delegates votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) external;\n\n /**\n * @dev Delegates votes from signer to `delegatee`.\n */\n function delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) external;\n}\n" + }, + "node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5267.sol)\n\npragma solidity ^0.8.0;\n\ninterface IERC5267 {\n /**\n * @dev MAY be emitted to signal that the domain could have changed.\n */\n event EIP712DomainChanged();\n\n /**\n * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712\n * signature.\n */\n function eip712Domain()\n external\n view\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n );\n}\n" + }, + "node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5805.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../governance/utils/IVotes.sol\";\nimport \"./IERC6372.sol\";\n\ninterface IERC5805 is IERC6372, IVotes {}\n" + }, + "node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC6372.sol)\n\npragma solidity ^0.8.0;\n\ninterface IERC6372 {\n /**\n * @dev Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting).\n */\n function clock() external view returns (uint48);\n\n /**\n * @dev Description of the clock\n */\n // solhint-disable-next-line func-name-mixedcase\n function CLOCK_MODE() external view returns (string memory);\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the default value returned by this function, unless\n * it's overridden.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(address from, address to, uint256 amount) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\n // decrementing then incrementing.\n _balances[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n unchecked {\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\n _balances[account] += amount;\n }\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n // Overflow not possible: amount <= accountBalance <= totalSupply.\n _totalSupply -= amount;\n }\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(address owner, address spender, uint256 amount) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20Permit.sol\";\nimport \"../ERC20.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\nimport \"../../../utils/cryptography/EIP712.sol\";\nimport \"../../../utils/Counters.sol\";\n\n/**\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * _Available since v3.4._\n */\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\n using Counters for Counters.Counter;\n\n mapping(address => Counters.Counter) private _nonces;\n\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private constant _PERMIT_TYPEHASH =\n keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n /**\n * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.\n * However, to ensure consistency with the upgradeable transpiler, we will continue\n * to reserve a slot.\n * @custom:oz-renamed-from _PERMIT_TYPEHASH\n */\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;\n\n /**\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n *\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\n */\n constructor(string memory name) EIP712(name, \"1\") {}\n\n /**\n * @dev See {IERC20Permit-permit}.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= deadline, \"ERC20Permit: expired deadline\");\n\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\n\n bytes32 hash = _hashTypedDataV4(structHash);\n\n address signer = ECDSA.recover(hash, v, r, s);\n require(signer == owner, \"ERC20Permit: invalid signature\");\n\n _approve(owner, spender, value);\n }\n\n /**\n * @dev See {IERC20Permit-nonces}.\n */\n function nonces(address owner) public view virtual override returns (uint256) {\n return _nonces[owner].current();\n }\n\n /**\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\n return _domainSeparatorV4();\n }\n\n /**\n * @dev \"Consume a nonce\": return the current value and increment.\n *\n * _Available since v4.1._\n */\n function _useNonce(address owner) internal virtual returns (uint256 current) {\n Counters.Counter storage nonce = _nonces[owner];\n current = nonce.current();\n nonce.increment();\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Votes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20Permit.sol\";\nimport \"../../../interfaces/IERC5805.sol\";\nimport \"../../../utils/math/Math.sol\";\nimport \"../../../utils/math/SafeCast.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is ERC20Permit, IERC5805 {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n /**\n * @dev Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting).\n */\n function clock() public view virtual override returns (uint48) {\n return SafeCast.toUint48(block.number);\n }\n\n /**\n * @dev Description of the clock\n */\n // solhint-disable-next-line func-name-mixedcase\n function CLOCK_MODE() public view virtual override returns (string memory) {\n // Check that the clock was not modified\n require(clock() == block.number, \"ERC20Votes: broken clock mode\");\n return \"mode=blocknumber&from=default\";\n }\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual override returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view virtual override returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n unchecked {\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `timepoint`.\n *\n * Requirements:\n *\n * - `timepoint` must be in the past\n */\n function getPastVotes(address account, uint256 timepoint) public view virtual override returns (uint256) {\n require(timepoint < clock(), \"ERC20Votes: future lookup\");\n return _checkpointsLookup(_checkpoints[account], timepoint);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `timepoint`. Note, this value is the sum of all balances.\n * It is NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `timepoint` must be in the past\n */\n function getPastTotalSupply(uint256 timepoint) public view virtual override returns (uint256) {\n require(timepoint < clock(), \"ERC20Votes: future lookup\");\n return _checkpointsLookup(_totalSupplyCheckpoints, timepoint);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 timepoint) private view returns (uint256) {\n // We run a binary search to look for the last (most recent) checkpoint taken before (or at) `timepoint`.\n //\n // Initially we check if the block is recent to narrow the search range.\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `timepoint`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `timepoint`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `timepoint`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `timepoint`, but it works out\n // the same.\n uint256 length = ckpts.length;\n\n uint256 low = 0;\n uint256 high = length;\n\n if (length > 5) {\n uint256 mid = length - Math.sqrt(length);\n if (_unsafeAccess(ckpts, mid).fromBlock > timepoint) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (_unsafeAccess(ckpts, mid).fromBlock > timepoint) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n unchecked {\n return high == 0 ? 0 : _unsafeAccess(ckpts, high - 1).votes;\n }\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual override {\n _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {IVotes-DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {IVotes-DelegateChanged} and {IVotes-DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(address src, address dst, uint256 amount) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n\n unchecked {\n Checkpoint memory oldCkpt = pos == 0 ? Checkpoint(0, 0) : _unsafeAccess(ckpts, pos - 1);\n\n oldWeight = oldCkpt.votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && oldCkpt.fromBlock == clock()) {\n _unsafeAccess(ckpts, pos - 1).votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(clock()), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n\n /**\n * @dev Access an element of the array without performing bounds check. The position is assumed to be within bounds.\n */\n function _unsafeAccess(Checkpoint[] storage ckpts, uint256 pos) private pure returns (Checkpoint storage result) {\n assembly {\n mstore(0, ckpts.slot)\n result.slot := add(keccak256(0, 0x20), pos)\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/Counters.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/ShortStrings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/ShortStrings.sol)\n\npragma solidity ^0.8.8;\n\nimport \"./StorageSlot.sol\";\n\n// | string | 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |\n// | length | 0x BB |\ntype ShortString is bytes32;\n\n/**\n * @dev This library provides functions to convert short memory strings\n * into a `ShortString` type that can be used as an immutable variable.\n *\n * Strings of arbitrary length can be optimized using this library if\n * they are short enough (up to 31 bytes) by packing them with their\n * length (1 byte) in a single EVM word (32 bytes). Additionally, a\n * fallback mechanism can be used for every other case.\n *\n * Usage example:\n *\n * ```solidity\n * contract Named {\n * using ShortStrings for *;\n *\n * ShortString private immutable _name;\n * string private _nameFallback;\n *\n * constructor(string memory contractName) {\n * _name = contractName.toShortStringWithFallback(_nameFallback);\n * }\n *\n * function name() external view returns (string memory) {\n * return _name.toStringWithFallback(_nameFallback);\n * }\n * }\n * ```\n */\nlibrary ShortStrings {\n // Used as an identifier for strings longer than 31 bytes.\n bytes32 private constant _FALLBACK_SENTINEL = 0x00000000000000000000000000000000000000000000000000000000000000FF;\n\n error StringTooLong(string str);\n error InvalidShortString();\n\n /**\n * @dev Encode a string of at most 31 chars into a `ShortString`.\n *\n * This will trigger a `StringTooLong` error is the input string is too long.\n */\n function toShortString(string memory str) internal pure returns (ShortString) {\n bytes memory bstr = bytes(str);\n if (bstr.length > 31) {\n revert StringTooLong(str);\n }\n return ShortString.wrap(bytes32(uint256(bytes32(bstr)) | bstr.length));\n }\n\n /**\n * @dev Decode a `ShortString` back to a \"normal\" string.\n */\n function toString(ShortString sstr) internal pure returns (string memory) {\n uint256 len = byteLength(sstr);\n // using `new string(len)` would work locally but is not memory safe.\n string memory str = new string(32);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(str, len)\n mstore(add(str, 0x20), sstr)\n }\n return str;\n }\n\n /**\n * @dev Return the length of a `ShortString`.\n */\n function byteLength(ShortString sstr) internal pure returns (uint256) {\n uint256 result = uint256(ShortString.unwrap(sstr)) & 0xFF;\n if (result > 31) {\n revert InvalidShortString();\n }\n return result;\n }\n\n /**\n * @dev Encode a string into a `ShortString`, or write it to storage if it is too long.\n */\n function toShortStringWithFallback(string memory value, string storage store) internal returns (ShortString) {\n if (bytes(value).length < 32) {\n return toShortString(value);\n } else {\n StorageSlot.getStringSlot(store).value = value;\n return ShortString.wrap(_FALLBACK_SENTINEL);\n }\n }\n\n /**\n * @dev Decode a string that was encoded to `ShortString` or written to storage using {setWithFallback}.\n */\n function toStringWithFallback(ShortString value, string storage store) internal pure returns (string memory) {\n if (ShortString.unwrap(value) != _FALLBACK_SENTINEL) {\n return toString(value);\n } else {\n return store;\n }\n }\n\n /**\n * @dev Return the length of a string that was encoded to `ShortString` or written to storage using {setWithFallback}.\n *\n * WARNING: This will return the \"byte length\" of the string. This may not reflect the actual length in terms of\n * actual characters as the UTF-8 encoding of a single character can span over multiple bytes.\n */\n function byteLengthWithFallback(ShortString value, string storage store) internal view returns (uint256) {\n if (ShortString.unwrap(value) != _FALLBACK_SENTINEL) {\n return byteLength(value);\n } else {\n return bytes(store).length;\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/StorageSlot.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n *\n * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._\n * _Available since v4.9 for `string`, `bytes`._\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n struct StringSlot {\n string value;\n }\n\n struct BytesSlot {\n bytes value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` with member `value` located at `slot`.\n */\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n */\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := store.slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` with member `value` located at `slot`.\n */\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n */\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := store.slot\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/Strings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toString(int256 value) internal pure returns (string memory) {\n return string(abi.encodePacked(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value))));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return keccak256(bytes(a)) == keccak256(bytes(b));\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.sol\";\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV // Deprecated in v4.8\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n /// @solidity memory-safe-assembly\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, \"\\x19Ethereum Signed Message:\\n32\")\n mstore(0x1c, hash)\n message := keccak256(0x00, 0x3c)\n }\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from `s`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n\", Strings.toString(s.length), s));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) {\n /// @solidity memory-safe-assembly\n assembly {\n let ptr := mload(0x40)\n mstore(ptr, \"\\x19\\x01\")\n mstore(add(ptr, 0x02), domainSeparator)\n mstore(add(ptr, 0x22), structHash)\n data := keccak256(ptr, 0x42)\n }\n }\n\n /**\n * @dev Returns an Ethereum Signed Data with intended validator, created from a\n * `validator` and `data` according to the version 0 of EIP-191.\n *\n * See {recover}.\n */\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x00\", validator, data));\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.8;\n\nimport \"./ECDSA.sol\";\nimport \"../ShortStrings.sol\";\nimport \"../../interfaces/IERC5267.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain\n * separator of the implementation contract. This will cause the `_domainSeparatorV4` function to always rebuild the\n * separator from the immutable values, which is cheaper than accessing a cached version in cold storage.\n *\n * _Available since v3.4._\n *\n * @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\n */\nabstract contract EIP712 is IERC5267 {\n using ShortStrings for *;\n\n bytes32 private constant _TYPE_HASH =\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\");\n\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _cachedDomainSeparator;\n uint256 private immutable _cachedChainId;\n address private immutable _cachedThis;\n\n bytes32 private immutable _hashedName;\n bytes32 private immutable _hashedVersion;\n\n ShortString private immutable _name;\n ShortString private immutable _version;\n string private _nameFallback;\n string private _versionFallback;\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n _name = name.toShortStringWithFallback(_nameFallback);\n _version = version.toShortStringWithFallback(_versionFallback);\n _hashedName = keccak256(bytes(name));\n _hashedVersion = keccak256(bytes(version));\n\n _cachedChainId = block.chainid;\n _cachedDomainSeparator = _buildDomainSeparator();\n _cachedThis = address(this);\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _cachedThis && block.chainid == _cachedChainId) {\n return _cachedDomainSeparator;\n } else {\n return _buildDomainSeparator();\n }\n }\n\n function _buildDomainSeparator() private view returns (bytes32) {\n return keccak256(abi.encode(_TYPE_HASH, _hashedName, _hashedVersion, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n\n /**\n * @dev See {EIP-5267}.\n *\n * _Available since v4.9._\n */\n function eip712Domain()\n public\n view\n virtual\n override\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n )\n {\n return (\n hex\"0f\", // 01111\n _name.toStringWithFallback(_nameFallback),\n _version.toStringWithFallback(_versionFallback),\n block.chainid,\n address(this),\n bytes32(0),\n new uint256[](0)\n );\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1, \"Math: mulDiv overflow\");\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10 ** 64) {\n value /= 10 ** 64;\n result += 64;\n }\n if (value >= 10 ** 32) {\n value /= 10 ** 32;\n result += 32;\n }\n if (value >= 10 ** 16) {\n value /= 10 ** 16;\n result += 16;\n }\n if (value >= 10 ** 8) {\n value /= 10 ** 8;\n result += 8;\n }\n if (value >= 10 ** 4) {\n value /= 10 ** 4;\n result += 4;\n }\n if (value >= 10 ** 2) {\n value /= 10 ** 2;\n result += 2;\n }\n if (value >= 10 ** 1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SafeCast.sol)\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n require(value <= type(uint248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n require(value <= type(uint240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n require(value <= type(uint232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.2._\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n require(value <= type(uint216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n require(value <= type(uint208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n require(value <= type(uint200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n require(value <= type(uint192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n require(value <= type(uint184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n require(value <= type(uint176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n require(value <= type(uint168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n require(value <= type(uint160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n require(value <= type(uint152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n require(value <= type(uint144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n require(value <= type(uint136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v2.5._\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n require(value <= type(uint120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n require(value <= type(uint112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n require(value <= type(uint104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.2._\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n require(value <= type(uint88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n require(value <= type(uint80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n require(value <= type(uint72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v2.5._\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n require(value <= type(uint56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n require(value <= type(uint48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n require(value <= type(uint40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v2.5._\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n require(value <= type(uint24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v2.5._\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v2.5._\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n *\n * _Available since v3.0._\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toInt248(int256 value) internal pure returns (int248 downcasted) {\n downcasted = int248(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 248 bits\");\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toInt240(int256 value) internal pure returns (int240 downcasted) {\n downcasted = int240(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 240 bits\");\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toInt232(int256 value) internal pure returns (int232 downcasted) {\n downcasted = int232(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 232 bits\");\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.7._\n */\n function toInt224(int256 value) internal pure returns (int224 downcasted) {\n downcasted = int224(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 224 bits\");\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toInt216(int256 value) internal pure returns (int216 downcasted) {\n downcasted = int216(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 216 bits\");\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toInt208(int256 value) internal pure returns (int208 downcasted) {\n downcasted = int208(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 208 bits\");\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toInt200(int256 value) internal pure returns (int200 downcasted) {\n downcasted = int200(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 200 bits\");\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toInt192(int256 value) internal pure returns (int192 downcasted) {\n downcasted = int192(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 192 bits\");\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toInt184(int256 value) internal pure returns (int184 downcasted) {\n downcasted = int184(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 184 bits\");\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toInt176(int256 value) internal pure returns (int176 downcasted) {\n downcasted = int176(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 176 bits\");\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toInt168(int256 value) internal pure returns (int168 downcasted) {\n downcasted = int168(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 168 bits\");\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toInt160(int256 value) internal pure returns (int160 downcasted) {\n downcasted = int160(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 160 bits\");\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toInt152(int256 value) internal pure returns (int152 downcasted) {\n downcasted = int152(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 152 bits\");\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toInt144(int256 value) internal pure returns (int144 downcasted) {\n downcasted = int144(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 144 bits\");\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toInt136(int256 value) internal pure returns (int136 downcasted) {\n downcasted = int136(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 136 bits\");\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128 downcasted) {\n downcasted = int128(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 128 bits\");\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toInt120(int256 value) internal pure returns (int120 downcasted) {\n downcasted = int120(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 120 bits\");\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toInt112(int256 value) internal pure returns (int112 downcasted) {\n downcasted = int112(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 112 bits\");\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toInt104(int256 value) internal pure returns (int104 downcasted) {\n downcasted = int104(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 104 bits\");\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.7._\n */\n function toInt96(int256 value) internal pure returns (int96 downcasted) {\n downcasted = int96(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 96 bits\");\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toInt88(int256 value) internal pure returns (int88 downcasted) {\n downcasted = int88(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 88 bits\");\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toInt80(int256 value) internal pure returns (int80 downcasted) {\n downcasted = int80(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 80 bits\");\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toInt72(int256 value) internal pure returns (int72 downcasted) {\n downcasted = int72(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 72 bits\");\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64 downcasted) {\n downcasted = int64(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 64 bits\");\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toInt56(int256 value) internal pure returns (int56 downcasted) {\n downcasted = int56(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 56 bits\");\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toInt48(int256 value) internal pure returns (int48 downcasted) {\n downcasted = int48(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 48 bits\");\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toInt40(int256 value) internal pure returns (int40 downcasted) {\n downcasted = int40(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 40 bits\");\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32 downcasted) {\n downcasted = int32(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 32 bits\");\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toInt24(int256 value) internal pure returns (int24 downcasted) {\n downcasted = int24(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 24 bits\");\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16 downcasted) {\n downcasted = int16(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 16 bits\");\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8 downcasted) {\n downcasted = int8(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 8 bits\");\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n *\n * _Available since v3.0._\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n /**\n * @dev Returns the largest of two signed numbers.\n */\n function max(int256 a, int256 b) internal pure returns (int256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two signed numbers.\n */\n function min(int256 a, int256 b) internal pure returns (int256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two signed numbers without overflow.\n * The result is rounded towards zero.\n */\n function average(int256 a, int256 b) internal pure returns (int256) {\n // Formula from the book \"Hacker's Delight\"\n int256 x = (a & b) + ((a ^ b) >> 1);\n return x + (int256(uint256(x) >> 255) & (a ^ b));\n }\n\n /**\n * @dev Returns the absolute unsigned value of a signed value.\n */\n function abs(int256 n) internal pure returns (uint256) {\n unchecked {\n // must be unchecked in order to support `n = type(int256).min`\n return uint256(n >= 0 ? n : -n);\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./OwnableUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership} and {acceptOwnership}.\n *\n * This module is used through inheritance. It will make available all functions\n * from parent (Ownable).\n */\nabstract contract Ownable2StepUpgradeable is Initializable, OwnableUpgradeable {\n function __Ownable2Step_init() internal onlyInitializing {\n __Ownable_init_unchained();\n }\n\n function __Ownable2Step_init_unchained() internal onlyInitializing {\n }\n address private _pendingOwner;\n\n event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Returns the address of the pending owner.\n */\n function pendingOwner() public view virtual returns (address) {\n return _pendingOwner;\n }\n\n /**\n * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual override onlyOwner {\n _pendingOwner = newOwner;\n emit OwnershipTransferStarted(owner(), newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual override {\n delete _pendingOwner;\n super._transferOwnership(newOwner);\n }\n\n /**\n * @dev The new owner accepts the ownership transfer.\n */\n function acceptOwnership() public virtual {\n address sender = _msgSender();\n require(pendingOwner() == sender, \"Ownable2Step: caller is not the new owner\");\n _transferOwnership(sender);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n function __Ownable_init() internal onlyInitializing {\n __Ownable_init_unchained();\n }\n\n function __Ownable_init_unchained() internal onlyInitializing {\n _transferOwnership(_msgSender());\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n * @custom:oz-retyped-from bool\n */\n uint8 private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint8 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts.\n *\n * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\n * constructor.\n *\n * Emits an {Initialized} event.\n */\n modifier initializer() {\n bool isTopLevelCall = !_initializing;\n require(\n (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\n \"Initializable: contract is already initialized\"\n );\n _initialized = 1;\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n * are added through upgrades and that require initialization.\n *\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n * cannot be nested. If one is invoked in the context of another, execution will revert.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n *\n * WARNING: setting the version to 255 will prevent any future reinitialization.\n *\n * Emits an {Initialized} event.\n */\n modifier reinitializer(uint8 version) {\n require(!_initializing && _initialized < version, \"Initializable: contract is already initialized\");\n _initialized = version;\n _initializing = true;\n _;\n _initializing = false;\n emit Initialized(version);\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n require(_initializing, \"Initializable: contract is not initializing\");\n _;\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n *\n * Emits an {Initialized} event the first time it is successfully executed.\n */\n function _disableInitializers() internal virtual {\n require(!_initializing, \"Initializable: contract is initializing\");\n if (_initialized != type(uint8).max) {\n _initialized = type(uint8).max;\n emit Initialized(type(uint8).max);\n }\n }\n\n /**\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\n */\n function _getInitializedVersion() internal view returns (uint8) {\n return _initialized;\n }\n\n /**\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n */\n function _isInitializing() internal view returns (bool) {\n return _initializing;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n *\n * Furthermore, `isContract` will also return true if the target contract within\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n * which only has an effect at the end of a transaction.\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal onlyInitializing {\n }\n\n function __Context_init_unchained() internal onlyInitializing {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[50] private __gap;\n}\n" + } + }, + "settings": { + "remappings": [ + "@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/", + "@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/", + "@rari-capital/solmate/=node_modules/@rari-capital/solmate/", + "forge-std/=node_modules/forge-std/src/", + "ds-test/=node_modules/ds-test/src/", + "hardhat-deploy/=node_modules/hardhat-deploy/", + "hardhat/=node_modules/hardhat/" + ], + "optimizer": { + "enabled": true, + "runs": 10000 + }, + "metadata": { + "useLiteralContent": false, + "bytecodeHash": "none" + }, + "outputSelection": { + "*": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + } + }, + "evmVersion": "london", + "viaIR": false, + "libraries": {} + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/kromaSepolia/solcInputs/37a0cebac478897ae0c20446c8a2494a.json b/packages/contracts/deployments/kromaSepolia/solcInputs/37a0cebac478897ae0c20446c8a2494a.json new file mode 100644 index 0000000000..2469337c2c --- /dev/null +++ b/packages/contracts/deployments/kromaSepolia/solcInputs/37a0cebac478897ae0c20446c8a2494a.json @@ -0,0 +1,141 @@ +{ + "language": "Solidity", + "sources": { + "contracts/governance/GovernanceToken.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.15;\n\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\";\nimport \"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\";\n\nimport { KromaMintableERC20 } from \"../universal/KromaMintableERC20.sol\";\n\n/**\n * @custom:proxied\n * @title GovernanceToken\n * @notice The KRO token used in governance, supporting voting and delegation. Implements\n * EIP 2612 allowing signed approvals. `mint` function is only allowed to the owner or\n * `Bridge`, and the total supply amount is minted at once (TGE). `Bridge` has the\n * permission to `mint` and `burn`, for the purpose of bridging KRO to the remote chain.\n */\ncontract GovernanceToken is KromaMintableERC20, ERC20Votes, Ownable2StepUpgradeable {\n /**\n * @notice Constructs the GovernanceToken contract.\n *\n * @param _bridge Address of the StandardBridge contract on this network.\n * @param _remoteToken Address of the corresponding token on the remote chain.\n */\n constructor(\n address _bridge,\n address _remoteToken\n ) KromaMintableERC20(_bridge, _remoteToken, \"\", \"\") ERC20Permit(\"Kroma\") {\n _disableInitializers();\n }\n\n /**\n * @notice Initializer.\n *\n * @param _owner The owner of this contract.\n */\n function initialize(address _owner) public initializer {\n __Ownable2Step_init();\n transferOwnership(_owner);\n }\n\n /**\n * @notice Allows StandardBridge or the owner to mint tokens.\n *\n * @param _to Address to mint tokens to.\n * @param _amount Amount of tokens to mint.\n */\n function mint(address _to, uint256 _amount) external override {\n require(\n msg.sender == BRIDGE || msg.sender == owner(),\n \"GovernanceToken: only bridge or owner can mint\"\n );\n\n _mint(_to, _amount);\n }\n\n /**\n * @inheritdoc KromaMintableERC20\n */\n function burn(address _from, uint256 _amount) external override onlyBridge {\n _burn(_from, _amount);\n }\n\n /**\n * @inheritdoc ERC20\n */\n function name() public pure override returns (string memory) {\n return \"Kroma\";\n }\n\n /**\n * @inheritdoc ERC20\n */\n function symbol() public pure override returns (string memory) {\n return \"KRO\";\n }\n\n /**\n * @notice Callback called after a token transfer.\n *\n * @param from The account sending tokens.\n * @param to The account receiving tokens.\n * @param amount The amount of tokens being transferred.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20, ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n\n /**\n * @notice Internal mint function.\n *\n * @param account The account receiving minted tokens.\n * @param amount The amount of tokens to mint.\n */\n function _mint(address account, uint256 amount) internal override(ERC20, ERC20Votes) {\n super._mint(account, amount);\n emit Mint(account, amount);\n }\n\n /**\n * @notice Internal burn function.\n *\n * @param account The account that tokens will be burned from.\n * @param amount The amount of tokens that will be burned.\n */\n function _burn(address account, uint256 amount) internal override(ERC20, ERC20Votes) {\n super._burn(account, amount);\n emit Burn(account, amount);\n }\n\n /**\n * @notice Override function.\n */\n function _msgSender() internal view override(Context, ContextUpgradeable) returns (address) {\n return super._msgSender();\n }\n\n /**\n * @notice Override function.\n */\n function _msgData()\n internal\n view\n override(Context, ContextUpgradeable)\n returns (bytes calldata)\n {\n return super._msgData();\n }\n}\n" + }, + "contracts/governance/MintManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.15;\n\nimport { Ownable2Step } from \"@openzeppelin/contracts/access/Ownable2Step.sol\";\n\nimport { GovernanceToken } from \"./GovernanceToken.sol\";\n\n/**\n * @title MintManager\n * @notice MintManager issues mint cap amount of GovernanceToken at once (TGE) and distributes the\n * tokens to specified recipients.\n */\ncontract MintManager is Ownable2Step {\n /**\n * @notice The amount of tokens that can be minted.\n */\n uint256 public constant MINT_CAP = 1_000_000_000;\n\n /**\n * @notice The denominator of each recipient's share.\n */\n uint256 public constant SHARE_DENOMINATOR = 10 ** 5;\n\n /**\n * @notice The GovernanceToken that the MintManager can mint.\n */\n GovernanceToken public immutable GOVERNANCE_TOKEN;\n\n /**\n * @notice True when already minted on this chain. MintManager can mint only once on each chain.\n */\n bool public minted;\n\n /**\n * @notice A list of recipient addresses that will receive tokens to be distributed.\n */\n address[] public recipients;\n\n /**\n * @notice A mapping of the recipient's address to share.\n */\n mapping(address => uint256) public shareOf;\n\n /**\n * @notice Constructs the MintManager contract.\n *\n * @param _governanceToken The GovernanceToken this contract can mint tokens of.\n * @param _owner The owner of this contract.\n * @param _recipients List of the recipients.\n * @param _shares List of token distribution ratios for each recipient.\n */\n constructor(\n address _governanceToken,\n address _owner,\n address[] memory _recipients,\n uint256[] memory _shares\n ) {\n GOVERNANCE_TOKEN = GovernanceToken(_governanceToken);\n\n transferOwnership(_owner);\n\n require(_recipients.length == _shares.length, \"MintManager: invalid length of array\");\n\n uint256 totalShares = 0;\n for (uint256 i = 0; i < _recipients.length; i++) {\n address recipient = _recipients[i];\n require(recipient != address(0), \"MintManager: recipient address cannot be 0\");\n\n uint256 share = _shares[i];\n require(share != 0, \"MintManager: share cannot be 0\");\n\n if (shareOf[recipient] == 0) {\n recipients.push(recipient);\n }\n shareOf[recipient] += share;\n totalShares += share;\n }\n\n require(\n totalShares <= SHARE_DENOMINATOR,\n \"MintManager: max total share is equal or less than SHARE_DENOMINATOR\"\n );\n }\n\n /**\n * @notice Only the owner is allowed to mint mint cap amount of the GovernanceToken at once.\n */\n function mint() external onlyOwner {\n require(!minted, \"MintManager: already minted on this chain\");\n\n uint256 mintCap = MINT_CAP * 10 ** GOVERNANCE_TOKEN.decimals();\n\n uint256 totalAmount;\n for (uint256 i = 0; i < recipients.length; i++) {\n address recipient = recipients[i];\n uint256 share = shareOf[recipient];\n uint256 amount = (mintCap * share) / SHARE_DENOMINATOR;\n totalAmount += amount;\n }\n\n GOVERNANCE_TOKEN.mint(address(this), totalAmount);\n\n minted = true;\n }\n\n /**\n * @notice Only the owner is allowed to distribute the GovernanceToken to specified recipients.\n */\n function distribute() external onlyOwner {\n uint256 mintCap = MINT_CAP * 10 ** GOVERNANCE_TOKEN.decimals();\n\n for (uint256 i = 0; i < recipients.length; i++) {\n address recipient = recipients[i];\n uint256 share = shareOf[recipient];\n uint256 amount = (mintCap * share) / SHARE_DENOMINATOR;\n GOVERNANCE_TOKEN.transfer(recipient, amount);\n }\n }\n\n /**\n * @notice Only the owner is allowed to renounce the ownership of the GovernanceToken.\n */\n function renounceOwnershipOfToken() external onlyOwner {\n require(minted, \"MintManager: not minted before renounce ownership\");\n\n GOVERNANCE_TOKEN.renounceOwnership();\n }\n\n /**\n * @notice Only the owner is allowed to transfer the ownership of the GovernanceToken.\n *\n * @param newMintManager The new MintManager to own the GovernanceToken.\n */\n function transferOwnershipOfToken(address newMintManager) external onlyOwner {\n GOVERNANCE_TOKEN.transferOwnership(newMintManager);\n }\n\n /**\n * @notice Only the owner is allowed to accept the ownership of the GovernanceToken.\n */\n function acceptOwnershipOfToken() external onlyOwner {\n GOVERNANCE_TOKEN.acceptOwnership();\n }\n}\n" + }, + "contracts/universal/IKromaMintableERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport { IERC165 } from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\n/**\n * @title IKromaMintableERC20\n * @notice This interface is available on the KromaMintableERC20 contract. We declare it as a\n * separate interface so that it can be used in custom implementations of\n * KromaMintableERC20.\n */\ninterface IKromaMintableERC20 {\n function REMOTE_TOKEN() external view returns (address);\n\n function BRIDGE() external view returns (address);\n\n function mint(address _to, uint256 _amount) external;\n\n function burn(address _from, uint256 _amount) external;\n}\n" + }, + "contracts/universal/ISemver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title ISemver\n/// @notice ISemver is a simple contract for ensuring that contracts are\n/// versioned using semantic versioning.\ninterface ISemver {\n /// @notice Getter for the semantic version of the contract. This is not\n /// meant to be used onchain but instead meant to be used by offchain\n /// tooling.\n /// @return Semver contract version as a string.\n function version() external view returns (string memory);\n}\n" + }, + "contracts/universal/KromaMintableERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.15;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { IERC165 } from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\nimport { ISemver } from \"../universal/ISemver.sol\";\nimport { IKromaMintableERC20 } from \"./IKromaMintableERC20.sol\";\n\n/**\n * @title KromaMintableERC20\n * @notice KromaMintableERC20 is a standard extension of the base ERC20 token contract designed\n * to allow the StandardBridge contracts to mint and burn tokens. This makes it possible to\n * use a KromaMintableRC20 as the L2 representation of an L1 token, or vice-versa.\n * Designed to be backwards compatible with the older StandardL2ERC20 token which was only\n * meant for use on L2.\n */\ncontract KromaMintableERC20 is IKromaMintableERC20, ERC20, ISemver {\n /**\n * @notice Address of the corresponding version of this token on the remote chain.\n */\n address public immutable REMOTE_TOKEN;\n\n /**\n * @notice Address of the StandardBridge on this network.\n */\n address public immutable BRIDGE;\n\n /**\n * @notice Emitted whenever tokens are minted for an account.\n *\n * @param account Address of the account tokens are being minted for.\n * @param amount Amount of tokens minted.\n */\n event Mint(address indexed account, uint256 amount);\n\n /**\n * @notice Emitted whenever tokens are burned from an account.\n *\n * @param account Address of the account tokens are being burned from.\n * @param amount Amount of tokens burned.\n */\n event Burn(address indexed account, uint256 amount);\n\n /**\n * @notice A modifier that only allows the bridge to call\n */\n modifier onlyBridge() {\n require(msg.sender == BRIDGE, \"KromaMintableERC20: only bridge can mint and burn\");\n _;\n }\n\n /**\n * @notice Semantic version.\n * @custom:semver 1.0.0\n */\n string public constant version = \"1.0.0\";\n\n /**\n * @notice Constructs the KromaMintableERC20 contract.\n *\n * @param _bridge Address of the L2 standard bridge.\n * @param _remoteToken Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _bridge,\n address _remoteToken,\n string memory _name,\n string memory _symbol\n ) ERC20(_name, _symbol) {\n REMOTE_TOKEN = _remoteToken;\n BRIDGE = _bridge;\n }\n\n /**\n * @notice Allows the StandardBridge on this network to mint tokens.\n *\n * @param _to Address to mint tokens to.\n * @param _amount Amount of tokens to mint.\n */\n function mint(address _to, uint256 _amount)\n external\n virtual\n override(IKromaMintableERC20)\n onlyBridge\n {\n _mint(_to, _amount);\n emit Mint(_to, _amount);\n }\n\n /**\n * @notice Allows the StandardBridge on this network to burn tokens.\n *\n * @param _from Address to burn tokens from.\n * @param _amount Amount of tokens to burn.\n */\n function burn(address _from, uint256 _amount)\n external\n virtual\n override(IKromaMintableERC20)\n onlyBridge\n {\n _burn(_from, _amount);\n emit Burn(_from, _amount);\n }\n\n /**\n * @notice ERC165 interface check function.\n *\n * @param _interfaceId Interface ID to check.\n *\n * @return Whether or not the interface is supported by this contract.\n */\n function supportsInterface(bytes4 _interfaceId) external pure returns (bool) {\n bytes4 iface1 = type(IERC165).interfaceId;\n // Interface corresponding to the updated KromaMintableERC20 (this contract).\n bytes4 iface2 = type(IKromaMintableERC20).interfaceId;\n return _interfaceId == iface1 || _interfaceId == iface2;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/access/Ownable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _transferOwnership(_msgSender());\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/access/Ownable2Step.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./Ownable.sol\";\n\n/**\n * @dev Contract module which provides access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership} and {acceptOwnership}.\n *\n * This module is used through inheritance. It will make available all functions\n * from parent (Ownable).\n */\nabstract contract Ownable2Step is Ownable {\n address private _pendingOwner;\n\n event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Returns the address of the pending owner.\n */\n function pendingOwner() public view virtual returns (address) {\n return _pendingOwner;\n }\n\n /**\n * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual override onlyOwner {\n _pendingOwner = newOwner;\n emit OwnershipTransferStarted(owner(), newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual override {\n delete _pendingOwner;\n super._transferOwnership(newOwner);\n }\n\n /**\n * @dev The new owner accepts the ownership transfer.\n */\n function acceptOwnership() public virtual {\n address sender = _msgSender();\n require(pendingOwner() == sender, \"Ownable2Step: caller is not the new owner\");\n _transferOwnership(sender);\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (governance/utils/IVotes.sol)\npragma solidity ^0.8.0;\n\n/**\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\n *\n * _Available since v4.5._\n */\ninterface IVotes {\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Returns the current amount of votes that `account` has.\n */\n function getVotes(address account) external view returns (uint256);\n\n /**\n * @dev Returns the amount of votes that `account` had at a specific moment in the past. If the `clock()` is\n * configured to use block numbers, this will return the value at the end of the corresponding block.\n */\n function getPastVotes(address account, uint256 timepoint) external view returns (uint256);\n\n /**\n * @dev Returns the total supply of votes available at a specific moment in the past. If the `clock()` is\n * configured to use block numbers, this will return the value at the end of the corresponding block.\n *\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\n * vote.\n */\n function getPastTotalSupply(uint256 timepoint) external view returns (uint256);\n\n /**\n * @dev Returns the delegate that `account` has chosen.\n */\n function delegates(address account) external view returns (address);\n\n /**\n * @dev Delegates votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) external;\n\n /**\n * @dev Delegates votes from signer to `delegatee`.\n */\n function delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) external;\n}\n" + }, + "node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5267.sol)\n\npragma solidity ^0.8.0;\n\ninterface IERC5267 {\n /**\n * @dev MAY be emitted to signal that the domain could have changed.\n */\n event EIP712DomainChanged();\n\n /**\n * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712\n * signature.\n */\n function eip712Domain()\n external\n view\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n );\n}\n" + }, + "node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5805.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../governance/utils/IVotes.sol\";\nimport \"./IERC6372.sol\";\n\ninterface IERC5805 is IERC6372, IVotes {}\n" + }, + "node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC6372.sol)\n\npragma solidity ^0.8.0;\n\ninterface IERC6372 {\n /**\n * @dev Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting).\n */\n function clock() external view returns (uint48);\n\n /**\n * @dev Description of the clock\n */\n // solhint-disable-next-line func-name-mixedcase\n function CLOCK_MODE() external view returns (string memory);\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the default value returned by this function, unless\n * it's overridden.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(address from, address to, uint256 amount) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\n // decrementing then incrementing.\n _balances[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n unchecked {\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\n _balances[account] += amount;\n }\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n // Overflow not possible: amount <= accountBalance <= totalSupply.\n _totalSupply -= amount;\n }\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(address owner, address spender, uint256 amount) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20Permit.sol\";\nimport \"../ERC20.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\nimport \"../../../utils/cryptography/EIP712.sol\";\nimport \"../../../utils/Counters.sol\";\n\n/**\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * _Available since v3.4._\n */\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\n using Counters for Counters.Counter;\n\n mapping(address => Counters.Counter) private _nonces;\n\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private constant _PERMIT_TYPEHASH =\n keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n /**\n * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.\n * However, to ensure consistency with the upgradeable transpiler, we will continue\n * to reserve a slot.\n * @custom:oz-renamed-from _PERMIT_TYPEHASH\n */\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;\n\n /**\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n *\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\n */\n constructor(string memory name) EIP712(name, \"1\") {}\n\n /**\n * @dev See {IERC20Permit-permit}.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= deadline, \"ERC20Permit: expired deadline\");\n\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\n\n bytes32 hash = _hashTypedDataV4(structHash);\n\n address signer = ECDSA.recover(hash, v, r, s);\n require(signer == owner, \"ERC20Permit: invalid signature\");\n\n _approve(owner, spender, value);\n }\n\n /**\n * @dev See {IERC20Permit-nonces}.\n */\n function nonces(address owner) public view virtual override returns (uint256) {\n return _nonces[owner].current();\n }\n\n /**\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\n return _domainSeparatorV4();\n }\n\n /**\n * @dev \"Consume a nonce\": return the current value and increment.\n *\n * _Available since v4.1._\n */\n function _useNonce(address owner) internal virtual returns (uint256 current) {\n Counters.Counter storage nonce = _nonces[owner];\n current = nonce.current();\n nonce.increment();\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Votes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20Permit.sol\";\nimport \"../../../interfaces/IERC5805.sol\";\nimport \"../../../utils/math/Math.sol\";\nimport \"../../../utils/math/SafeCast.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is ERC20Permit, IERC5805 {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n /**\n * @dev Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting).\n */\n function clock() public view virtual override returns (uint48) {\n return SafeCast.toUint48(block.number);\n }\n\n /**\n * @dev Description of the clock\n */\n // solhint-disable-next-line func-name-mixedcase\n function CLOCK_MODE() public view virtual override returns (string memory) {\n // Check that the clock was not modified\n require(clock() == block.number, \"ERC20Votes: broken clock mode\");\n return \"mode=blocknumber&from=default\";\n }\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual override returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view virtual override returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n unchecked {\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `timepoint`.\n *\n * Requirements:\n *\n * - `timepoint` must be in the past\n */\n function getPastVotes(address account, uint256 timepoint) public view virtual override returns (uint256) {\n require(timepoint < clock(), \"ERC20Votes: future lookup\");\n return _checkpointsLookup(_checkpoints[account], timepoint);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `timepoint`. Note, this value is the sum of all balances.\n * It is NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `timepoint` must be in the past\n */\n function getPastTotalSupply(uint256 timepoint) public view virtual override returns (uint256) {\n require(timepoint < clock(), \"ERC20Votes: future lookup\");\n return _checkpointsLookup(_totalSupplyCheckpoints, timepoint);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 timepoint) private view returns (uint256) {\n // We run a binary search to look for the last (most recent) checkpoint taken before (or at) `timepoint`.\n //\n // Initially we check if the block is recent to narrow the search range.\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `timepoint`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `timepoint`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `timepoint`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `timepoint`, but it works out\n // the same.\n uint256 length = ckpts.length;\n\n uint256 low = 0;\n uint256 high = length;\n\n if (length > 5) {\n uint256 mid = length - Math.sqrt(length);\n if (_unsafeAccess(ckpts, mid).fromBlock > timepoint) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (_unsafeAccess(ckpts, mid).fromBlock > timepoint) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n unchecked {\n return high == 0 ? 0 : _unsafeAccess(ckpts, high - 1).votes;\n }\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual override {\n _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {IVotes-DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {IVotes-DelegateChanged} and {IVotes-DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(address src, address dst, uint256 amount) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n\n unchecked {\n Checkpoint memory oldCkpt = pos == 0 ? Checkpoint(0, 0) : _unsafeAccess(ckpts, pos - 1);\n\n oldWeight = oldCkpt.votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && oldCkpt.fromBlock == clock()) {\n _unsafeAccess(ckpts, pos - 1).votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(clock()), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n\n /**\n * @dev Access an element of the array without performing bounds check. The position is assumed to be within bounds.\n */\n function _unsafeAccess(Checkpoint[] storage ckpts, uint256 pos) private pure returns (Checkpoint storage result) {\n assembly {\n mstore(0, ckpts.slot)\n result.slot := add(keccak256(0, 0x20), pos)\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/Counters.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/ShortStrings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/ShortStrings.sol)\n\npragma solidity ^0.8.8;\n\nimport \"./StorageSlot.sol\";\n\n// | string | 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |\n// | length | 0x BB |\ntype ShortString is bytes32;\n\n/**\n * @dev This library provides functions to convert short memory strings\n * into a `ShortString` type that can be used as an immutable variable.\n *\n * Strings of arbitrary length can be optimized using this library if\n * they are short enough (up to 31 bytes) by packing them with their\n * length (1 byte) in a single EVM word (32 bytes). Additionally, a\n * fallback mechanism can be used for every other case.\n *\n * Usage example:\n *\n * ```solidity\n * contract Named {\n * using ShortStrings for *;\n *\n * ShortString private immutable _name;\n * string private _nameFallback;\n *\n * constructor(string memory contractName) {\n * _name = contractName.toShortStringWithFallback(_nameFallback);\n * }\n *\n * function name() external view returns (string memory) {\n * return _name.toStringWithFallback(_nameFallback);\n * }\n * }\n * ```\n */\nlibrary ShortStrings {\n // Used as an identifier for strings longer than 31 bytes.\n bytes32 private constant _FALLBACK_SENTINEL = 0x00000000000000000000000000000000000000000000000000000000000000FF;\n\n error StringTooLong(string str);\n error InvalidShortString();\n\n /**\n * @dev Encode a string of at most 31 chars into a `ShortString`.\n *\n * This will trigger a `StringTooLong` error is the input string is too long.\n */\n function toShortString(string memory str) internal pure returns (ShortString) {\n bytes memory bstr = bytes(str);\n if (bstr.length > 31) {\n revert StringTooLong(str);\n }\n return ShortString.wrap(bytes32(uint256(bytes32(bstr)) | bstr.length));\n }\n\n /**\n * @dev Decode a `ShortString` back to a \"normal\" string.\n */\n function toString(ShortString sstr) internal pure returns (string memory) {\n uint256 len = byteLength(sstr);\n // using `new string(len)` would work locally but is not memory safe.\n string memory str = new string(32);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(str, len)\n mstore(add(str, 0x20), sstr)\n }\n return str;\n }\n\n /**\n * @dev Return the length of a `ShortString`.\n */\n function byteLength(ShortString sstr) internal pure returns (uint256) {\n uint256 result = uint256(ShortString.unwrap(sstr)) & 0xFF;\n if (result > 31) {\n revert InvalidShortString();\n }\n return result;\n }\n\n /**\n * @dev Encode a string into a `ShortString`, or write it to storage if it is too long.\n */\n function toShortStringWithFallback(string memory value, string storage store) internal returns (ShortString) {\n if (bytes(value).length < 32) {\n return toShortString(value);\n } else {\n StorageSlot.getStringSlot(store).value = value;\n return ShortString.wrap(_FALLBACK_SENTINEL);\n }\n }\n\n /**\n * @dev Decode a string that was encoded to `ShortString` or written to storage using {setWithFallback}.\n */\n function toStringWithFallback(ShortString value, string storage store) internal pure returns (string memory) {\n if (ShortString.unwrap(value) != _FALLBACK_SENTINEL) {\n return toString(value);\n } else {\n return store;\n }\n }\n\n /**\n * @dev Return the length of a string that was encoded to `ShortString` or written to storage using {setWithFallback}.\n *\n * WARNING: This will return the \"byte length\" of the string. This may not reflect the actual length in terms of\n * actual characters as the UTF-8 encoding of a single character can span over multiple bytes.\n */\n function byteLengthWithFallback(ShortString value, string storage store) internal view returns (uint256) {\n if (ShortString.unwrap(value) != _FALLBACK_SENTINEL) {\n return byteLength(value);\n } else {\n return bytes(store).length;\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/StorageSlot.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n *\n * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._\n * _Available since v4.9 for `string`, `bytes`._\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n struct StringSlot {\n string value;\n }\n\n struct BytesSlot {\n bytes value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` with member `value` located at `slot`.\n */\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n */\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := store.slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` with member `value` located at `slot`.\n */\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n */\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := store.slot\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/Strings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toString(int256 value) internal pure returns (string memory) {\n return string(abi.encodePacked(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value))));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return keccak256(bytes(a)) == keccak256(bytes(b));\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.sol\";\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV // Deprecated in v4.8\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n /// @solidity memory-safe-assembly\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, \"\\x19Ethereum Signed Message:\\n32\")\n mstore(0x1c, hash)\n message := keccak256(0x00, 0x3c)\n }\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from `s`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n\", Strings.toString(s.length), s));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) {\n /// @solidity memory-safe-assembly\n assembly {\n let ptr := mload(0x40)\n mstore(ptr, \"\\x19\\x01\")\n mstore(add(ptr, 0x02), domainSeparator)\n mstore(add(ptr, 0x22), structHash)\n data := keccak256(ptr, 0x42)\n }\n }\n\n /**\n * @dev Returns an Ethereum Signed Data with intended validator, created from a\n * `validator` and `data` according to the version 0 of EIP-191.\n *\n * See {recover}.\n */\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x00\", validator, data));\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.8;\n\nimport \"./ECDSA.sol\";\nimport \"../ShortStrings.sol\";\nimport \"../../interfaces/IERC5267.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain\n * separator of the implementation contract. This will cause the `_domainSeparatorV4` function to always rebuild the\n * separator from the immutable values, which is cheaper than accessing a cached version in cold storage.\n *\n * _Available since v3.4._\n *\n * @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\n */\nabstract contract EIP712 is IERC5267 {\n using ShortStrings for *;\n\n bytes32 private constant _TYPE_HASH =\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\");\n\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _cachedDomainSeparator;\n uint256 private immutable _cachedChainId;\n address private immutable _cachedThis;\n\n bytes32 private immutable _hashedName;\n bytes32 private immutable _hashedVersion;\n\n ShortString private immutable _name;\n ShortString private immutable _version;\n string private _nameFallback;\n string private _versionFallback;\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n _name = name.toShortStringWithFallback(_nameFallback);\n _version = version.toShortStringWithFallback(_versionFallback);\n _hashedName = keccak256(bytes(name));\n _hashedVersion = keccak256(bytes(version));\n\n _cachedChainId = block.chainid;\n _cachedDomainSeparator = _buildDomainSeparator();\n _cachedThis = address(this);\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _cachedThis && block.chainid == _cachedChainId) {\n return _cachedDomainSeparator;\n } else {\n return _buildDomainSeparator();\n }\n }\n\n function _buildDomainSeparator() private view returns (bytes32) {\n return keccak256(abi.encode(_TYPE_HASH, _hashedName, _hashedVersion, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n\n /**\n * @dev See {EIP-5267}.\n *\n * _Available since v4.9._\n */\n function eip712Domain()\n public\n view\n virtual\n override\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n )\n {\n return (\n hex\"0f\", // 01111\n _name.toStringWithFallback(_nameFallback),\n _version.toStringWithFallback(_versionFallback),\n block.chainid,\n address(this),\n bytes32(0),\n new uint256[](0)\n );\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1, \"Math: mulDiv overflow\");\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10 ** 64) {\n value /= 10 ** 64;\n result += 64;\n }\n if (value >= 10 ** 32) {\n value /= 10 ** 32;\n result += 32;\n }\n if (value >= 10 ** 16) {\n value /= 10 ** 16;\n result += 16;\n }\n if (value >= 10 ** 8) {\n value /= 10 ** 8;\n result += 8;\n }\n if (value >= 10 ** 4) {\n value /= 10 ** 4;\n result += 4;\n }\n if (value >= 10 ** 2) {\n value /= 10 ** 2;\n result += 2;\n }\n if (value >= 10 ** 1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SafeCast.sol)\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n require(value <= type(uint248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n require(value <= type(uint240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n require(value <= type(uint232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.2._\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n require(value <= type(uint216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n require(value <= type(uint208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n require(value <= type(uint200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n require(value <= type(uint192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n require(value <= type(uint184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n require(value <= type(uint176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n require(value <= type(uint168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n require(value <= type(uint160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n require(value <= type(uint152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n require(value <= type(uint144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n require(value <= type(uint136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v2.5._\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n require(value <= type(uint120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n require(value <= type(uint112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n require(value <= type(uint104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.2._\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n require(value <= type(uint88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n require(value <= type(uint80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n require(value <= type(uint72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v2.5._\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n require(value <= type(uint56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n require(value <= type(uint48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n require(value <= type(uint40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v2.5._\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n require(value <= type(uint24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v2.5._\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v2.5._\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n *\n * _Available since v3.0._\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toInt248(int256 value) internal pure returns (int248 downcasted) {\n downcasted = int248(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 248 bits\");\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toInt240(int256 value) internal pure returns (int240 downcasted) {\n downcasted = int240(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 240 bits\");\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toInt232(int256 value) internal pure returns (int232 downcasted) {\n downcasted = int232(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 232 bits\");\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.7._\n */\n function toInt224(int256 value) internal pure returns (int224 downcasted) {\n downcasted = int224(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 224 bits\");\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toInt216(int256 value) internal pure returns (int216 downcasted) {\n downcasted = int216(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 216 bits\");\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toInt208(int256 value) internal pure returns (int208 downcasted) {\n downcasted = int208(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 208 bits\");\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toInt200(int256 value) internal pure returns (int200 downcasted) {\n downcasted = int200(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 200 bits\");\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toInt192(int256 value) internal pure returns (int192 downcasted) {\n downcasted = int192(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 192 bits\");\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toInt184(int256 value) internal pure returns (int184 downcasted) {\n downcasted = int184(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 184 bits\");\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toInt176(int256 value) internal pure returns (int176 downcasted) {\n downcasted = int176(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 176 bits\");\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toInt168(int256 value) internal pure returns (int168 downcasted) {\n downcasted = int168(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 168 bits\");\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toInt160(int256 value) internal pure returns (int160 downcasted) {\n downcasted = int160(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 160 bits\");\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toInt152(int256 value) internal pure returns (int152 downcasted) {\n downcasted = int152(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 152 bits\");\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toInt144(int256 value) internal pure returns (int144 downcasted) {\n downcasted = int144(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 144 bits\");\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toInt136(int256 value) internal pure returns (int136 downcasted) {\n downcasted = int136(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 136 bits\");\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128 downcasted) {\n downcasted = int128(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 128 bits\");\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toInt120(int256 value) internal pure returns (int120 downcasted) {\n downcasted = int120(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 120 bits\");\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toInt112(int256 value) internal pure returns (int112 downcasted) {\n downcasted = int112(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 112 bits\");\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toInt104(int256 value) internal pure returns (int104 downcasted) {\n downcasted = int104(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 104 bits\");\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.7._\n */\n function toInt96(int256 value) internal pure returns (int96 downcasted) {\n downcasted = int96(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 96 bits\");\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toInt88(int256 value) internal pure returns (int88 downcasted) {\n downcasted = int88(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 88 bits\");\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toInt80(int256 value) internal pure returns (int80 downcasted) {\n downcasted = int80(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 80 bits\");\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toInt72(int256 value) internal pure returns (int72 downcasted) {\n downcasted = int72(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 72 bits\");\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64 downcasted) {\n downcasted = int64(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 64 bits\");\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toInt56(int256 value) internal pure returns (int56 downcasted) {\n downcasted = int56(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 56 bits\");\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toInt48(int256 value) internal pure returns (int48 downcasted) {\n downcasted = int48(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 48 bits\");\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toInt40(int256 value) internal pure returns (int40 downcasted) {\n downcasted = int40(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 40 bits\");\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32 downcasted) {\n downcasted = int32(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 32 bits\");\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toInt24(int256 value) internal pure returns (int24 downcasted) {\n downcasted = int24(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 24 bits\");\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16 downcasted) {\n downcasted = int16(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 16 bits\");\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8 downcasted) {\n downcasted = int8(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 8 bits\");\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n *\n * _Available since v3.0._\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n /**\n * @dev Returns the largest of two signed numbers.\n */\n function max(int256 a, int256 b) internal pure returns (int256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two signed numbers.\n */\n function min(int256 a, int256 b) internal pure returns (int256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two signed numbers without overflow.\n * The result is rounded towards zero.\n */\n function average(int256 a, int256 b) internal pure returns (int256) {\n // Formula from the book \"Hacker's Delight\"\n int256 x = (a & b) + ((a ^ b) >> 1);\n return x + (int256(uint256(x) >> 255) & (a ^ b));\n }\n\n /**\n * @dev Returns the absolute unsigned value of a signed value.\n */\n function abs(int256 n) internal pure returns (uint256) {\n unchecked {\n // must be unchecked in order to support `n = type(int256).min`\n return uint256(n >= 0 ? n : -n);\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./OwnableUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership} and {acceptOwnership}.\n *\n * This module is used through inheritance. It will make available all functions\n * from parent (Ownable).\n */\nabstract contract Ownable2StepUpgradeable is Initializable, OwnableUpgradeable {\n function __Ownable2Step_init() internal onlyInitializing {\n __Ownable_init_unchained();\n }\n\n function __Ownable2Step_init_unchained() internal onlyInitializing {\n }\n address private _pendingOwner;\n\n event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Returns the address of the pending owner.\n */\n function pendingOwner() public view virtual returns (address) {\n return _pendingOwner;\n }\n\n /**\n * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual override onlyOwner {\n _pendingOwner = newOwner;\n emit OwnershipTransferStarted(owner(), newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual override {\n delete _pendingOwner;\n super._transferOwnership(newOwner);\n }\n\n /**\n * @dev The new owner accepts the ownership transfer.\n */\n function acceptOwnership() public virtual {\n address sender = _msgSender();\n require(pendingOwner() == sender, \"Ownable2Step: caller is not the new owner\");\n _transferOwnership(sender);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n function __Ownable_init() internal onlyInitializing {\n __Ownable_init_unchained();\n }\n\n function __Ownable_init_unchained() internal onlyInitializing {\n _transferOwnership(_msgSender());\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n * @custom:oz-retyped-from bool\n */\n uint8 private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint8 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts.\n *\n * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\n * constructor.\n *\n * Emits an {Initialized} event.\n */\n modifier initializer() {\n bool isTopLevelCall = !_initializing;\n require(\n (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\n \"Initializable: contract is already initialized\"\n );\n _initialized = 1;\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n * are added through upgrades and that require initialization.\n *\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n * cannot be nested. If one is invoked in the context of another, execution will revert.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n *\n * WARNING: setting the version to 255 will prevent any future reinitialization.\n *\n * Emits an {Initialized} event.\n */\n modifier reinitializer(uint8 version) {\n require(!_initializing && _initialized < version, \"Initializable: contract is already initialized\");\n _initialized = version;\n _initializing = true;\n _;\n _initializing = false;\n emit Initialized(version);\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n require(_initializing, \"Initializable: contract is not initializing\");\n _;\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n *\n * Emits an {Initialized} event the first time it is successfully executed.\n */\n function _disableInitializers() internal virtual {\n require(!_initializing, \"Initializable: contract is initializing\");\n if (_initialized != type(uint8).max) {\n _initialized = type(uint8).max;\n emit Initialized(type(uint8).max);\n }\n }\n\n /**\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\n */\n function _getInitializedVersion() internal view returns (uint8) {\n return _initialized;\n }\n\n /**\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n */\n function _isInitializing() internal view returns (bool) {\n return _initializing;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n *\n * Furthermore, `isContract` will also return true if the target contract within\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n * which only has an effect at the end of a transaction.\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal onlyInitializing {\n }\n\n function __Context_init_unchained() internal onlyInitializing {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[50] private __gap;\n}\n" + } + }, + "settings": { + "remappings": [ + "@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/", + "@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/", + "@rari-capital/solmate/=node_modules/@rari-capital/solmate/", + "forge-std/=node_modules/forge-std/src/", + "ds-test/=node_modules/ds-test/src/", + "hardhat-deploy/=node_modules/hardhat-deploy/", + "hardhat/=node_modules/hardhat/" + ], + "optimizer": { + "enabled": true, + "runs": 10000 + }, + "metadata": { + "useLiteralContent": false, + "bytecodeHash": "none" + }, + "outputSelection": { + "*": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + } + }, + "evmVersion": "london", + "viaIR": false, + "libraries": {} + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/mainnet/L1GovernanceToken.json b/packages/contracts/deployments/mainnet/L1GovernanceToken.json new file mode 100644 index 0000000000..4bc7b608e6 --- /dev/null +++ b/packages/contracts/deployments/mainnet/L1GovernanceToken.json @@ -0,0 +1,1272 @@ +{ + "address": "0xf1aF9D897956434E5d7Bd875fd231e044890c897", + "abi": [ + { + "type": "constructor", + "inputs": [ + { + "name": "_bridge", + "type": "address", + "internalType": "address" + }, + { + "name": "_remoteToken", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "BRIDGE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "CLOCK_MODE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "DOMAIN_SEPARATOR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "REMOTE_TOKEN", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "acceptOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "allowance", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "spender", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "spender", + "type": "address", + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "burn", + "inputs": [ + { + "name": "_from", + "type": "address", + "internalType": "address" + }, + { + "name": "_amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "checkpoints", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + }, + { + "name": "pos", + "type": "uint32", + "internalType": "uint32" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct ERC20Votes.Checkpoint", + "components": [ + { + "name": "fromBlock", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "votes", + "type": "uint224", + "internalType": "uint224" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "clock", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint48", + "internalType": "uint48" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "decimals", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "decreaseAllowance", + "inputs": [ + { + "name": "spender", + "type": "address", + "internalType": "address" + }, + { + "name": "subtractedValue", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "delegate", + "inputs": [ + { + "name": "delegatee", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "delegateBySig", + "inputs": [ + { + "name": "delegatee", + "type": "address", + "internalType": "address" + }, + { + "name": "nonce", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "expiry", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "v", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "r", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "s", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "delegates", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "eip712Domain", + "inputs": [], + "outputs": [ + { + "name": "fields", + "type": "bytes1", + "internalType": "bytes1" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "version", + "type": "string", + "internalType": "string" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "verifyingContract", + "type": "address", + "internalType": "address" + }, + { + "name": "salt", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "extensions", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPastTotalSupply", + "inputs": [ + { + "name": "timepoint", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPastVotes", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + }, + { + "name": "timepoint", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getVotes", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "increaseAllowance", + "inputs": [ + { + "name": "spender", + "type": "address", + "internalType": "address" + }, + { + "name": "addedValue", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "initialize", + "inputs": [ + { + "name": "_owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "mint", + "inputs": [ + { + "name": "_to", + "type": "address", + "internalType": "address" + }, + { + "name": "_amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "nonces", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "numCheckpoints", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint32", + "internalType": "uint32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "pendingOwner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "permit", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "spender", + "type": "address", + "internalType": "address" + }, + { + "name": "value", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "deadline", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "v", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "r", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "s", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "renounceOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "supportsInterface", + "inputs": [ + { + "name": "_interfaceId", + "type": "bytes4", + "internalType": "bytes4" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "totalSupply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transfer", + "inputs": [ + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "transferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "version", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "spender", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "value", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Burn", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "DelegateChanged", + "inputs": [ + { + "name": "delegator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "fromDelegate", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "toDelegate", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "DelegateVotesChanged", + "inputs": [ + { + "name": "delegate", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "previousBalance", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "newBalance", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "EIP712DomainChanged", + "inputs": [], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint8", + "indexed": false, + "internalType": "uint8" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Mint", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferStarted", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "value", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "InvalidShortString", + "inputs": [] + }, + { + "type": "error", + "name": "StringTooLong", + "inputs": [ + { + "name": "str", + "type": "string", + "internalType": "string" + } + ] + } + ], + "transactionHash": "0xf3ecf2eb3e34baf4b1de02eea7053c95b469ee54a897a4fad215ef6c51835881", + "receipt": { + "to": null, + "from": "0xcc56801a72463d39903A4a4632E600289178F6bC", + "contractAddress": "0xf1aF9D897956434E5d7Bd875fd231e044890c897", + "transactionIndex": 32, + "gasUsed": "2788963", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000010000000000000000000000000000000400000000000000000000000000000000000000", + "blockHash": "0xdab5e21e840ff1615d432460d3df0d04977bead4b61135e296f3f2e30db9c39c", + "transactionHash": "0xf3ecf2eb3e34baf4b1de02eea7053c95b469ee54a897a4fad215ef6c51835881", + "logs": [ + { + "transactionIndex": 32, + "blockNumber": 20266533, + "transactionHash": "0xf3ecf2eb3e34baf4b1de02eea7053c95b469ee54a897a4fad215ef6c51835881", + "address": "0xf1aF9D897956434E5d7Bd875fd231e044890c897", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", + "logIndex": 151, + "blockHash": "0xdab5e21e840ff1615d432460d3df0d04977bead4b61135e296f3f2e30db9c39c" + } + ], + "blockNumber": 20266533, + "cumulativeGasUsed": "7556828", + "status": 1, + "byzantium": true + }, + "args": [ + "0x827962404D7104202C5aaa6b929115C8211d9596", + "0x25500000d700bbE27104577CCcce8eAbCC96c8ad" + ], + "numDeployments": 1, + "solcInputHash": "1cc21f973aa4cfc73d832518987f54f8", + "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_bridge\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_remoteToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidShortString\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"str\",\"type\":\"string\"}],\"name\":\"StringTooLong\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Burn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fromDelegate\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toDelegate\",\"type\":\"address\"}],\"name\":\"DelegateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegate\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"DelegateVotesChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EIP712DomainChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Mint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BRIDGE\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"CLOCK_MODE\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REMOTE_TOKEN\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"pos\",\"type\":\"uint32\"}],\"name\":\"checkpoints\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fromBlock\",\"type\":\"uint32\"},{\"internalType\":\"uint224\",\"name\":\"votes\",\"type\":\"uint224\"}],\"internalType\":\"struct ERC20Votes.Checkpoint\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clock\",\"outputs\":[{\"internalType\":\"uint48\",\"name\":\"\",\"type\":\"uint48\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"delegateBySig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"delegates\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eip712Domain\",\"outputs\":[{\"internalType\":\"bytes1\",\"name\":\"fields\",\"type\":\"bytes1\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"verifyingContract\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"extensions\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"timepoint\",\"type\":\"uint256\"}],\"name\":\"getPastTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"timepoint\",\"type\":\"uint256\"}],\"name\":\"getPastVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"numCheckpoints\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"_interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"custom:proxied\":\"@title GovernanceToken\",\"kind\":\"dev\",\"methods\":{\"CLOCK_MODE()\":{\"details\":\"Description of the clock\"},\"DOMAIN_SEPARATOR()\":{\"details\":\"See {IERC20Permit-DOMAIN_SEPARATOR}.\"},\"acceptOwnership()\":{\"details\":\"The new owner accepts the ownership transfer.\"},\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"burn(address,uint256)\":{\"params\":{\"_amount\":\"Amount of tokens to burn.\",\"_from\":\"Address to burn tokens from.\"}},\"checkpoints(address,uint32)\":{\"details\":\"Get the `pos`-th checkpoint for `account`.\"},\"clock()\":{\"details\":\"Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting).\"},\"constructor\":{\"params\":{\"_bridge\":\"Address of the StandardBridge contract on this network.\",\"_remoteToken\":\"Address of the corresponding token on the remote chain.\"}},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"delegate(address)\":{\"details\":\"Delegate votes from the sender to `delegatee`.\"},\"delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Delegates votes from signer to `delegatee`\"},\"delegates(address)\":{\"details\":\"Get the address `account` is currently delegating to.\"},\"eip712Domain()\":{\"details\":\"See {EIP-5267}. _Available since v4.9._\"},\"getPastTotalSupply(uint256)\":{\"details\":\"Retrieve the `totalSupply` at the end of `timepoint`. Note, this value is the sum of all balances. It is NOT the sum of all the delegated votes! Requirements: - `timepoint` must be in the past\"},\"getPastVotes(address,uint256)\":{\"details\":\"Retrieve the number of votes for `account` at the end of `timepoint`. Requirements: - `timepoint` must be in the past\"},\"getVotes(address)\":{\"details\":\"Gets the current votes balance for `account`\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"initialize(address)\":{\"params\":{\"_owner\":\"The owner of this contract.\"}},\"mint(address,uint256)\":{\"params\":{\"_amount\":\"Amount of tokens to mint.\",\"_to\":\"Address to mint tokens to.\"}},\"name()\":{\"details\":\"Returns the name of the token.\"},\"nonces(address)\":{\"details\":\"See {IERC20Permit-nonces}.\"},\"numCheckpoints(address)\":{\"details\":\"Get number of checkpoints for `account`.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"pendingOwner()\":{\"details\":\"Returns the address of the pending owner.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"See {IERC20Permit-permit}.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"supportsInterface(bytes4)\":{\"params\":{\"_interfaceId\":\"Interface ID to check.\"},\"returns\":{\"_0\":\"Whether or not the interface is supported by this contract.\"}},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"},\"transferOwnership(address)\":{\"details\":\"Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"events\":{\"Burn(address,uint256)\":{\"notice\":\"Emitted whenever tokens are burned from an account.\"},\"Mint(address,uint256)\":{\"notice\":\"Emitted whenever tokens are minted for an account.\"}},\"kind\":\"user\",\"methods\":{\"BRIDGE()\":{\"notice\":\"Address of the StandardBridge on this network.\"},\"REMOTE_TOKEN()\":{\"notice\":\"Address of the corresponding version of this token on the remote chain.\"},\"burn(address,uint256)\":{\"notice\":\"Allows the StandardBridge on this network to burn tokens.\"},\"constructor\":{\"notice\":\"Constructs the GovernanceToken contract.\"},\"initialize(address)\":{\"notice\":\"Initializer.\"},\"mint(address,uint256)\":{\"notice\":\"Allows StandardBridge or the owner to mint tokens.\"},\"supportsInterface(bytes4)\":{\"notice\":\"ERC165 interface check function.\"},\"version()\":{\"notice\":\"Semantic version.\"}},\"notice\":\"The KRO token used in governance, supporting voting and delegation. Implements EIP 2612 allowing signed approvals. `mint` function is only allowed to the owner or `Bridge`, and the total supply amount is minted at once (TGE). `Bridge` has the permission to `mint` and `burn`, for the purpose of bridging KRO to the remote chain.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/governance/GovernanceToken.sol\":\"GovernanceToken\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/\",\":@rari-capital/solmate/=node_modules/@rari-capital/solmate/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\",\":hardhat-deploy/=node_modules/hardhat-deploy/\",\":hardhat/=node_modules/hardhat/\"]},\"sources\":{\"contracts/governance/GovernanceToken.sol\":{\"keccak256\":\"0x98304239f5ca6cc0c68dedf47b31ec5ceaeb11fed78d007dc16afb72d6a152a5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6cffce351c0d797a1c46e2eb3355324c86693cd9d48cd291cc30f0badb1843b4\",\"dweb:/ipfs/QmajzzFw1GT51LH1VBKh378xxwSLXxs6erBvUVxzFVkeLj\"]},\"contracts/universal/IKromaMintableERC20.sol\":{\"keccak256\":\"0x1a95268117456ddb1e0a16eb2ba773b9540c7b8b9520e66d4d167ddc6ace6fcb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f93d2e6f5121a3dfe272e399d6774e0584d59a20c4f63db78e5a0b644d92fa59\",\"dweb:/ipfs/QmbwM7kCpmwZs348jCeNwF86H8SDBURsGCGCUCyoSS1ffy\"]},\"contracts/universal/ISemver.sol\":{\"keccak256\":\"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a\",\"dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR\"]},\"contracts/universal/KromaMintableERC20.sol\":{\"keccak256\":\"0x30dccac5fe2d7c75bbe1411004ad03c40afe6dce8c7d22a89abb783f74bd2674\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://de3f8062e170498d71069529cb83681b0acaeb41643892c092111b07df2895f6\",\"dweb:/ipfs/QmNsZa5vHYQ8eG3dQ7PjkfweXzxKc6nbDj9P455Mp1Waxx\"]},\"node_modules/@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\":{\"keccak256\":\"0x84efb8889801b0ac817324aff6acc691d07bbee816b671817132911d287a8c63\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ec6df2255fadc251ea905043c47bf55170ee6cb5d7ca8b5c8ed54c84eac9d09e\",\"dweb:/ipfs/QmaokWfuL59uarki5yoDGbPzh4cErzEfnAzfmesTNJNXE9\"]},\"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://99c8cb3cd19a44bbfb6612605affb7d8b06cee1f6aa9362a37a8672b4f7eeaf8\",\"dweb:/ipfs/QmasyxFDBUp7k5KFgfDWEzM8PYSKEq7GVznzMJ1VxVRF4B\"]},\"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f103ee2e4aecd37aac6ceefe670709cdd7613dee25fa2d4d9feaf7fc0aaa155e\",\"dweb:/ipfs/QmRiNZLoJk5k3HPMYGPGjZFd2ke1ZxjhJZkM45Ec9GH9hv\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://310136ad60820af4177a11a61d77a3686faf5fca4942b600e08fc940db38396b\",\"dweb:/ipfs/QmbCzMNSTL7Zi7M4UCSqBrkHtp4jjxUnGbkneCZKdR1qeq\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"keccak256\":\"0x1618ddebe73377660f6da71afcba35d5ac4c4600918b3a381d9c6f37eba613eb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://666c8d7c62478b55e082f1835275b7acfc1595491998df6d67183ff2c70eab96\",\"dweb:/ipfs/QmVXmnXfxNaLhoX283dqyKJ8DJbF5thUd9sMuRoFpNMwr7\"]},\"node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol\":{\"keccak256\":\"0xac6c2efc64baccbde4904ae18ed45139c9aa8cff96d6888344d1e4d2eb8b659f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6e416a280c610b6b7a5f158e4a41aacfaec01ef14d5d1de13b46be9e090265fc\",\"dweb:/ipfs/QmYZP2KrdyccBbhLZT42auhvBTMkwiwUS3V6HWb42rbwbG\"]},\"node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol\":{\"keccak256\":\"0xfc12b717f6a2cd0d67adc8700097d4464d37f18ce933d4fc9c948ab6aec35e80\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://82386e69ebe902a2edfd4f8a5ecbeaeb2e00f6cc6481a973729e974373fb492e\",\"dweb:/ipfs/QmSXg4wBMBd83mQvkekT1GsiRX2Qyv5gvrqzv5qJx2M7Kc\"]},\"node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol\":{\"keccak256\":\"0xcaea9aeda3816ba872358c828f4f01455c22ae48ced49c4c7d72bd74176c09b9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://16ff22d8df5aee94510ee43d361b6147caef164941a684cedcb75be44f351fe6\",\"dweb:/ipfs/QmaCCwMdHVdPApuEJHLZapSJyA7mp5dAugpma3VUzWGd8E\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0xa56ca923f70c1748830700250b19c61b70db9a683516dc5e216694a50445d99c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cac938788bc4be12101e59d45588b4e059579f4e61062e1cda8d6b06c0191b15\",\"dweb:/ipfs/QmV2JKCyjTVH3rkWNrfdJRhAT7tZ3usAN2XcnD4h53Mvih\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bd39944e8fc06be6dbe2dd1d8449b5336e23c6a7ba3e8e9ae5ae0f37f35283f5\",\"dweb:/ipfs/QmPV3FGYjVwvKSgAXKUN3r9T9GwniZz83CxBpM7vyj2G53\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol\":{\"keccak256\":\"0x36c00327e3f9afd929cc2721aaa111ab57eff78a630cc364b279ad576b899295\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f5bf927f4c8b71a5809be184c3107b915b0445ab2c4a33208331e5376692eb5a\",\"dweb:/ipfs/QmVXirsCY1sf4kodhbL6w3NWZkeZeaMuQB7M6DBAdZNqFE\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\":{\"keccak256\":\"0x4e560f86662b6f72ab76122fff53317677154f14bac4a80dbd46a54172b3abfa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ca5c2518d247417cb01164f04eff57b7e87b5346bc03478ada916f26117aa7fd\",\"dweb:/ipfs/QmVgK66XGZCiH9x4mhqejKUTujtu68DyE6KrYi6MPuaHRJ\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd\",\"dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\":{\"keccak256\":\"0xec63854014a5b4f2b3290ab9103a21bdf902a508d0f41a8573fea49e98bf571a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bc5b5dc12fbc4002f282eaa7a5f06d8310ed62c1c77c5770f6283e058454c39a\",\"dweb:/ipfs/Qme9rE2wS3yBuyJq9GgbmzbsBQsW2M2sVFqYYLw7bosGrv\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"node_modules/@openzeppelin/contracts/utils/Counters.sol\":{\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://59e1c62884d55b70f3ae5432b44bb3166ad71ae3acd19c57ab6ddc3c87c325ee\",\"dweb:/ipfs/QmezuXg5GK5oeA4F91EZhozBFekhq5TD966bHPH18cCqhu\"]},\"node_modules/@openzeppelin/contracts/utils/ShortStrings.sol\":{\"keccak256\":\"0xc0e310c163edf15db45d4ff938113ab357f94fa86e61ea8e790853c4d2e13256\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://04db5bc05dcb05ba1f6ca2dfbead17adc8a2e2f911aa80b05e7a36d9eaf96516\",\"dweb:/ipfs/QmVkfHZbXVBUPsTopueCn3qGJX8aEjahFF3Fn4NcygLNm5\"]},\"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xf09e68aa0dc6722a25bc46490e8d48ed864466d17313b8a0b254c36b54e49899\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e26daf81e2252dc1fe1ce0e4b55c2eb7c6d1ee84ae6558d1a9554432ea1d32da\",\"dweb:/ipfs/Qmb1UANWiWq5pCKbmHSu772hd4nt374dVaghGmwSVNuk8Q\"]},\"node_modules/@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b81d9ff6559ea5c47fc573e17ece6d9ba5d6839e213e6ebc3b4c5c8fe4199d7f\",\"dweb:/ipfs/QmPCW1bFisUzJkyjroY3yipwfism9RRCigCcK1hbXtVM8n\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0x809bc3edb4bcbef8263fa616c1b60ee0004b50a8a1bfa164d8f57fd31f520c58\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8b93a1e39a4a19eba1600b92c96f435442db88cac91e315c8291547a2a7bcfe2\",\"dweb:/ipfs/QmTm34KVe6uZBZwq8dZDNWwPcm24qBJdxqL3rPxBJ4LrMv\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol\":{\"keccak256\":\"0x8432884527a7ad91e6eed1cfc5a0811ae2073e5bca107bd0ca442e9236b03dbd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e3aa0eadab7aafcf91a95684765f778f64386f0368de88522ce873c21385278a\",\"dweb:/ipfs/QmPfaVAqWgH1QsT3dHVuL6jwMZbVKdoP8w1PvpiPT2FPWd\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f\",\"dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy\"]},\"node_modules/@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cc8841b3cd48ad125e2f46323c8bad3aa0e88e399ec62acb9e57efa7e7c8058c\",\"dweb:/ipfs/QmSqE4mXHA2BXW58deDbXE8MTcsL5JSKNDbm23sVQxRLPS\"]},\"node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x52a8cfb0f5239d11b457dcdd1b326992ef672714ca8da71a157255bddd13f3ad\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://495145362c7ff1c9ca88c58bbbbcb412e3c2004406647412394486552ff6c278\",\"dweb:/ipfs/QmNNCeng6d5eRPDn6tkWSQhjE39XWfQEfjA63rRwHmr1iH\"]},\"node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c50fcc459e49a9858b6d8ad5f911295cb7c9ab57567845a250bf0153f84a95c7\",\"dweb:/ipfs/QmcEW85JRzvDkQggxiBBLVAasXWdkhEysqypj9EaB6H2g6\"]}},\"version\":1}", + "bytecode": "0x6101a06040523480156200001257600080fd5b506040516200369838038062003698833981016040819052620000359162000321565b604051806040016040528060058152602001644b726f6d6160d81b81525080604051806040016040528060018152602001603160f81b8152508484604051806020016040528060008152506040518060200160405280600081525081818160039081620000a39190620003fe565b506004620000b28282620003fe565b505050506001600160a01b03918216608052501660a052620000e2826005620001ac602090811b620012fb17901c565b61016052620000ff816006620001ac602090811b620012fb17901c565b61018052815160208084019190912061012052815190820120610140524660e0526200018f6101205161014051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60c0525050306101005250620001a4620001fc565b505062000547565b6000602083511015620001cc57620001c483620002be565b9050620001f6565b82620001e3836200030160201b6200132c1760201c565b90620001f09082620003fe565b5060ff90505b92915050565b600c54610100900460ff16156200026a5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084015b60405180910390fd5b600c5460ff90811614620002bc57600c805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b600080829050601f81511115620002ec578260405163305a27a960e01b8152600401620002619190620004ca565b8051620002f98262000522565b179392505050565b90565b80516001600160a01b03811681146200031c57600080fd5b919050565b600080604083850312156200033557600080fd5b620003408362000304565b9150620003506020840162000304565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200038457607f821691505b602082108103620003a557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003f957600081815260208120601f850160051c81016020861015620003d45750805b601f850160051c820191505b81811015620003f557828155600101620003e0565b5050505b505050565b81516001600160401b038111156200041a576200041a62000359565b62000432816200042b84546200036f565b84620003ab565b602080601f8311600181146200046a5760008415620004515750858301515b600019600386901b1c1916600185901b178555620003f5565b600085815260208120601f198616915b828110156200049b578886015182559484019460019091019084016200047a565b5085821015620004ba5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208083528351808285015260005b81811015620004f957858101830151858201604001528201620004db565b818111156200050c576000604083870101525b50601f01601f1916929092016040019392505050565b80516020808301519190811015620003a55760001960209190910360031b1b16919050565b60805160a05160c05160e05161010051610120516101405161016051610180516130d2620005c66000396000610ad001526000610aa5015260006117e6015260006117be01526000611719015260006117430152600061176d0152600081816106110152818161085d0152610c69015260006102a901526130d26000f3fe608060405234801561001057600080fd5b50600436106102775760003560e01c806379ba509711610160578063a457c2d7116100d8578063dd62ed3e1161008c578063ee9a31a211610071578063ee9a31a21461060c578063f1127ed814610633578063f2fde38b1461068557600080fd5b8063dd62ed3e146105c2578063e30c3978146105fb57600080fd5b8063c3cda520116100bd578063c3cda52014610589578063c4d66de81461059c578063d505accf146105af57600080fd5b8063a457c2d714610563578063a9059cbb1461057657600080fd5b80638e539e8c1161012f57806395d89b411161011457806395d89b41146105045780639ab24eb01461053d5780639dc29fac1461055057600080fd5b80638e539e8c146104d257806391ddadf4146104e557600080fd5b806379ba50971461048b5780637ecebe001461049357806384b0196e146104a65780638da5cb5b146104c157600080fd5b80633a46b1a8116101f3578063587cde1e116101c25780636fcfff45116101a75780636fcfff451461043257806370a082311461045a578063715018a61461048357600080fd5b8063587cde1e146103f35780635c19a95c1461041f57600080fd5b80633a46b1a81461038757806340c10f191461039a5780634bf5d7e9146103af57806354fd4d50146103b757600080fd5b806318160ddd1161024a578063313ce5671161022f578063313ce5671461035d5780633644e5151461036c578063395093511461037457600080fd5b806318160ddd1461033857806323b872dd1461034a57600080fd5b806301ffc9a71461027c578063033964be146102a457806306fdde03146102e3578063095ea7b314610325575b600080fd5b61028f61028a366004612a65565b610698565b60405190151581526020015b60405180910390f35b6102cb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161029b565b60408051808201909152600581527f4b726f6d6100000000000000000000000000000000000000000000000000000060208201525b60405161029b9190612b12565b61028f610333366004612b41565b610738565b6002545b60405190815260200161029b565b61028f610358366004612b6b565b610752565b6040516012815260200161029b565b61033c610776565b61028f610382366004612b41565b610785565b61033c610395366004612b41565b6107c4565b6103ad6103a8366004612b41565b610852565b005b610318610913565b6103186040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6102cb610401366004612ba7565b6001600160a01b039081166000908152600960205260409020541690565b6103ad61042d366004612ba7565b6109ab565b610445610440366004612ba7565b6109b8565b60405163ffffffff909116815260200161029b565b61033c610468366004612ba7565b6001600160a01b031660009081526020819052604090205490565b6103ad6109da565b6103ad6109ee565b61033c6104a1366004612ba7565b610a79565b6104ae610a97565b60405161029b9796959493929190612bc2565b603f546001600160a01b03166102cb565b61033c6104e0366004612c74565b610b3c565b6104ed610ba7565b60405165ffffffffffff909116815260200161029b565b60408051808201909152600381527f4b524f00000000000000000000000000000000000000000000000000000000006020820152610318565b61033c61054b366004612ba7565b610bb2565b6103ad61055e366004612b41565b610c5e565b61028f610571366004612b41565b610d06565b61028f610584366004612b41565b610db0565b6103ad610597366004612c9e565b610dbe565b6103ad6105aa366004612ba7565b610ef4565b6103ad6105bd366004612cf6565b611075565b61033c6105d0366004612d60565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6071546001600160a01b03166102cb565b6102cb7f000000000000000000000000000000000000000000000000000000000000000081565b610646610641366004612d93565b6111d9565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16928101929092520161029b565b6103ad610693366004612ba7565b611272565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f30a0c5a9000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000841682148061073057507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b60003361074681858561132f565b60019150505b92915050565b600033610760858285611487565b61076b858585611519565b506001949350505050565b600061078061170c565b905090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919061074690829086906107bf908790612e02565b61132f565b60006107ce610ba7565b65ffffffffffff1682106108295760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20667574757265206c6f6f6b75700000000000000060448201526064015b60405180910390fd5b6001600160a01b0383166000908152600a6020526040902061084b9083611837565b9392505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108935750603f546001600160a01b031633145b6109055760405162461bcd60e51b815260206004820152602e60248201527f476f7665726e616e6365546f6b656e3a206f6e6c7920627269646765206f722060448201527f6f776e65722063616e206d696e740000000000000000000000000000000000006064820152608401610820565b61090f828261194a565b5050565b60604361091e610ba7565b65ffffffffffff16146109735760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a2062726f6b656e20636c6f636b206d6f64650000006044820152606401610820565b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b6109b5338261199b565b50565b6001600160a01b0381166000908152600a602052604081205461074c90611a2c565b6109e2611aac565b6109ec6000611b06565b565b60715433906001600160a01b03168114610a705760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610820565b6109b581611b06565b6001600160a01b03811660009081526007602052604081205461074c565b600060608082808083610acb7f00000000000000000000000000000000000000000000000000000000000000006005611b37565b610af67f00000000000000000000000000000000000000000000000000000000000000006006611b37565b604080516000808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6000610b46610ba7565b65ffffffffffff168210610b9c5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20667574757265206c6f6f6b7570000000000000006044820152606401610820565b61074c600b83611837565b600061078043611bdb565b6001600160a01b0381166000908152600a60205260408120548015610c36576001600160a01b0383166000908152600a6020526040902080546000198301908110610bff57610bff612e49565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610c39565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cfc5760405162461bcd60e51b815260206004820152603160248201527f4b726f6d614d696e7461626c6545524332303a206f6e6c79206272696467652060448201527f63616e206d696e7420616e64206275726e0000000000000000000000000000006064820152608401610820565b61090f8282611c59565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919083811015610da35760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610820565b61076b828686840361132f565b600033610746818585611519565b83421115610e0e5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610820565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610e8890610e809060a00160405160208183030381529060405280519060200120611c9e565b858585611ce6565b9050610e9381611d0e565b8614610ee15760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610820565b610eeb818861199b565b50505050505050565b600c54610100900460ff1615808015610f145750600c54600160ff909116105b80610f2e5750303b158015610f2e5750600c5460ff166001145b610fa05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610820565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610ffe57600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b611006611d36565b61100f82611272565b801561090f57600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b834211156110c55760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610820565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886110f48c611d0e565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061114f82611c9e565b9050600061115f82878787611ce6565b9050896001600160a01b0316816001600160a01b0316146111c25760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610820565b6111cd8a8a8a61132f565b50505050505050505050565b60408051808201909152600080825260208201526001600160a01b0383166000908152600a60205260409020805463ffffffff841690811061121d5761121d612e49565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b61127a611aac565b607180546001600160a01b0383167fffffffffffffffffffffffff000000000000000000000000000000000000000090911681179091556112c3603f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60006020835110156113175761131083611dbb565b905061074c565b816113228482612f13565b5060ff905061074c565b90565b6001600160a01b0383166113aa5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166114265760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461151357818110156115065760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610820565b611513848484840361132f565b50505050565b6001600160a01b0383166115955760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166116115760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b038316600090815260208190526040902054818110156116a05760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611513848484611e17565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561176557507f000000000000000000000000000000000000000000000000000000000000000046145b1561178f57507f000000000000000000000000000000000000000000000000000000000000000090565b610780604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b81546000908181600581111561189157600061185284611e22565b61185c9085612ff1565b600088815260209020909150869082015463ffffffff1611156118815780915061188f565b61188c816001612e02565b92505b505b808210156118de5760006118a58383611f0a565b600088815260209020909150869082015463ffffffff1611156118ca578091506118d8565b6118d5816001612e02565b92505b50611891565b801561191f576000868152602090208101600019015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611922565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169695505050505050565b6119548282611f25565b816001600160a01b03167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161198f91815260200190565b60405180910390a25050565b6001600160a01b038281166000818152600960208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611513828483611fd1565b600063ffffffff821115611aa85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610820565b5090565b603f546001600160a01b031633146109ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610820565b607180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556109b58161210e565b606060ff8314611b4a5761131083612178565b818054611b5690612e78565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8290612e78565b8015611bcf5780601f10611ba457610100808354040283529160200191611bcf565b820191906000526020600020905b815481529060010190602001808311611bb257829003601f168201915b5050505050905061074c565b600065ffffffffffff821115611aa85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201527f38206269747300000000000000000000000000000000000000000000000000006064820152608401610820565b611c6382826121b7565b816001600160a01b03167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161198f91815260200190565b600061074c611cab61170c565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6000806000611cf7878787876121cf565b91509150611d04816122b1565b5095945050505050565b6001600160a01b03811660009081526007602052604090208054600181018255905b50919050565b600c54610100900460ff16611db35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610820565b6109ec612416565b600080829050601f81511115611dff57826040517f305a27a90000000000000000000000000000000000000000000000000000000081526004016108209190612b12565b8051611e0a82613008565b179392505050565b505050565b611e1283838361249c565b600081600003611e3457506000919050565b60006001611e41846124ce565b901c6001901b90506001818481611e5a57611e5a61302c565b048201901c90506001818481611e7257611e7261302c565b048201901c90506001818481611e8a57611e8a61302c565b048201901c90506001818481611ea257611ea261302c565b048201901c90506001818481611eba57611eba61302c565b048201901c90506001818481611ed257611ed261302c565b048201901c90506001818481611eea57611eea61302c565b048201901c905061084b81828581611f0457611f0461302c565b04612562565b6000611f19600284841861305b565b61084b90848416612e02565b611f2f8282612578565b6002547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1015611fc35760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610820565b611513600b61263f8361264b565b816001600160a01b0316836001600160a01b031614158015611ff35750600081115b15611e12576001600160a01b03831615612081576001600160a01b0383166000908152600a60205260408120819061202e906128148561264b565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612076929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611e12576001600160a01b0382166000908152600a6020526040812081906120b79061263f8561264b565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516120ff929190918252602082015260400190565b60405180910390a25050505050565b603f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060600061218583612820565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b6121c18282612861565b611513600b6128148361264b565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561220657506000905060036122a8565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561225a573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b0381166122a1576000600192509250506122a8565b9150600090505b94509492505050565b60008160048111156122c5576122c5613096565b036122cd5750565b60018160048111156122e1576122e1613096565b0361232e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610820565b600281600481111561234257612342613096565b0361238f5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610820565b60038160048111156123a3576123a3613096565b036109b55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610820565b600c54610100900460ff166124935760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610820565b6109ec33611b06565b6001600160a01b03838116600090815260096020526040808220548584168352912054611e1292918216911683611fd1565b600080608083901c156124e357608092831c92015b604083901c156124f557604092831c92015b602083901c1561250757602092831c92015b601083901c1561251957601092831c92015b600883901c1561252b57600892831c92015b600483901c1561253d57600492831c92015b600283901c1561254f57600292831c92015b600183901c1561074c5760010192915050565b6000818310612571578161084b565b5090919050565b6001600160a01b0382166125ce5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610820565b80600260008282546125e09190612e02565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361090f60008383611e17565b600061084b8284612e02565b825460009081908181156126ad5760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660208201526126c2565b60408051808201909152600080825260208201525b905080602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1693506126f784868863ffffffff16565b9250600082118015612721575061270c610ba7565b65ffffffffffff16816000015163ffffffff16145b1561277b5761272f836129d1565b60008881526020902083016000190180547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092166401000000000263ffffffff90921691909117905561280a565b86604051806040016040528061279f612792610ba7565b65ffffffffffff16611a2c565b63ffffffff1681526020016127b3866129d1565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b600061084b8284612ff1565b600060ff8216601f81111561074c576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166128dd5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166000908152602081905260409020548181101561296c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611e1283600084611e17565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821115611aa85760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610820565b600060208284031215612a7757600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461084b57600080fd5b6000815180845260005b81811015612acd57602081850181015186830182015201612ab1565b81811115612adf576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061084b6020830184612aa7565b80356001600160a01b0381168114612b3c57600080fd5b919050565b60008060408385031215612b5457600080fd5b612b5d83612b25565b946020939093013593505050565b600080600060608486031215612b8057600080fd5b612b8984612b25565b9250612b9760208501612b25565b9150604084013590509250925092565b600060208284031215612bb957600080fd5b61084b82612b25565b7fff00000000000000000000000000000000000000000000000000000000000000881681526000602060e081840152612bfe60e084018a612aa7565b8381036040850152612c10818a612aa7565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b81811015612c6257835183529284019291840191600101612c46565b50909c9b505050505050505050505050565b600060208284031215612c8657600080fd5b5035919050565b803560ff81168114612b3c57600080fd5b60008060008060008060c08789031215612cb757600080fd5b612cc087612b25565b95506020870135945060408701359350612cdc60608801612c8d565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a031215612d1157600080fd5b612d1a88612b25565b9650612d2860208901612b25565b95506040880135945060608801359350612d4460808901612c8d565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612d7357600080fd5b612d7c83612b25565b9150612d8a60208401612b25565b90509250929050565b60008060408385031215612da657600080fd5b612daf83612b25565b9150602083013563ffffffff81168114612dc857600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612e1557612e15612dd3565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c90821680612e8c57607f821691505b602082108103611d30577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f821115611e1257600081815260208120601f850160051c81016020861015612eec5750805b601f850160051c820191505b81811015612f0b57828155600101612ef8565b505050505050565b815167ffffffffffffffff811115612f2d57612f2d612e1a565b612f4181612f3b8454612e78565b84612ec5565b602080601f831160018114612f765760008415612f5e5750858301515b600019600386901b1c1916600185901b178555612f0b565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015612fc357888601518255948401946001909101908401612fa4565b5085821015612fe15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008282101561300357613003612dd3565b500390565b80516020808301519190811015611d305760001960209190910360031b1b16919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613091577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102775760003560e01c806379ba509711610160578063a457c2d7116100d8578063dd62ed3e1161008c578063ee9a31a211610071578063ee9a31a21461060c578063f1127ed814610633578063f2fde38b1461068557600080fd5b8063dd62ed3e146105c2578063e30c3978146105fb57600080fd5b8063c3cda520116100bd578063c3cda52014610589578063c4d66de81461059c578063d505accf146105af57600080fd5b8063a457c2d714610563578063a9059cbb1461057657600080fd5b80638e539e8c1161012f57806395d89b411161011457806395d89b41146105045780639ab24eb01461053d5780639dc29fac1461055057600080fd5b80638e539e8c146104d257806391ddadf4146104e557600080fd5b806379ba50971461048b5780637ecebe001461049357806384b0196e146104a65780638da5cb5b146104c157600080fd5b80633a46b1a8116101f3578063587cde1e116101c25780636fcfff45116101a75780636fcfff451461043257806370a082311461045a578063715018a61461048357600080fd5b8063587cde1e146103f35780635c19a95c1461041f57600080fd5b80633a46b1a81461038757806340c10f191461039a5780634bf5d7e9146103af57806354fd4d50146103b757600080fd5b806318160ddd1161024a578063313ce5671161022f578063313ce5671461035d5780633644e5151461036c578063395093511461037457600080fd5b806318160ddd1461033857806323b872dd1461034a57600080fd5b806301ffc9a71461027c578063033964be146102a457806306fdde03146102e3578063095ea7b314610325575b600080fd5b61028f61028a366004612a65565b610698565b60405190151581526020015b60405180910390f35b6102cb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161029b565b60408051808201909152600581527f4b726f6d6100000000000000000000000000000000000000000000000000000060208201525b60405161029b9190612b12565b61028f610333366004612b41565b610738565b6002545b60405190815260200161029b565b61028f610358366004612b6b565b610752565b6040516012815260200161029b565b61033c610776565b61028f610382366004612b41565b610785565b61033c610395366004612b41565b6107c4565b6103ad6103a8366004612b41565b610852565b005b610318610913565b6103186040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6102cb610401366004612ba7565b6001600160a01b039081166000908152600960205260409020541690565b6103ad61042d366004612ba7565b6109ab565b610445610440366004612ba7565b6109b8565b60405163ffffffff909116815260200161029b565b61033c610468366004612ba7565b6001600160a01b031660009081526020819052604090205490565b6103ad6109da565b6103ad6109ee565b61033c6104a1366004612ba7565b610a79565b6104ae610a97565b60405161029b9796959493929190612bc2565b603f546001600160a01b03166102cb565b61033c6104e0366004612c74565b610b3c565b6104ed610ba7565b60405165ffffffffffff909116815260200161029b565b60408051808201909152600381527f4b524f00000000000000000000000000000000000000000000000000000000006020820152610318565b61033c61054b366004612ba7565b610bb2565b6103ad61055e366004612b41565b610c5e565b61028f610571366004612b41565b610d06565b61028f610584366004612b41565b610db0565b6103ad610597366004612c9e565b610dbe565b6103ad6105aa366004612ba7565b610ef4565b6103ad6105bd366004612cf6565b611075565b61033c6105d0366004612d60565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6071546001600160a01b03166102cb565b6102cb7f000000000000000000000000000000000000000000000000000000000000000081565b610646610641366004612d93565b6111d9565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16928101929092520161029b565b6103ad610693366004612ba7565b611272565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f30a0c5a9000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000841682148061073057507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b60003361074681858561132f565b60019150505b92915050565b600033610760858285611487565b61076b858585611519565b506001949350505050565b600061078061170c565b905090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919061074690829086906107bf908790612e02565b61132f565b60006107ce610ba7565b65ffffffffffff1682106108295760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20667574757265206c6f6f6b75700000000000000060448201526064015b60405180910390fd5b6001600160a01b0383166000908152600a6020526040902061084b9083611837565b9392505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108935750603f546001600160a01b031633145b6109055760405162461bcd60e51b815260206004820152602e60248201527f476f7665726e616e6365546f6b656e3a206f6e6c7920627269646765206f722060448201527f6f776e65722063616e206d696e740000000000000000000000000000000000006064820152608401610820565b61090f828261194a565b5050565b60604361091e610ba7565b65ffffffffffff16146109735760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a2062726f6b656e20636c6f636b206d6f64650000006044820152606401610820565b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b6109b5338261199b565b50565b6001600160a01b0381166000908152600a602052604081205461074c90611a2c565b6109e2611aac565b6109ec6000611b06565b565b60715433906001600160a01b03168114610a705760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610820565b6109b581611b06565b6001600160a01b03811660009081526007602052604081205461074c565b600060608082808083610acb7f00000000000000000000000000000000000000000000000000000000000000006005611b37565b610af67f00000000000000000000000000000000000000000000000000000000000000006006611b37565b604080516000808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6000610b46610ba7565b65ffffffffffff168210610b9c5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20667574757265206c6f6f6b7570000000000000006044820152606401610820565b61074c600b83611837565b600061078043611bdb565b6001600160a01b0381166000908152600a60205260408120548015610c36576001600160a01b0383166000908152600a6020526040902080546000198301908110610bff57610bff612e49565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610c39565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cfc5760405162461bcd60e51b815260206004820152603160248201527f4b726f6d614d696e7461626c6545524332303a206f6e6c79206272696467652060448201527f63616e206d696e7420616e64206275726e0000000000000000000000000000006064820152608401610820565b61090f8282611c59565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919083811015610da35760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610820565b61076b828686840361132f565b600033610746818585611519565b83421115610e0e5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610820565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610e8890610e809060a00160405160208183030381529060405280519060200120611c9e565b858585611ce6565b9050610e9381611d0e565b8614610ee15760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610820565b610eeb818861199b565b50505050505050565b600c54610100900460ff1615808015610f145750600c54600160ff909116105b80610f2e5750303b158015610f2e5750600c5460ff166001145b610fa05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610820565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610ffe57600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b611006611d36565b61100f82611272565b801561090f57600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b834211156110c55760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610820565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886110f48c611d0e565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061114f82611c9e565b9050600061115f82878787611ce6565b9050896001600160a01b0316816001600160a01b0316146111c25760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610820565b6111cd8a8a8a61132f565b50505050505050505050565b60408051808201909152600080825260208201526001600160a01b0383166000908152600a60205260409020805463ffffffff841690811061121d5761121d612e49565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b61127a611aac565b607180546001600160a01b0383167fffffffffffffffffffffffff000000000000000000000000000000000000000090911681179091556112c3603f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60006020835110156113175761131083611dbb565b905061074c565b816113228482612f13565b5060ff905061074c565b90565b6001600160a01b0383166113aa5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166114265760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461151357818110156115065760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610820565b611513848484840361132f565b50505050565b6001600160a01b0383166115955760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166116115760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b038316600090815260208190526040902054818110156116a05760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611513848484611e17565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561176557507f000000000000000000000000000000000000000000000000000000000000000046145b1561178f57507f000000000000000000000000000000000000000000000000000000000000000090565b610780604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b81546000908181600581111561189157600061185284611e22565b61185c9085612ff1565b600088815260209020909150869082015463ffffffff1611156118815780915061188f565b61188c816001612e02565b92505b505b808210156118de5760006118a58383611f0a565b600088815260209020909150869082015463ffffffff1611156118ca578091506118d8565b6118d5816001612e02565b92505b50611891565b801561191f576000868152602090208101600019015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611922565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169695505050505050565b6119548282611f25565b816001600160a01b03167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161198f91815260200190565b60405180910390a25050565b6001600160a01b038281166000818152600960208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611513828483611fd1565b600063ffffffff821115611aa85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610820565b5090565b603f546001600160a01b031633146109ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610820565b607180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556109b58161210e565b606060ff8314611b4a5761131083612178565b818054611b5690612e78565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8290612e78565b8015611bcf5780601f10611ba457610100808354040283529160200191611bcf565b820191906000526020600020905b815481529060010190602001808311611bb257829003601f168201915b5050505050905061074c565b600065ffffffffffff821115611aa85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201527f38206269747300000000000000000000000000000000000000000000000000006064820152608401610820565b611c6382826121b7565b816001600160a01b03167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161198f91815260200190565b600061074c611cab61170c565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6000806000611cf7878787876121cf565b91509150611d04816122b1565b5095945050505050565b6001600160a01b03811660009081526007602052604090208054600181018255905b50919050565b600c54610100900460ff16611db35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610820565b6109ec612416565b600080829050601f81511115611dff57826040517f305a27a90000000000000000000000000000000000000000000000000000000081526004016108209190612b12565b8051611e0a82613008565b179392505050565b505050565b611e1283838361249c565b600081600003611e3457506000919050565b60006001611e41846124ce565b901c6001901b90506001818481611e5a57611e5a61302c565b048201901c90506001818481611e7257611e7261302c565b048201901c90506001818481611e8a57611e8a61302c565b048201901c90506001818481611ea257611ea261302c565b048201901c90506001818481611eba57611eba61302c565b048201901c90506001818481611ed257611ed261302c565b048201901c90506001818481611eea57611eea61302c565b048201901c905061084b81828581611f0457611f0461302c565b04612562565b6000611f19600284841861305b565b61084b90848416612e02565b611f2f8282612578565b6002547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1015611fc35760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610820565b611513600b61263f8361264b565b816001600160a01b0316836001600160a01b031614158015611ff35750600081115b15611e12576001600160a01b03831615612081576001600160a01b0383166000908152600a60205260408120819061202e906128148561264b565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612076929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611e12576001600160a01b0382166000908152600a6020526040812081906120b79061263f8561264b565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516120ff929190918252602082015260400190565b60405180910390a25050505050565b603f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060600061218583612820565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b6121c18282612861565b611513600b6128148361264b565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561220657506000905060036122a8565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561225a573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b0381166122a1576000600192509250506122a8565b9150600090505b94509492505050565b60008160048111156122c5576122c5613096565b036122cd5750565b60018160048111156122e1576122e1613096565b0361232e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610820565b600281600481111561234257612342613096565b0361238f5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610820565b60038160048111156123a3576123a3613096565b036109b55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610820565b600c54610100900460ff166124935760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610820565b6109ec33611b06565b6001600160a01b03838116600090815260096020526040808220548584168352912054611e1292918216911683611fd1565b600080608083901c156124e357608092831c92015b604083901c156124f557604092831c92015b602083901c1561250757602092831c92015b601083901c1561251957601092831c92015b600883901c1561252b57600892831c92015b600483901c1561253d57600492831c92015b600283901c1561254f57600292831c92015b600183901c1561074c5760010192915050565b6000818310612571578161084b565b5090919050565b6001600160a01b0382166125ce5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610820565b80600260008282546125e09190612e02565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361090f60008383611e17565b600061084b8284612e02565b825460009081908181156126ad5760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660208201526126c2565b60408051808201909152600080825260208201525b905080602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1693506126f784868863ffffffff16565b9250600082118015612721575061270c610ba7565b65ffffffffffff16816000015163ffffffff16145b1561277b5761272f836129d1565b60008881526020902083016000190180547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092166401000000000263ffffffff90921691909117905561280a565b86604051806040016040528061279f612792610ba7565b65ffffffffffff16611a2c565b63ffffffff1681526020016127b3866129d1565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b600061084b8284612ff1565b600060ff8216601f81111561074c576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166128dd5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166000908152602081905260409020548181101561296c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611e1283600084611e17565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821115611aa85760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610820565b600060208284031215612a7757600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461084b57600080fd5b6000815180845260005b81811015612acd57602081850181015186830182015201612ab1565b81811115612adf576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061084b6020830184612aa7565b80356001600160a01b0381168114612b3c57600080fd5b919050565b60008060408385031215612b5457600080fd5b612b5d83612b25565b946020939093013593505050565b600080600060608486031215612b8057600080fd5b612b8984612b25565b9250612b9760208501612b25565b9150604084013590509250925092565b600060208284031215612bb957600080fd5b61084b82612b25565b7fff00000000000000000000000000000000000000000000000000000000000000881681526000602060e081840152612bfe60e084018a612aa7565b8381036040850152612c10818a612aa7565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b81811015612c6257835183529284019291840191600101612c46565b50909c9b505050505050505050505050565b600060208284031215612c8657600080fd5b5035919050565b803560ff81168114612b3c57600080fd5b60008060008060008060c08789031215612cb757600080fd5b612cc087612b25565b95506020870135945060408701359350612cdc60608801612c8d565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a031215612d1157600080fd5b612d1a88612b25565b9650612d2860208901612b25565b95506040880135945060608801359350612d4460808901612c8d565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612d7357600080fd5b612d7c83612b25565b9150612d8a60208401612b25565b90509250929050565b60008060408385031215612da657600080fd5b612daf83612b25565b9150602083013563ffffffff81168114612dc857600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612e1557612e15612dd3565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c90821680612e8c57607f821691505b602082108103611d30577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f821115611e1257600081815260208120601f850160051c81016020861015612eec5750805b601f850160051c820191505b81811015612f0b57828155600101612ef8565b505050505050565b815167ffffffffffffffff811115612f2d57612f2d612e1a565b612f4181612f3b8454612e78565b84612ec5565b602080601f831160018114612f765760008415612f5e5750858301515b600019600386901b1c1916600185901b178555612f0b565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015612fc357888601518255948401946001909101908401612fa4565b5085821015612fe15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008282101561300357613003612dd3565b500390565b80516020808301519190811015611d305760001960209190910360031b1b16919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613091577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a", + "devdoc": {}, + "userdoc": {}, + "storageLayout": { + "storage": [ + { + "astId": 1333, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_balances", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 1339, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_allowances", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" + }, + { + "astId": 1341, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_totalSupply", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 1343, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_name", + "offset": 0, + "slot": "3", + "type": "t_string_storage" + }, + { + "astId": 1345, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_symbol", + "offset": 0, + "slot": "4", + "type": "t_string_storage" + }, + { + "astId": 3999, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_nameFallback", + "offset": 0, + "slot": "5", + "type": "t_string_storage" + }, + { + "astId": 4001, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_versionFallback", + "offset": 0, + "slot": "6", + "type": "t_string_storage" + }, + { + "astId": 2005, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_nonces", + "offset": 0, + "slot": "7", + "type": "t_mapping(t_address,t_struct(Counter)2977_storage)" + }, + { + "astId": 2013, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_PERMIT_TYPEHASH_DEPRECATED_SLOT", + "offset": 0, + "slot": "8", + "type": "t_bytes32" + }, + { + "astId": 2180, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_delegates", + "offset": 0, + "slot": "9", + "type": "t_mapping(t_address,t_address)" + }, + { + "astId": 2186, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_checkpoints", + "offset": 0, + "slot": "10", + "type": "t_mapping(t_address,t_array(t_struct(Checkpoint)2171_storage)dyn_storage)" + }, + { + "astId": 2190, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_totalSupplyCheckpoints", + "offset": 0, + "slot": "11", + "type": "t_array(t_struct(Checkpoint)2171_storage)dyn_storage" + }, + { + "astId": 656, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_initialized", + "offset": 0, + "slot": "12", + "type": "t_uint8" + }, + { + "astId": 659, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_initializing", + "offset": 1, + "slot": "12", + "type": "t_bool" + }, + { + "astId": 1189, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "__gap", + "offset": 0, + "slot": "13", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 528, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_owner", + "offset": 0, + "slot": "63", + "type": "t_address" + }, + { + "astId": 648, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "__gap", + "offset": 0, + "slot": "64", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 437, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_pendingOwner", + "offset": 0, + "slot": "113", + "type": "t_address" + }, + { + "astId": 516, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "__gap", + "offset": 0, + "slot": "114", + "type": "t_array(t_uint256)49_storage" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_struct(Checkpoint)2171_storage)dyn_storage": { + "encoding": "dynamic_array", + "label": "struct ERC20Votes.Checkpoint[]", + "numberOfBytes": "32", + "base": "t_struct(Checkpoint)2171_storage" + }, + "t_array(t_uint256)49_storage": { + "encoding": "inplace", + "label": "uint256[49]", + "numberOfBytes": "1568", + "base": "t_uint256" + }, + "t_array(t_uint256)50_storage": { + "encoding": "inplace", + "label": "uint256[50]", + "numberOfBytes": "1600", + "base": "t_uint256" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_address)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => address)", + "numberOfBytes": "32", + "value": "t_address" + }, + "t_mapping(t_address,t_array(t_struct(Checkpoint)2171_storage)dyn_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => struct ERC20Votes.Checkpoint[])", + "numberOfBytes": "32", + "value": "t_array(t_struct(Checkpoint)2171_storage)dyn_storage" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => uint256))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_uint256)" + }, + "t_mapping(t_address,t_struct(Counter)2977_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => struct Counters.Counter)", + "numberOfBytes": "32", + "value": "t_struct(Counter)2977_storage" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(Checkpoint)2171_storage": { + "encoding": "inplace", + "label": "struct ERC20Votes.Checkpoint", + "numberOfBytes": "32", + "members": [ + { + "astId": 2168, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "fromBlock", + "offset": 0, + "slot": "0", + "type": "t_uint32" + }, + { + "astId": 2170, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "votes", + "offset": 4, + "slot": "0", + "type": "t_uint224" + } + ] + }, + "t_struct(Counter)2977_storage": { + "encoding": "inplace", + "label": "struct Counters.Counter", + "numberOfBytes": "32", + "members": [ + { + "astId": 2976, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_value", + "offset": 0, + "slot": "0", + "type": "t_uint256" + } + ] + }, + "t_uint224": { + "encoding": "inplace", + "label": "uint224", + "numberOfBytes": "28" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "encoding": "inplace", + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint8": { + "encoding": "inplace", + "label": "uint8", + "numberOfBytes": "1" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/mainnet/L1GovernanceTokenProxy.json b/packages/contracts/deployments/mainnet/L1GovernanceTokenProxy.json new file mode 100644 index 0000000000..95eb457c91 --- /dev/null +++ b/packages/contracts/deployments/mainnet/L1GovernanceTokenProxy.json @@ -0,0 +1,152 @@ +{ + "address": "0x25500000d700bbE27104577CCcce8eAbCC96c8ad", + "abi": [ + { + "type": "constructor", + "payable": false, + "inputs": [ + { + "type": "address", + "name": "_admin" + } + ] + }, + { + "type": "function", + "name": "admin", + "constant": false, + "payable": false, + "inputs": [], + "outputs": [ + { + "type": "address" + } + ] + }, + { + "type": "function", + "name": "changeAdmin", + "constant": false, + "payable": false, + "inputs": [ + { + "type": "address", + "name": "_admin" + } + ], + "outputs": [] + }, + { + "type": "function", + "name": "implementation", + "constant": false, + "payable": false, + "inputs": [], + "outputs": [ + { + "type": "address" + } + ] + }, + { + "type": "function", + "name": "upgradeTo", + "constant": false, + "payable": false, + "inputs": [ + { + "type": "address", + "name": "_implementation" + } + ], + "outputs": [] + }, + { + "type": "function", + "name": "upgradeToAndCall", + "constant": false, + "stateMutability": "payable", + "payable": true, + "inputs": [ + { + "type": "address", + "name": "_implementation" + }, + { + "type": "bytes", + "name": "_data" + } + ], + "outputs": [ + { + "type": "bytes" + } + ] + }, + { + "type": "event", + "anonymous": false, + "name": "AdminChanged", + "inputs": [ + { + "type": "address", + "name": "previousAdmin", + "indexed": false + }, + { + "type": "address", + "name": "newAdmin", + "indexed": false + } + ] + }, + { + "type": "event", + "anonymous": false, + "name": "Upgraded", + "inputs": [ + { + "type": "address", + "name": "implementation", + "indexed": true + } + ] + } + ], + "transactionHash": "0x24964eda0e03bc0e99cd3ff2e785f88ac1ba7b3ede82a193dd6968eb1bbb5ff6", + "receipt": { + "to": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "from": "0xcc56801a72463d39903A4a4632E600289178F6bC", + "contractAddress": null, + "transactionIndex": 169, + "gasUsed": "528796", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000400000000000000000000000000000004000000000000000000000000000000000000000000000000000000", + "blockHash": "0x3dc155b3aeadb1ff24ab091f3f1e1a161e570b6ef579d35c7a4b203ea1283fc3", + "transactionHash": "0x24964eda0e03bc0e99cd3ff2e785f88ac1ba7b3ede82a193dd6968eb1bbb5ff6", + "logs": [ + { + "transactionIndex": 169, + "blockNumber": 20266531, + "transactionHash": "0x24964eda0e03bc0e99cd3ff2e785f88ac1ba7b3ede82a193dd6968eb1bbb5ff6", + "address": "0x25500000d700bbE27104577CCcce8eAbCC96c8ad", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cc56801a72463d39903a4a4632e600289178f6bc", + "logIndex": 1089, + "blockHash": "0x3dc155b3aeadb1ff24ab091f3f1e1a161e570b6ef579d35c7a4b203ea1283fc3" + } + ], + "blockNumber": 20266531, + "cumulativeGasUsed": "26259216", + "status": 1, + "byzantium": true + }, + "args": [ + "0xcc56801a72463d39903A4a4632E600289178F6bC" + ], + "numDeployments": 1, + "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_admin\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_admin\",\"type\":\"address\"}],\"name\":\"changeAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_implementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_implementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"events\":{\"AdminChanged(address,address)\":{\"params\":{\"newAdmin\":\"The new owner of the contract\",\"previousAdmin\":\"The previous owner of the contract\"}},\"Upgraded(address)\":{\"params\":{\"implementation\":\"The address of the implementation contract\"}}},\"kind\":\"dev\",\"methods\":{\"admin()\":{\"returns\":{\"_0\":\"Owner address.\"}},\"changeAdmin(address)\":{\"params\":{\"_admin\":\"New owner of the proxy contract.\"}},\"constructor\":{\"params\":{\"_admin\":\"Address of the initial contract admin. Admin as the ability to access the transparent proxy interface.\"}},\"implementation()\":{\"returns\":{\"_0\":\"Implementation address.\"}},\"upgradeTo(address)\":{\"params\":{\"_implementation\":\"Address of the implementation contract.\"}},\"upgradeToAndCall(address,bytes)\":{\"params\":{\"_data\":\"Calldata to delegatecall the new implementation with.\",\"_implementation\":\"Address of the implementation contract.\"}}},\"title\":\"Proxy\",\"version\":1},\"userdoc\":{\"events\":{\"AdminChanged(address,address)\":{\"notice\":\"An event that is emitted each time the owner is upgraded. This event is part of the EIP-1967 specification.\"},\"Upgraded(address)\":{\"notice\":\"An event that is emitted each time the implementation is changed. This event is part of the EIP-1967 specification.\"}},\"kind\":\"user\",\"methods\":{\"admin()\":{\"notice\":\"Gets the owner of the proxy contract.\"},\"changeAdmin(address)\":{\"notice\":\"Changes the owner of the proxy contract. Only callable by the owner.\"},\"constructor\":{\"notice\":\"Sets the initial admin during contract deployment. Admin address is stored at the EIP-1967 admin storage slot so that accidental storage collision with the implementation is not possible.\"},\"implementation()\":{\"notice\":\"Queries the implementation address.\"},\"upgradeTo(address)\":{\"notice\":\"Set the implementation contract address. The code at the given address will execute when this contract is called.\"},\"upgradeToAndCall(address,bytes)\":{\"notice\":\"Set the implementation and call a function in a single transaction. Useful to ensure atomic execution of initialization-based upgrades.\"}},\"notice\":\"Proxy is a transparent proxy that passes through the call if the caller is the owner or if the caller is address(0), meaning that the call originated from an off-chain simulation.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/universal/Proxy.sol\":\"Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/\",\":@rari-capital/solmate/=node_modules/@rari-capital/solmate/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\",\":hardhat-deploy/=node_modules/hardhat-deploy/\",\":hardhat/=node_modules/hardhat/\"]},\"sources\":{\"contracts/universal/Proxy.sol\":{\"keccak256\":\"0xe7b6a14774f21622e1c287faf730c5fbc69f75b73942ee2586ec0c3b07dfe573\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6874d44c7dab7ce269ec546b762f3fd101f73daedb0f247a19116be868643ddf\",\"dweb:/ipfs/QmPwUj5LneorU5bwryiCVcdpH3WTXBRqxsXUfQsJJgX4Gt\"]}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b5060405161091838038061091883398101604081905261002f916100b2565b6100388161003e565b506100e2565b60006100566000805160206108f88339815191525490565b6000805160206108f8833981519152839055604080516001600160a01b038084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b6000602082840312156100c457600080fd5b81516001600160a01b03811681146100db57600080fd5b9392505050565b610807806100f16000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103", + "deployedBytecode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a" +} \ No newline at end of file diff --git a/packages/contracts/deployments/mainnet/L1MintManager.json b/packages/contracts/deployments/mainnet/L1MintManager.json new file mode 100644 index 0000000000..9a1a45d6bb --- /dev/null +++ b/packages/contracts/deployments/mainnet/L1MintManager.json @@ -0,0 +1,389 @@ +{ + "address": "0x2BD481664f8e815A3eca870176479f9093D0e2d2", + "abi": [ + { + "type": "constructor", + "inputs": [ + { + "name": "_governanceToken", + "type": "address", + "internalType": "address" + }, + { + "name": "_owner", + "type": "address", + "internalType": "address" + }, + { + "name": "_recipients", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "_shares", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "GOVERNANCE_TOKEN", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "contract GovernanceToken" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "MINT_CAP", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "SHARE_DENOMINATOR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "acceptOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "acceptOwnershipOfToken", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "distribute", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "mint", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "minted", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "pendingOwner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "recipients", + "inputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "renounceOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "renounceOwnershipOfToken", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "shareOf", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "transferOwnershipOfToken", + "inputs": [ + { + "name": "newMintManager", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "OwnershipTransferStarted", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + } + ], + "transactionHash": "0x5107b0026d8c47083a36f87f7798dc660b8492c339d618a49e9c91252b685e28", + "receipt": { + "to": null, + "from": "0xcc56801a72463d39903A4a4632E600289178F6bC", + "contractAddress": "0x2BD481664f8e815A3eca870176479f9093D0e2d2", + "transactionIndex": 11, + "gasUsed": "1046195", + "logsBloom": "0x00000000000000000000000000000000200000000000000000800000000000000010000400010000000000000000000000000000020000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000200000000000800000800000000000000040000001000400000000000080000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x6507495576fa85f0214026796fa719bd8db64bbe3ae569523b48992be8237b4d", + "transactionHash": "0x5107b0026d8c47083a36f87f7798dc660b8492c339d618a49e9c91252b685e28", + "logs": [ + { + "transactionIndex": 11, + "blockNumber": 20267518, + "transactionHash": "0x5107b0026d8c47083a36f87f7798dc660b8492c339d618a49e9c91252b685e28", + "address": "0x2BD481664f8e815A3eca870176479f9093D0e2d2", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000cc56801a72463d39903a4a4632e600289178f6bc" + ], + "data": "0x", + "logIndex": 87, + "blockHash": "0x6507495576fa85f0214026796fa719bd8db64bbe3ae569523b48992be8237b4d" + }, + { + "transactionIndex": 11, + "blockNumber": 20267518, + "transactionHash": "0x5107b0026d8c47083a36f87f7798dc660b8492c339d618a49e9c91252b685e28", + "address": "0x2BD481664f8e815A3eca870176479f9093D0e2d2", + "topics": [ + "0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700", + "0x000000000000000000000000cc56801a72463d39903a4a4632e600289178f6bc", + "0x000000000000000000000000c0ab283e81ae99197cfe1c8bee9c593cd4ff7fb3" + ], + "data": "0x", + "logIndex": 88, + "blockHash": "0x6507495576fa85f0214026796fa719bd8db64bbe3ae569523b48992be8237b4d" + } + ], + "blockNumber": 20267518, + "cumulativeGasUsed": "3149804", + "status": 1, + "byzantium": true + }, + "args": [ + "0x25500000d700bbE27104577CCcce8eAbCC96c8ad", + "0xc0ab283E81aE99197Cfe1C8BEE9C593CD4FF7FB3", + [ + "0x17969605cdaF78CEFE7d5BFAd3a8563F8cEaBf4D" + ], + [ + 5200 + ] + ], + "numDeployments": 1, + "solcInputHash": "37a0cebac478897ae0c20446c8a2494a", + "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_governanceToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"_recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_shares\",\"type\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"GOVERNANCE_TOKEN\",\"outputs\":[{\"internalType\":\"contract GovernanceToken\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINT_CAP\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SHARE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnershipOfToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"distribute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"recipients\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnershipOfToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"shareOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newMintManager\",\"type\":\"address\"}],\"name\":\"transferOwnershipOfToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"acceptOwnership()\":{\"details\":\"The new owner accepts the ownership transfer.\"},\"constructor\":{\"params\":{\"_governanceToken\":\"The GovernanceToken this contract can mint tokens of.\",\"_owner\":\"The owner of this contract.\",\"_recipients\":\"List of the recipients.\",\"_shares\":\"List of token distribution ratios for each recipient.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"pendingOwner()\":{\"details\":\"Returns the address of the pending owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner.\"},\"transferOwnershipOfToken(address)\":{\"params\":{\"newMintManager\":\"The new MintManager to own the GovernanceToken.\"}}},\"title\":\"MintManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"GOVERNANCE_TOKEN()\":{\"notice\":\"The GovernanceToken that the MintManager can mint.\"},\"MINT_CAP()\":{\"notice\":\"The amount of tokens that can be minted.\"},\"SHARE_DENOMINATOR()\":{\"notice\":\"The denominator of each recipient's share.\"},\"acceptOwnershipOfToken()\":{\"notice\":\"Only the owner is allowed to accept the ownership of the GovernanceToken.\"},\"constructor\":{\"notice\":\"Constructs the MintManager contract.\"},\"distribute()\":{\"notice\":\"Only the owner is allowed to distribute the GovernanceToken to specified recipients.\"},\"mint()\":{\"notice\":\"Only the owner is allowed to mint mint cap amount of the GovernanceToken at once.\"},\"minted()\":{\"notice\":\"True when already minted on this chain. MintManager can mint only once on each chain.\"},\"recipients(uint256)\":{\"notice\":\"A list of recipient addresses that will receive tokens to be distributed.\"},\"renounceOwnershipOfToken()\":{\"notice\":\"Only the owner is allowed to renounce the ownership of the GovernanceToken.\"},\"shareOf(address)\":{\"notice\":\"A mapping of the recipient's address to share.\"},\"transferOwnershipOfToken(address)\":{\"notice\":\"Only the owner is allowed to transfer the ownership of the GovernanceToken.\"}},\"notice\":\"MintManager issues mint cap amount of GovernanceToken at once (TGE) and distributes the tokens to specified recipients.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/governance/MintManager.sol\":\"MintManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/\",\":@rari-capital/solmate/=node_modules/@rari-capital/solmate/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\",\":hardhat-deploy/=node_modules/hardhat-deploy/\",\":hardhat/=node_modules/hardhat/\"]},\"sources\":{\"contracts/governance/GovernanceToken.sol\":{\"keccak256\":\"0x98304239f5ca6cc0c68dedf47b31ec5ceaeb11fed78d007dc16afb72d6a152a5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6cffce351c0d797a1c46e2eb3355324c86693cd9d48cd291cc30f0badb1843b4\",\"dweb:/ipfs/QmajzzFw1GT51LH1VBKh378xxwSLXxs6erBvUVxzFVkeLj\"]},\"contracts/governance/MintManager.sol\":{\"keccak256\":\"0xadda6a066e4b12ff23e7ff1cb4fdad43106b1b1e44389ea24453fccb0e5c71c8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2ea61e95d9edbf73c56b92dea9b75f66bb76354cff61547df52efa41cd95d07b\",\"dweb:/ipfs/QmRBpLcAHeDBpV8dLgtRaBdA6BzBU6CJmgyoSHCwK8U5cW\"]},\"contracts/universal/IKromaMintableERC20.sol\":{\"keccak256\":\"0x1a95268117456ddb1e0a16eb2ba773b9540c7b8b9520e66d4d167ddc6ace6fcb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f93d2e6f5121a3dfe272e399d6774e0584d59a20c4f63db78e5a0b644d92fa59\",\"dweb:/ipfs/QmbwM7kCpmwZs348jCeNwF86H8SDBURsGCGCUCyoSS1ffy\"]},\"contracts/universal/ISemver.sol\":{\"keccak256\":\"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a\",\"dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR\"]},\"contracts/universal/KromaMintableERC20.sol\":{\"keccak256\":\"0x30dccac5fe2d7c75bbe1411004ad03c40afe6dce8c7d22a89abb783f74bd2674\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://de3f8062e170498d71069529cb83681b0acaeb41643892c092111b07df2895f6\",\"dweb:/ipfs/QmNsZa5vHYQ8eG3dQ7PjkfweXzxKc6nbDj9P455Mp1Waxx\"]},\"node_modules/@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\":{\"keccak256\":\"0x84efb8889801b0ac817324aff6acc691d07bbee816b671817132911d287a8c63\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ec6df2255fadc251ea905043c47bf55170ee6cb5d7ca8b5c8ed54c84eac9d09e\",\"dweb:/ipfs/QmaokWfuL59uarki5yoDGbPzh4cErzEfnAzfmesTNJNXE9\"]},\"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://99c8cb3cd19a44bbfb6612605affb7d8b06cee1f6aa9362a37a8672b4f7eeaf8\",\"dweb:/ipfs/QmasyxFDBUp7k5KFgfDWEzM8PYSKEq7GVznzMJ1VxVRF4B\"]},\"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f103ee2e4aecd37aac6ceefe670709cdd7613dee25fa2d4d9feaf7fc0aaa155e\",\"dweb:/ipfs/QmRiNZLoJk5k3HPMYGPGjZFd2ke1ZxjhJZkM45Ec9GH9hv\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://310136ad60820af4177a11a61d77a3686faf5fca4942b600e08fc940db38396b\",\"dweb:/ipfs/QmbCzMNSTL7Zi7M4UCSqBrkHtp4jjxUnGbkneCZKdR1qeq\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"node_modules/@openzeppelin/contracts/access/Ownable.sol\":{\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fc980984badf3984b6303b377711220e067722bbd6a135b24669ff5069ef9f32\",\"dweb:/ipfs/QmPHXMSXj99XjSVM21YsY6aNtLLjLVXDbyN76J5HQYvvrz\"]},\"node_modules/@openzeppelin/contracts/access/Ownable2Step.sol\":{\"keccak256\":\"0xde231558366826d7cb61725af8147965a61c53b77a352cc8c9af38fc5a92ac3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1fd55624076bf61d44af5ff351919e32dda748567acfbdd6ba3d6c7be61c758e\",\"dweb:/ipfs/QmSki4dTrf4GPm7MTpG3fk8mC7rnjwd2zMomLp6jLuF63Q\"]},\"node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"keccak256\":\"0x1618ddebe73377660f6da71afcba35d5ac4c4600918b3a381d9c6f37eba613eb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://666c8d7c62478b55e082f1835275b7acfc1595491998df6d67183ff2c70eab96\",\"dweb:/ipfs/QmVXmnXfxNaLhoX283dqyKJ8DJbF5thUd9sMuRoFpNMwr7\"]},\"node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol\":{\"keccak256\":\"0xac6c2efc64baccbde4904ae18ed45139c9aa8cff96d6888344d1e4d2eb8b659f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6e416a280c610b6b7a5f158e4a41aacfaec01ef14d5d1de13b46be9e090265fc\",\"dweb:/ipfs/QmYZP2KrdyccBbhLZT42auhvBTMkwiwUS3V6HWb42rbwbG\"]},\"node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol\":{\"keccak256\":\"0xfc12b717f6a2cd0d67adc8700097d4464d37f18ce933d4fc9c948ab6aec35e80\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://82386e69ebe902a2edfd4f8a5ecbeaeb2e00f6cc6481a973729e974373fb492e\",\"dweb:/ipfs/QmSXg4wBMBd83mQvkekT1GsiRX2Qyv5gvrqzv5qJx2M7Kc\"]},\"node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol\":{\"keccak256\":\"0xcaea9aeda3816ba872358c828f4f01455c22ae48ced49c4c7d72bd74176c09b9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://16ff22d8df5aee94510ee43d361b6147caef164941a684cedcb75be44f351fe6\",\"dweb:/ipfs/QmaCCwMdHVdPApuEJHLZapSJyA7mp5dAugpma3VUzWGd8E\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0xa56ca923f70c1748830700250b19c61b70db9a683516dc5e216694a50445d99c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cac938788bc4be12101e59d45588b4e059579f4e61062e1cda8d6b06c0191b15\",\"dweb:/ipfs/QmV2JKCyjTVH3rkWNrfdJRhAT7tZ3usAN2XcnD4h53Mvih\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bd39944e8fc06be6dbe2dd1d8449b5336e23c6a7ba3e8e9ae5ae0f37f35283f5\",\"dweb:/ipfs/QmPV3FGYjVwvKSgAXKUN3r9T9GwniZz83CxBpM7vyj2G53\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol\":{\"keccak256\":\"0x36c00327e3f9afd929cc2721aaa111ab57eff78a630cc364b279ad576b899295\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f5bf927f4c8b71a5809be184c3107b915b0445ab2c4a33208331e5376692eb5a\",\"dweb:/ipfs/QmVXirsCY1sf4kodhbL6w3NWZkeZeaMuQB7M6DBAdZNqFE\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\":{\"keccak256\":\"0x4e560f86662b6f72ab76122fff53317677154f14bac4a80dbd46a54172b3abfa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ca5c2518d247417cb01164f04eff57b7e87b5346bc03478ada916f26117aa7fd\",\"dweb:/ipfs/QmVgK66XGZCiH9x4mhqejKUTujtu68DyE6KrYi6MPuaHRJ\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd\",\"dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\":{\"keccak256\":\"0xec63854014a5b4f2b3290ab9103a21bdf902a508d0f41a8573fea49e98bf571a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bc5b5dc12fbc4002f282eaa7a5f06d8310ed62c1c77c5770f6283e058454c39a\",\"dweb:/ipfs/Qme9rE2wS3yBuyJq9GgbmzbsBQsW2M2sVFqYYLw7bosGrv\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"node_modules/@openzeppelin/contracts/utils/Counters.sol\":{\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://59e1c62884d55b70f3ae5432b44bb3166ad71ae3acd19c57ab6ddc3c87c325ee\",\"dweb:/ipfs/QmezuXg5GK5oeA4F91EZhozBFekhq5TD966bHPH18cCqhu\"]},\"node_modules/@openzeppelin/contracts/utils/ShortStrings.sol\":{\"keccak256\":\"0xc0e310c163edf15db45d4ff938113ab357f94fa86e61ea8e790853c4d2e13256\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://04db5bc05dcb05ba1f6ca2dfbead17adc8a2e2f911aa80b05e7a36d9eaf96516\",\"dweb:/ipfs/QmVkfHZbXVBUPsTopueCn3qGJX8aEjahFF3Fn4NcygLNm5\"]},\"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xf09e68aa0dc6722a25bc46490e8d48ed864466d17313b8a0b254c36b54e49899\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e26daf81e2252dc1fe1ce0e4b55c2eb7c6d1ee84ae6558d1a9554432ea1d32da\",\"dweb:/ipfs/Qmb1UANWiWq5pCKbmHSu772hd4nt374dVaghGmwSVNuk8Q\"]},\"node_modules/@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b81d9ff6559ea5c47fc573e17ece6d9ba5d6839e213e6ebc3b4c5c8fe4199d7f\",\"dweb:/ipfs/QmPCW1bFisUzJkyjroY3yipwfism9RRCigCcK1hbXtVM8n\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0x809bc3edb4bcbef8263fa616c1b60ee0004b50a8a1bfa164d8f57fd31f520c58\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8b93a1e39a4a19eba1600b92c96f435442db88cac91e315c8291547a2a7bcfe2\",\"dweb:/ipfs/QmTm34KVe6uZBZwq8dZDNWwPcm24qBJdxqL3rPxBJ4LrMv\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol\":{\"keccak256\":\"0x8432884527a7ad91e6eed1cfc5a0811ae2073e5bca107bd0ca442e9236b03dbd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e3aa0eadab7aafcf91a95684765f778f64386f0368de88522ce873c21385278a\",\"dweb:/ipfs/QmPfaVAqWgH1QsT3dHVuL6jwMZbVKdoP8w1PvpiPT2FPWd\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f\",\"dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy\"]},\"node_modules/@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cc8841b3cd48ad125e2f46323c8bad3aa0e88e399ec62acb9e57efa7e7c8058c\",\"dweb:/ipfs/QmSqE4mXHA2BXW58deDbXE8MTcsL5JSKNDbm23sVQxRLPS\"]},\"node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x52a8cfb0f5239d11b457dcdd1b326992ef672714ca8da71a157255bddd13f3ad\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://495145362c7ff1c9ca88c58bbbbcb412e3c2004406647412394486552ff6c278\",\"dweb:/ipfs/QmNNCeng6d5eRPDn6tkWSQhjE39XWfQEfjA63rRwHmr1iH\"]},\"node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c50fcc459e49a9858b6d8ad5f911295cb7c9ab57567845a250bf0153f84a95c7\",\"dweb:/ipfs/QmcEW85JRzvDkQggxiBBLVAasXWdkhEysqypj9EaB6H2g6\"]}},\"version\":1}", + "bytecode": "0x60a06040523480156200001157600080fd5b506040516200169338038062001693833981016040819052620000349162000574565b6200003f336200032a565b6001600160a01b038416608052620000578362000354565b8051825114620000ba5760405162461bcd60e51b8152602060048201526024808201527f4d696e744d616e616765723a20696e76616c6964206c656e677468206f6620616044820152637272617960e01b60648201526084015b60405180910390fd5b6000805b835181101562000295576000848281518110620000df57620000df6200066a565b6020026020010151905060006001600160a01b0316816001600160a01b031603620001605760405162461bcd60e51b815260206004820152602a60248201527f4d696e744d616e616765723a20726563697069656e74206164647265737320636044820152690616e6e6f7420626520360b41b6064820152608401620000b1565b60008483815181106200017757620001776200066a565b6020026020010151905080600003620001d35760405162461bcd60e51b815260206004820152601e60248201527f4d696e744d616e616765723a2073686172652063616e6e6f74206265203000006044820152606401620000b1565b6001600160a01b03821660009081526003602052604081205490036200023f57600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0384161790555b6001600160a01b038216600090815260036020526040812080548392906200026990849062000696565b909155506200027b9050818562000696565b9350505080806200028c90620006b1565b915050620000be565b50620186a08111156200031f5760405162461bcd60e51b8152602060048201526044602482018190527f4d696e744d616e616765723a206d617820746f74616c20736861726520697320908201527f657175616c206f72206c657373207468616e2053484152455f44454e4f4d494e60648201526320aa27a960e11b608482015260a401620000b1565b5050505050620006cd565b600180546001600160a01b03191690556200035181620003c7602090811b62000b5317901c565b50565b6200035e62000417565b600180546001600160a01b0319166001600160a01b0383169081179091556200038f6000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b03163314620004735760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620000b1565b565b80516001600160a01b03811681146200048d57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620004d357620004d362000492565b604052919050565b60006001600160401b03821115620004f757620004f762000492565b5060051b60200190565b600082601f8301126200051357600080fd5b815160206200052c6200052683620004db565b620004a8565b82815260059290921b840181019181810190868411156200054c57600080fd5b8286015b8481101562000569578051835291830191830162000550565b509695505050505050565b600080600080608085870312156200058b57600080fd5b620005968562000475565b93506020620005a781870162000475565b60408701519094506001600160401b0380821115620005c557600080fd5b818801915088601f830112620005da57600080fd5b8151620005eb6200052682620004db565b81815260059190911b8301840190848101908b8311156200060b57600080fd5b938501935b828510156200063457620006248562000475565b8252938501939085019062000610565b60608b015190975094505050808311156200064e57600080fd5b50506200065e8782880162000501565b91505092959194509250565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115620006ac57620006ac62000680565b500190565b600060018201620006c657620006c662000680565b5060010190565b608051610f796200071a6000396000818161014f01528181610331015281816104a3015281816105610152818161062e0152818161080a015281816108b30152610a190152610f796000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80637eb1184511610097578063d1bc76a111610066578063d1bc76a114610229578063e30c39781461023c578063e4fc6b6d1461025a578063f2fde38b1461026257600080fd5b80637eb11845146101ee5780638da5cb5b146101f857806398f1312e14610216578063baee5ed41461022157600080fd5b8063457c3977116100d3578063457c3977146101965780634f02c420146101a9578063715018a6146101de57806379ba5097146101e657600080fd5b80631249c58b1461010557806321e5e2c41461010f57806328df3f18146101425780632efd46d61461014a575b600080fd5b61010d610275565b005b61012f61011d366004610c7a565b60036020526000908152604090205481565b6040519081526020015b60405180910390f35b61010d610557565b6101717f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610139565b61010d6101a4366004610c7a565b6105e1565b6001546101ce9074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610139565b61010d61068d565b61010d6106a1565b61012f620186a081565b60005473ffffffffffffffffffffffffffffffffffffffff16610171565b61012f633b9aca0081565b61010d610756565b610171610237366004610cb7565b610870565b60015473ffffffffffffffffffffffffffffffffffffffff16610171565b61010d6108a7565b61010d610270366004610c7a565b610aa3565b61027d610bc8565b60015474010000000000000000000000000000000000000000900460ff161561032d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4d696e744d616e616765723a20616c7265616479206d696e746564206f6e207460448201527f68697320636861696e000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561039a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103be9190610cd0565b6103c990600a610e44565b6103d790633b9aca00610e53565b90506000805b60025481101561046d576000600282815481106103fc576103fc610e90565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168083526003909152604082205490925090620186a061043f8388610e53565b6104499190610ebf565b90506104558186610efa565b9450505050808061046590610f12565b9150506103dd565b506040517f40c10f19000000000000000000000000000000000000000000000000000000008152306004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906340c10f1990604401600060405180830381600087803b1580156104fc57600080fd5b505af1158015610510573d6000803e3d6000fd5b5050600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905550505050565b61055f610bc8565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379ba50976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105c757600080fd5b505af11580156105db573d6000803e3d6000fd5b50505050565b6105e9610bc8565b6040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063f2fde38b90602401600060405180830381600087803b15801561067257600080fd5b505af1158015610686573d6000803e3d6000fd5b5050505050565b610695610bc8565b61069f6000610c49565b565b600154339073ffffffffffffffffffffffffffffffffffffffff16811461074a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610324565b61075381610c49565b50565b61075e610bc8565b60015474010000000000000000000000000000000000000000900460ff16610808576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4d696e744d616e616765723a206e6f74206d696e746564206265666f7265207260448201527f656e6f756e6365206f776e6572736869700000000000000000000000000000006064820152608401610324565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663715018a66040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105c757600080fd5b6002818154811061088057600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b6108af610bc8565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561091c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109409190610cd0565b61094b90600a610e44565b61095990633b9aca00610e53565b905060005b600254811015610a9f5760006002828154811061097d5761097d610e90565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168083526003909152604082205490925090620186a06109c08387610e53565b6109ca9190610ebf565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af1158015610a64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a889190610f4a565b505050508080610a9790610f12565b91505061095e565b5050565b610aab610bc8565b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009091168117909155610b0e60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461069f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610324565b600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905561075381610b53565b600060208284031215610c8c57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610cb057600080fd5b9392505050565b600060208284031215610cc957600080fd5b5035919050565b600060208284031215610ce257600080fd5b815160ff81168114610cb057600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b80851115610d7b57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610d6157610d61610cf3565b80851615610d6e57918102915b93841c9390800290610d27565b509250929050565b600082610d9257506001610e3e565b81610d9f57506000610e3e565b8160018114610db55760028114610dbf57610ddb565b6001915050610e3e565b60ff841115610dd057610dd0610cf3565b50506001821b610e3e565b5060208310610133831016604e8410600b8410161715610dfe575081810a610e3e565b610e088383610d22565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610e3a57610e3a610cf3565b0290505b92915050565b6000610cb060ff841683610d83565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610e8b57610e8b610cf3565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082610ef5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008219821115610f0d57610f0d610cf3565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610f4357610f43610cf3565b5060010190565b600060208284031215610f5c57600080fd5b81518015158114610cb057600080fdfea164736f6c634300080f000a", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101005760003560e01c80637eb1184511610097578063d1bc76a111610066578063d1bc76a114610229578063e30c39781461023c578063e4fc6b6d1461025a578063f2fde38b1461026257600080fd5b80637eb11845146101ee5780638da5cb5b146101f857806398f1312e14610216578063baee5ed41461022157600080fd5b8063457c3977116100d3578063457c3977146101965780634f02c420146101a9578063715018a6146101de57806379ba5097146101e657600080fd5b80631249c58b1461010557806321e5e2c41461010f57806328df3f18146101425780632efd46d61461014a575b600080fd5b61010d610275565b005b61012f61011d366004610c7a565b60036020526000908152604090205481565b6040519081526020015b60405180910390f35b61010d610557565b6101717f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610139565b61010d6101a4366004610c7a565b6105e1565b6001546101ce9074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610139565b61010d61068d565b61010d6106a1565b61012f620186a081565b60005473ffffffffffffffffffffffffffffffffffffffff16610171565b61012f633b9aca0081565b61010d610756565b610171610237366004610cb7565b610870565b60015473ffffffffffffffffffffffffffffffffffffffff16610171565b61010d6108a7565b61010d610270366004610c7a565b610aa3565b61027d610bc8565b60015474010000000000000000000000000000000000000000900460ff161561032d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4d696e744d616e616765723a20616c7265616479206d696e746564206f6e207460448201527f68697320636861696e000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561039a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103be9190610cd0565b6103c990600a610e44565b6103d790633b9aca00610e53565b90506000805b60025481101561046d576000600282815481106103fc576103fc610e90565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168083526003909152604082205490925090620186a061043f8388610e53565b6104499190610ebf565b90506104558186610efa565b9450505050808061046590610f12565b9150506103dd565b506040517f40c10f19000000000000000000000000000000000000000000000000000000008152306004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906340c10f1990604401600060405180830381600087803b1580156104fc57600080fd5b505af1158015610510573d6000803e3d6000fd5b5050600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905550505050565b61055f610bc8565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379ba50976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105c757600080fd5b505af11580156105db573d6000803e3d6000fd5b50505050565b6105e9610bc8565b6040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063f2fde38b90602401600060405180830381600087803b15801561067257600080fd5b505af1158015610686573d6000803e3d6000fd5b5050505050565b610695610bc8565b61069f6000610c49565b565b600154339073ffffffffffffffffffffffffffffffffffffffff16811461074a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610324565b61075381610c49565b50565b61075e610bc8565b60015474010000000000000000000000000000000000000000900460ff16610808576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4d696e744d616e616765723a206e6f74206d696e746564206265666f7265207260448201527f656e6f756e6365206f776e6572736869700000000000000000000000000000006064820152608401610324565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663715018a66040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105c757600080fd5b6002818154811061088057600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b6108af610bc8565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561091c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109409190610cd0565b61094b90600a610e44565b61095990633b9aca00610e53565b905060005b600254811015610a9f5760006002828154811061097d5761097d610e90565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168083526003909152604082205490925090620186a06109c08387610e53565b6109ca9190610ebf565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af1158015610a64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a889190610f4a565b505050508080610a9790610f12565b91505061095e565b5050565b610aab610bc8565b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009091168117909155610b0e60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461069f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610324565b600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905561075381610b53565b600060208284031215610c8c57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610cb057600080fd5b9392505050565b600060208284031215610cc957600080fd5b5035919050565b600060208284031215610ce257600080fd5b815160ff81168114610cb057600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b80851115610d7b57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610d6157610d61610cf3565b80851615610d6e57918102915b93841c9390800290610d27565b509250929050565b600082610d9257506001610e3e565b81610d9f57506000610e3e565b8160018114610db55760028114610dbf57610ddb565b6001915050610e3e565b60ff841115610dd057610dd0610cf3565b50506001821b610e3e565b5060208310610133831016604e8410600b8410161715610dfe575081810a610e3e565b610e088383610d22565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610e3a57610e3a610cf3565b0290505b92915050565b6000610cb060ff841683610d83565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610e8b57610e8b610cf3565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082610ef5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008219821115610f0d57610f0d610cf3565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610f4357610f43610cf3565b5060010190565b600060208284031215610f5c57600080fd5b81518015158114610cb057600080fdfea164736f6c634300080f000a", + "devdoc": {}, + "userdoc": {}, + "storageLayout": { + "storage": [ + { + "astId": 1524, + "contract": "contracts/governance/MintManager.sol:MintManager", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 1637, + "contract": "contracts/governance/MintManager.sol:MintManager", + "label": "_pendingOwner", + "offset": 0, + "slot": "1", + "type": "t_address" + }, + { + "astId": 240, + "contract": "contracts/governance/MintManager.sol:MintManager", + "label": "minted", + "offset": 20, + "slot": "1", + "type": "t_bool" + }, + { + "astId": 244, + "contract": "contracts/governance/MintManager.sol:MintManager", + "label": "recipients", + "offset": 0, + "slot": "2", + "type": "t_array(t_address)dyn_storage" + }, + { + "astId": 249, + "contract": "contracts/governance/MintManager.sol:MintManager", + "label": "shareOf", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_uint256)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_address)dyn_storage": { + "encoding": "dynamic_array", + "label": "address[]", + "numberOfBytes": "32", + "base": "t_address" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/mainnet/ZKVerifier.json b/packages/contracts/deployments/mainnet/ZKVerifier.json index 4b51052385..4ae5ffd66a 100644 --- a/packages/contracts/deployments/mainnet/ZKVerifier.json +++ b/packages/contracts/deployments/mainnet/ZKVerifier.json @@ -1,102 +1,107 @@ { - "address": "0x7E79726560B140fd6e089547bD049509F5423BFf", + "address": "0x4cd05aB629055a449617a28E3466660403eA7126", "abi": [ { + "type": "constructor", "inputs": [ { - "internalType": "uint256", "name": "_hashScalar", - "type": "uint256" + "type": "uint256", + "internalType": "uint256" }, { - "internalType": "uint256", "name": "_m56Px", - "type": "uint256" + "type": "uint256", + "internalType": "uint256" }, { - "internalType": "uint256", "name": "_m56Py", - "type": "uint256" + "type": "uint256", + "internalType": "uint256" } ], - "stateMutability": "nonpayable", - "type": "constructor" + "stateMutability": "nonpayable" }, { + "type": "function", + "name": "verify", "inputs": [ { - "internalType": "uint256[]", "name": "proof", - "type": "uint256[]" + "type": "uint256[]", + "internalType": "uint256[]" }, { - "internalType": "uint256[]", "name": "target_circuit_final_pair", - "type": "uint256[]" + "type": "uint256[]", + "internalType": "uint256[]" }, { - "internalType": "bytes32", "name": "publicInputHash", - "type": "bytes32" + "type": "bytes32", + "internalType": "bytes32" } ], - "name": "verify", "outputs": [ { - "internalType": "bool", "name": "", - "type": "bool" + "type": "bool", + "internalType": "bool" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "view" }, { - "inputs": [], + "type": "function", "name": "version", + "inputs": [], "outputs": [ { - "internalType": "string", "name": "", - "type": "string" + "type": "string", + "internalType": "string" } ], - "stateMutability": "view", - "type": "function" + "stateMutability": "view" } ], - "transactionHash": "0xb505eb6b6ac0eaf26dcf07fa1e7cb0b2546877a1d28bd04ff5d6ca8d5853dced", + "transactionHash": "0xec352e40e550c04f04c11ddf71420a25a269d97c43f8e1fa2be8bc5972b7892a", "receipt": { "to": null, "from": "0xcc56801a72463d39903A4a4632E600289178F6bC", - "contractAddress": "0x7E79726560B140fd6e089547bD049509F5423BFf", - "transactionIndex": 118, - "gasUsed": "5195277", + "contractAddress": "0x4cd05aB629055a449617a28E3466660403eA7126", + "transactionIndex": 53, + "gasUsed": "5054782", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x01fe92043d099374171d5fa90c161e8dcd732047839ed561b1719bd1e8233a1a", - "transactionHash": "0xb505eb6b6ac0eaf26dcf07fa1e7cb0b2546877a1d28bd04ff5d6ca8d5853dced", + "blockHash": "0xafac1c4f4063c8f0de50d9eef909648cb7e0fc23c478ed49605d7cd702a6022d", + "transactionHash": "0xec352e40e550c04f04c11ddf71420a25a269d97c43f8e1fa2be8bc5972b7892a", "logs": [], - "blockNumber": 18038715, - "cumulativeGasUsed": "14179494", + "blockNumber": 20116071, + "cumulativeGasUsed": "12776601", "status": 1, "byzantium": true }, "args": [ - "0x163b85414bb5a9c97d8249f96b9c4ffd8db3e8081133101a14fc8546b704e2b", - "0x2aa452092865578d9b68a69f053df3db7a563b7cc7d17c9cce524632ccb30d85", - "0xafcccd2c2ebc8ffb530403bb07d4e1bcfc1aa910d4dd08d7cd81fcafef5e556" + "0x2FC715229F110C0240EEE5BDE4C9A1AD3BCD8F344A7450BB54D83BF2AB204F57", + "0x13AFF223C765EE57720AD99D4DAEF90D6509B97318A84CB5D926295874DFB9A8", + "0x2F94CE8D448F4C3FC89DBDF3320EE1850B3FFDC50D260E2BB09F6FEAED846B1B" ], - "numDeployments": 2, - "solcInputHash": "b97aafec05891224459cbb7c22d23f0d", - "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"proof\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"target_circuit_final_pair\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes32\",\"name\":\"publicInputHash\",\"type\":\"bytes32\"}],\"name\":\"verify\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/ZKVerifier.sol\":\"ZKVerifier\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin/=node_modules/@openzeppelin/\",\":@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/\",\":@rari-capital/=node_modules/@rari-capital/\",\":@rari-capital/solmate/=node_modules/@rari-capital/solmate/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\"]},\"sources\":{\"contracts/L1/ZKVerifier.sol\":{\"keccak256\":\"0xde94b81cad31c782039a4f2ed86183a357c00272e6cbdbd56cdb0b4f3c56c1af\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://9377c20389f8490e3af59d8f02f37023643824c449a7e1078258e955adb819df\",\"dweb:/ipfs/QmSb8gY7xtntFvFXpTU8i9K6PkGBTYcYspNtNKbE2nhcU8\"]}},\"version\":1}", - "bytecode": "0x6101406040523480156200001257600080fd5b5060405162005dd738038062005dd7833981016040819052620000359162000058565b6000608052600160a052600460c05260e092909252610100526101205262000087565b6000806000606084860312156200006e57600080fd5b8351925060208401519150604084015190509250925092565b60805160a05160c05160e0516101005161012051615d00620000d76000396000614a0d015260006149ec0152600061078301526000610520015260006104f7015260006104ce0152615d006000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80634292dc3e1461003b57806354fd4d5014610063575b600080fd5b61004e610049366004615979565b610078565b60405190151581526020015b60405180910390f35b61006b6104c7565b60405161005a9190615a1d565b6000610082615816565b8484600081811061009557610095615a6e565b9050602002013570ffffffffffffffffffffffffffffffffff16816000600681106100c2576100c2615a6e565b60200201526088858560018181106100dc576100dc615a6e565b90506020020135600116901b6088868660008181106100fd576100fd615a6e565b90506020020135901c6101109190615acc565b60208201528484600281811061012857610128615a6e565b9050602002013570ffffffffffffffffffffffffffffffffff168160026006811061015557610155615a6e565b602002015260888585600381811061016f5761016f615a6e565b90506020020135600116901b60888686600281811061019057610190615a6e565b90506020020135901c6101a39190615acc565b606080830191909152608084811c908301526fffffffffffffffffffffffffffffffff841660a08301526040805160028082529281019091526000918291829182918291816020015b60408051808201909152600080825260208201528152602001906001900390816101ec5750506040805160028082526060820190925291925060009190602082015b610236615834565b81526020019060019003908161022e5790505090506102568d8d8961056a565b855193995090975090955093508690839060009061027657610276615a6e565b60200260200101516000018181525050838260008151811061029a5761029a615a6e565b6020026020010151602001818152505084826001815181106102be576102be615a6e565b6020026020010151600001818152505082826001815181106102e2576102e2615a6e565b602002602001015160200181815250506102fa614ad2565b8160008151811061030d5761030d615a6e565b6020026020010181905250610320614b7d565b8160018151811061033357610333615a6e565b60200260200101819052506103488282614c24565b61035c5760009750505050505050506104be565b8a8a600081811061036f5761036f615a6e565b905060200201358260008151811061038957610389615a6e565b6020908102919091010151528a8a60018181106103a8576103a8615a6e565b90506020020135826000815181106103c2576103c2615a6e565b602002602001015160200181815250508a8a60028181106103e5576103e5615a6e565b90506020020135826001815181106103ff576103ff615a6e565b6020908102919091010151528a8a600381811061041e5761041e615a6e565b905060200201358260018151811061043857610438615a6e565b60200260200101516020018181525050610450614ad2565b8160008151811061046357610463615a6e565b6020026020010181905250610476614b7d565b8160018151811061048957610489615a6e565b602002602001018190525061049e8282614c24565b6104b25760009750505050505050506104be565b60019750505050505050505b95945050505050565b60606104f27f0000000000000000000000000000000000000000000000000000000000000000614ef8565b61051b7f0000000000000000000000000000000000000000000000000000000000000000614ef8565b6105447f0000000000000000000000000000000000000000000000000000000000000000614ef8565b60405160200161055693929190615b13565b604051602081830303815290604052905090565b600080600080610578615859565b610580615878565b6000806105d57f2754b04f3f510d0e86a0d0e811f0fc16f92b722514e1729066d2abf90811d6f27f1816b0f9909a5a979bd34c559e57b4096bee5cce7eb668bc0a9805677f40dc858b845b6020020151614fb6565b909250905061062f7f174fa57071f8f6e53fcb31a5ecc33274ec76e4e186eeb0b64255d2f314cd50b27f1c399365e85e4de2761ebcf350da85ff4518cc82f7cef64a477a7a5fd11d4a448b60015b6020020151858561501c565b90925090506106817f259a4d5cd83279b6dc9ca2008b669f82e91f23804e2524c5087a2452d52c33bd7f303abddb7ae0f35e3a6bd39314b347c3c3a433f72833dda1998ad2176258baa38b6002610623565b90925090506106d37f252b158900f31a7c0c00b924e7d3c8d61a60c5e9fd2b83251ba73d1dc0b680f57f29c8c2b3f0d74267bc2b0f9f3568838cdb0eee4719391790d93d0015c00ce5af8b6003610623565b90925090506107257f0c25f9f3c38b6a128d7d38c5625a3976d389b5f9f33098bb419968e4d18e150e7f21fb777462c7f4af71940423babc7f882f0c97be9620ef84f6f11974ee0edb8e8b6004610623565b90925090506107777f2280a0fd7dbf95c450830906ffc607a373d5b9b56b9101138e925ad557eb355a7f0697ab7e9a5377e2759ab6d1283301ccae9c72bad14946a9513ee19be1ec825e8b6005610623565b602086015284526107aa7f0000000000000000000000000000000000000000000000000000000000000000846000615068565b835160208501516107be91908560026150b4565b600091505b6004821161085c5761084a8b8b6107db856002615b89565b6107e6906000615acc565b8181106107f5576107f5615a6e565b905060200201358c8c85600261080b9190615b89565b610816906001615acc565b81811061082557610825615a6e565b905060200201358585600361083a9190615b89565b610845906005615acc565b6150b4565b8161085481615bc6565b9250506107c3565b610867836014615124565b6040850152600091505b600d8211610905576108f38b8b610889856002615b89565b61089490600a615acc565b8181106108a3576108a3615a6e565b905060200201358c8c8560026108b99190615b89565b6108c490600b615acc565b8181106108d3576108d3615a6e565b90506020020135858560036108e89190615b89565b610845906001615acc565b816108fd81615bc6565b925050610871565b61091083602b615124565b6060850152610920836001615124565b6080850152600091505b6009821161098f5761097d8b8b610942856002615b89565b61094d906026615acc565b81811061095c5761095c615a6e565b905060200201358c8c8560026109729190615b89565b6108c4906027615acc565b8161098781615bc6565b92505061092a565b61099a83601f615124565b60a0850152600091505b60038211610a09576109f78b8b6109bc856002615b89565b6109c790603a615acc565b8181106109d6576109d6615a6e565b905060200201358c8c8560026109ec9190615b89565b6108c490603b615acc565b81610a0181615bc6565b9250506109a4565b610a1483600d615124565b60c0850152600091505b60468211610a8757610a758b8b610a36856001615b89565b610a41906042615acc565b818110610a5057610a50615a6e565b9050602002013584846002610a659190615b89565b610a70906001615acc565b615068565b81610a7f81615bc6565b925050610a1e565b610a9283608f615124565b60e0850152600091505b60038211610b0157610aef8b8b610ab4856002615b89565b610abf906089615acc565b818110610ace57610ace615a6e565b905060200201358c8c856002610ae49190615b89565b6108c490608a615acc565b81610af981615bc6565b925050610a9c565b610b0c83600d615124565b61010085015260c0840151600080516020615cd4833981519152907f1dba8b5bdd64ef6ce29a9039aca3c0e524395c43b9227b96c75090cc6cc7ec97900961012085015260c0840151600080516020615cd4833981519152907f24a1fcd63e9f03b27281db85fe631ec8e5c466f8178a4ee94d4942b7ccd90e1c900961014085015260c0840151600080516020615cd4833981519152907f20bab6e5f766b4edf82399e9c5ff0e40d4b6875321a3d8020e18521d8f5c7241900961016085015260c0840151610bdf906304000000615186565b610180850152600080516020615cd4833981519152610bff600182615bfe565b610180860151086101a08501819052600080516020615cd4833981519152907f30644e66c81e03716be83b486d6feabcc7ddd0fe6cbf5e72d585d142f7829b05096101c0850152600080516020615cd4833981519152610c60600182615bfe565b60c0860151089150610c7a84600e5b6020020151836151ed565b6101c08501526101a0840151600080516020615cd4833981519152907f07baaa5b7af9cf52cd226bc56865f0f99ef8fcd4219060f09f43e9a148b5ab68096101e0850152600080516020615cd4833981519152610cf77f20bab6e5f766b4edf82399e9c5ff0e40d4b6875321a3d8020e18521d8f5c724182615bfe565b60c0860151089150610d0a84600f610c6f565b6101e08501526101a0840151600080516020615cd4833981519152907f1c699f652457365bf2fc4fa2c5c63d6c4349b03cb46d633d7a2655c5da4b900a09610200850152600080516020615cd4833981519152610d877f19277f31ecb5bfe8604677099c09556812b0b5c50cceb2b584098183a5a6c5c882615bfe565b60c0860151089150610d9a846010610c6f565b6102008501526101a0840151600080516020615cd4833981519152907f205cdbaf03903a5c23e60eef0df90673bc65a25762694c501e3281153b4e588a09610220850152600080516020615cd4833981519152610e177f082a7bd4c0a7e4352229d332c27a160da18f0d7c651f3047df41b80345532f6e82615bfe565b60c0860151089150610e2a846011610c6f565b6102208501526101a0840151600080516020615cd4833981519152907f27db73b1a831278e143aab90091db38afdea3294c4ba05d1c697a392eb09cc7909610240850152600080516020615cd4833981519152610ea77f26501ebfe559ea5826f023d3e76e4b66f170cd940408eb5590a4075c80b498d682615bfe565b60c0860151089150610eba846012610c6f565b6102408501526101a0840151600080516020615cd4833981519152907f0204822d629ab653697f028f5fa17d23ac2ba08c60c7112d98ebd28f325f0af609610260850152600080516020615cd4833981519152610f377f0d5eb4c216db2c3262de3f6a2ef71a9be95ff21a7a1a50ed069d6131e7d54e5f82615bfe565b60c0860151089150610f4a846013610c6f565b6102608501526101a0840151600080516020615cd4833981519152907f2622622a60c0d9327ccf066a0f1fce13c48601b976affd1f41c2a72a9f77da6409610280850152600080516020615cd4833981519152610fc77f24a1fcd63e9f03b27281db85fe631ec8e5c466f8178a4ee94d4942b7ccd90e1c82615bfe565b60c0860151089150610fda846014610c6f565b6102808501526102008401516101e0850151600080516020615cd48339815191529190089150600080516020615cd4833981519152846011602002015183089150600080516020615cd4833981519152846012602002015183089150600080516020615cd4833981519152846013602002015183086101e08501526110ab8b8b604a81811061106b5761106b615a6e565b905060200201358c8c604881811061108557611085615a6e565b905060200201358d8d604981811061109f5761109f615a6e565b9050602002013561521d565b91506110ea8b8b604b8181106110c3576110c3615a6e565b905060200201358c8c60438181106110dd576110dd615a6e565b905060200201358461521d565b915061111c8b8b604c81811061110257611102615a6e565b905060200201358c8c60448181106110dd576110dd615a6e565b915061114e8b8b604d81811061113457611134615a6e565b905060200201358c8c60458181106110dd576110dd615a6e565b91506111808b8b604e81811061116657611166615a6e565b905060200201358c8c60468181106110dd576110dd615a6e565b91506111b28b8b604f81811061119857611198615a6e565b905060200201358c8c60478181106110dd576110dd615a6e565b610200850152600080516020615cd48339815191528b8b60448181106111da576111da615a6e565b905060200201358c8c60438181106111f4576111f4615a6e565b905060200201350991506112398b8b605081811061121457611214615a6e565b90506020020135838660106054811061122f5761122f615a6e565b602002015161521d565b610200850152600080516020615cd48339815191528b8b604681811061126157611261615a6e565b905060200201358c8c604581811061127b5761127b615a6e565b9050602002013509915061129b8b8b605181811061121457611214615a6e565b610200850152600080516020615cd48339815191528b8b60618181106112c3576112c3615a6e565b90506020020135600080516020615cd48339815191526112e39190615bfe565b6001089150600080516020615cd48339815191528285600e602002015109610220850152600080516020615cd48339815191528b8b606481811061132957611329615a6e565b905060200201358c8c606481811061134357611343615a6e565b90506020020135099150600080516020615cd48339815191528b8b606481811061136f5761136f615a6e565b90506020020135600080516020615cd483398151915261138f9190615bfe565b83089150600080516020615cd483398151915282856014602002015109610240850152600080516020615cd48339815191528b8b60638181106113d4576113d4615a6e565b90506020020135600080516020615cd48339815191526113f49190615bfe565b8c8c606481811061140757611407615a6e565b90506020020135089150600080516020615cd483398151915284600e6020020151830961026085015260c08401516060850151600080516020615cd48339815191529190096102a08501526101e0840151610280850151600080516020615cd48339815191529190089150600080516020615cd483398151915261149983600080516020615cd4833981519152615bfe565b6001086101e08501526080840151600080516020615cd4833981519152908c8c60438181106114ca576114ca615a6e565b90506020020135086102c08501526115158b8b605b8181106114ee576114ee615a6e565b905060200201358560036054811061150857611508615a6e565b602002015186601661122f565b9150600080516020615cd48339815191528b8b606281811061153957611539615a6e565b9050602002013583096102e08501526102a08401516102c0850151600080516020615cd48339815191529190089150600080516020615cd48339815191528b8b606181811061158a5761158a615a6e565b9050602002013583096102c08501526102a0840151600080516020615cd4833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096103008501526080840151600080516020615cd4833981519152908c8c60448181106115ff576115ff615a6e565b905060200201350861032085015261164a8b8b605c81811061162357611623615a6e565b905060200201358560036054811061163d5761163d615a6e565b602002015186601961122f565b9150600080516020615cd4833981519152846017602002015183096102e0850152610300840151610320850151600080516020615cd48339815191529190089150600080516020615cd4833981519152846016602002015183096102c0850152610300840151600080516020615cd4833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096103008501526080840151600080516020615cd4833981519152908c8c604581811061171057611710615a6e565b90506020020135086103208501526117348b8b605d81811061162357611623615a6e565b9150600080516020615cd4833981519152846017602002015183096102e0850152610300840151610320850151600080516020615cd48339815191529190089150600080516020615cd4833981519152846016602002015183096102c0850152610300840151600080516020615cd4833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096103008501526102c0840151600080516020615cd4833981519152906117f29082615bfe565b6102e0860151089150600080516020615cd483398151915284600f602002015183096102c08501526102a0840151600080516020615cd4833981519152907f18afdf23e9bd9302673fc1e076a492d4d65bd18ebc4d854ed189139bab313e5290096102a08501526080840151600080516020615cd4833981519152908c8c604681811061188157611881615a6e565b90506020020135086102e08501526118cc8b8b605e8181106118a5576118a5615a6e565b90506020020135856003605481106118bf576118bf615a6e565b602002015186601761122f565b9150600080516020615cd48339815191528b8b60658181106118f0576118f0615a6e565b9050602002013583096103008501526102a08401516102e0850151600080516020615cd48339815191529190089150600080516020615cd48339815191528b8b606481811061194157611941615a6e565b9050602002013583096102e08501526102a0840151600080516020615cd4833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096102a08501526080840151600080516020615cd4833981519152908c8c60478181106119b6576119b6615a6e565b90506020020135086103208501526119da8b8b605f81811061162357611623615a6e565b9150600080516020615cd4833981519152846018602002015183096103008501526102a0840151610320850151600080516020615cd48339815191529190089150600080516020615cd4833981519152846017602002015183096102e08501526102a0840151600080516020615cd4833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096102a08501526080840151600080516020615cd4833981519152908c8c6042818110611aa057611aa0615a6e565b9050602002013508610320850152611ac48b8b606081811061162357611623615a6e565b9150600080516020615cd4833981519152846018602002015183096103008501526102a0840151610320850151600080516020615cd48339815191529190089150600080516020615cd4833981519152846017602002015183096102e08501526102a0840151600080516020615cd4833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096102a08501526102e0840151600080516020615cd483398151915290611b829082615bfe565b610300860151089150600080516020615cd483398151915284600f602002015183096102a08501526060840151600080516020615cd4833981519152908c8c6068818110611bd257611bd2615a6e565b90506020020135089150600080516020615cd4833981519152828c8c6067818110611bff57611bff615a6e565b90506020020135096102e08501526080840151600080516020615cd4833981519152908c8c606a818110611c3557611c35615a6e565b90506020020135089150600080516020615cd4833981519152828560176020020151096102e0850152600080516020615cd48339815191528b8b6052818110611c8057611c80615a6e565b905060200201358c8c6043818110611c9a57611c9a615a6e565b90506020020135096103008501526040840151600080516020615cd48339815191529060000960408501819052610300850151600080516020615cd48339815191529108610300850152600080516020615cd48339815191528b8b6053818110611d0657611d06615a6e565b9050602002013585600260548110611d2057611d20615a6e565b602002015108610320850152600080516020615cd48339815191528b8b606a818110611d4e57611d4e615a6e565b90506020020135600080516020615cd4833981519152611d6e9190615bfe565b8c8c6068818110611d8157611d81615a6e565b9050602002013508610340850152600080516020615cd48339815191528b8b6066818110611db157611db1615a6e565b90506020020135600080516020615cd4833981519152611dd19190615bfe565b6001089150600080516020615cd48339815191528285600e602002015109610360850152600080516020615cd48339815191528b8b6066818110611e1757611e17615a6e565b905060200201358c8c6066818110611e3157611e31615a6e565b90506020020135099150600080516020615cd48339815191528b8b6066818110611e5d57611e5d615a6e565b90506020020135600080516020615cd4833981519152611e7d9190615bfe565b83089150600080516020615cd4833981519152828560146020020151096103808501526060840151610300850151600080516020615cd48339815191529190089150600080516020615cd4833981519152828c8c6066818110611ee257611ee2615a6e565b90506020020135096103008501526080840151610320850151600080516020615cd48339815191529190086103208501819052610300850151600080516020615cd48339815191529190099150600080516020615cd4833981519152611f5683600080516020615cd4833981519152615bfe565b6102e0860151089150600080516020615cd483398151915284600f602002015183096102e08501526103408401516101c0850151600080516020615cd4833981519152919009610300850152600080516020615cd48339815191528b8b6069818110611fc457611fc4615a6e565b90506020020135600080516020615cd4833981519152611fe49190615bfe565b8c8c6068818110611ff757611ff7615a6e565b90506020020135089150600080516020615cd48339815191528285601a6020020151099150600080516020615cd483398151915284600f602002015183096103408501526060840151600080516020615cd4833981519152908c8c606d81811061206357612063615a6e565b90506020020135089150600080516020615cd4833981519152828c8c606c81811061209057612090615a6e565b90506020020135096103a08501526080840151600080516020615cd4833981519152908c8c606f8181106120c6576120c6615a6e565b90506020020135089150600080516020615cd48339815191528285601d6020020151096103a08501526121398b8b605281811061210557612105615a6e565b905060200201358c8c604481811061211f5761211f615a6e565b905060200201358660026054811061122f5761122f615a6e565b6103c0850152600080516020615cd48339815191528b8b606f81811061216157612161615a6e565b90506020020135600080516020615cd48339815191526121819190615bfe565b8c8c606d81811061219457612194615a6e565b90506020020135086103e0850152600080516020615cd48339815191528b8b606b8181106121c4576121c4615a6e565b90506020020135600080516020615cd48339815191526121e49190615bfe565b6001089150600080516020615cd48339815191528285600e602002015109610400850152600080516020615cd48339815191528b8b606b81811061222a5761222a615a6e565b905060200201358c8c606b81811061224457612244615a6e565b90506020020135099150600080516020615cd48339815191528b8b606b81811061227057612270615a6e565b90506020020135600080516020615cd48339815191526122909190615bfe565b83089150600080516020615cd48339815191528285601460200201510961042085015260608401516103c0850151600080516020615cd48339815191529190089150600080516020615cd4833981519152828c8c606b8181106122f5576122f5615a6e565b90506020020135099150600080516020615cd4833981519152846019602002015183099150600080516020615cd483398151915261234183600080516020615cd4833981519152615bfe565b6103a0860151089150600080516020615cd483398151915284600f602002015183096103a08501526103e08401516101c0850151600080516020615cd48339815191529190096103c0850152600080516020615cd48339815191528b8b606e8181106123af576123af615a6e565b90506020020135600080516020615cd48339815191526123cf9190615bfe565b8c8c606d8181106123e2576123e2615a6e565b90506020020135089150600080516020615cd48339815191528285601f6020020151099150600080516020615cd483398151915284600f602002015183096103e08501526060840151600080516020615cd4833981519152908c8c607281811061244e5761244e615a6e565b90506020020135089150600080516020615cd4833981519152828c8c607181811061247b5761247b615a6e565b90506020020135096104408501526080840151600080516020615cd4833981519152908c8c60748181106124b1576124b1615a6e565b90506020020135089150600080516020615cd48339815191528285602260200201510961044085015261250a8b8b60528181106124f0576124f0615a6e565b905060200201358c8c604581811061211f5761211f615a6e565b610460850152600080516020615cd48339815191528b8b607481811061253257612532615a6e565b90506020020135600080516020615cd48339815191526125529190615bfe565b8c8c607281811061256557612565615a6e565b9050602002013508610480850152600080516020615cd48339815191528b8b607081811061259557612595615a6e565b90506020020135600080516020615cd48339815191526125b59190615bfe565b6001089150600080516020615cd48339815191528285600e6020020151096104a0850152600080516020615cd48339815191528b8b60708181106125fb576125fb615a6e565b905060200201358c8c607081811061261557612615615a6e565b90506020020135099150600080516020615cd48339815191528b8b607081811061264157612641615a6e565b90506020020135600080516020615cd48339815191526126619190615bfe565b83089150600080516020615cd4833981519152828560146020020151096104c08501526060840151610460850151600080516020615cd48339815191529190089150600080516020615cd4833981519152828c8c60708181106126c6576126c6615a6e565b90506020020135099150600080516020615cd4833981519152846019602002015183099150600080516020615cd483398151915261271283600080516020615cd4833981519152615bfe565b610440860151089150600080516020615cd483398151915284600f602002015183096104408501526104808401516101c0850151600080516020615cd4833981519152919009610460850152600080516020615cd48339815191528b8b607381811061278057612780615a6e565b90506020020135600080516020615cd48339815191526127a09190615bfe565b8c8c60728181106127b3576127b3615a6e565b90506020020135089150600080516020615cd4833981519152828560246020020151099150600080516020615cd483398151915284600f602002015183096104808501526060840151600080516020615cd4833981519152908c8c607781811061281f5761281f615a6e565b90506020020135089150600080516020615cd4833981519152828c8c607681811061284c5761284c615a6e565b90506020020135096104e08501526080840151600080516020615cd4833981519152908c8c607981811061288257612882615a6e565b90506020020135089150600080516020615cd4833981519152828560276020020151096104e08501526128db8b8b60528181106128c1576128c1615a6e565b905060200201358c8c604681811061211f5761211f615a6e565b610500850152600080516020615cd48339815191528b8b607981811061290357612903615a6e565b90506020020135600080516020615cd48339815191526129239190615bfe565b8c8c607781811061293657612936615a6e565b9050602002013508610520850152600080516020615cd48339815191528b8b607581811061296657612966615a6e565b90506020020135600080516020615cd48339815191526129869190615bfe565b6001089150600080516020615cd48339815191528285600e602002015109610540850152600080516020615cd48339815191528b8b60758181106129cc576129cc615a6e565b905060200201358c8c60758181106129e6576129e6615a6e565b90506020020135099150600080516020615cd48339815191528b8b6075818110612a1257612a12615a6e565b90506020020135600080516020615cd4833981519152612a329190615bfe565b83089150600080516020615cd4833981519152828560146020020151096105608501526060840151610500850151600080516020615cd48339815191529190089150600080516020615cd4833981519152828c8c6075818110612a9757612a97615a6e565b90506020020135099150600080516020615cd4833981519152846019602002015183099150600080516020615cd4833981519152612ae383600080516020615cd4833981519152615bfe565b6104e0860151089150600080516020615cd483398151915284600f602002015183096103208501526105208401516101c0850151600080516020615cd48339815191529190096104e0850152600080516020615cd48339815191528b8b6078818110612b5157612b51615a6e565b90506020020135600080516020615cd4833981519152612b719190615bfe565b8c8c6077818110612b8457612b84615a6e565b90506020020135089150600080516020615cd4833981519152828560296020020151099150600080516020615cd483398151915284600f602002015183096105008501526060840151600080516020615cd4833981519152908c8c607c818110612bf057612bf0615a6e565b90506020020135089150600080516020615cd4833981519152828c8c607b818110612c1d57612c1d615a6e565b90506020020135096105208501526080840151600080516020615cd4833981519152908c8c607e818110612c5357612c53615a6e565b90506020020135089150600080516020615cd483398151915282856029602002015109610520850152612cac8b8b6054818110612c9257612c92615a6e565b905060200201358c8c604381811061211f5761211f615a6e565b610580850152600080516020615cd48339815191528b8b6055818110612cd457612cd4615a6e565b9050602002013585600260548110612cee57612cee615a6e565b6020020151086105a0850152600080516020615cd48339815191528b8b607e818110612d1c57612d1c615a6e565b90506020020135600080516020615cd4833981519152612d3c9190615bfe565b8c8c607c818110612d4f57612d4f615a6e565b90506020020135086105c0850152600080516020615cd48339815191528b8b607a818110612d7f57612d7f615a6e565b90506020020135600080516020615cd4833981519152612d9f9190615bfe565b6001089150600080516020615cd48339815191528285600e6020020151096105e0850152600080516020615cd48339815191528b8b607a818110612de557612de5615a6e565b905060200201358c8c607a818110612dff57612dff615a6e565b90506020020135099150600080516020615cd48339815191528b8b607a818110612e2b57612e2b615a6e565b90506020020135600080516020615cd4833981519152612e4b9190615bfe565b83089150600080516020615cd4833981519152828560146020020151096106008501526060840151610580850151600080516020615cd48339815191529190089150600080516020615cd4833981519152828c8c607a818110612eb057612eb0615a6e565b905060200201350961058085015260808401516105a0850151600080516020615cd48339815191529190089150600080516020615cd48339815191528285602c6020020151099150600080516020615cd4833981519152612f1f83600080516020615cd4833981519152615bfe565b610520860151089150600080516020615cd483398151915284600f602002015183096105208501526105c08401516101c0850151600080516020615cd4833981519152919009610580850152600080516020615cd48339815191528b8b607d818110612f8d57612f8d615a6e565b90506020020135600080516020615cd4833981519152612fad9190615bfe565b8c8c607c818110612fc057612fc0615a6e565b90506020020135089150600080516020615cd48339815191528285602e6020020151099150600080516020615cd483398151915284600f602002015183096105a08501526060840151600080516020615cd4833981519152908c8c608181811061302c5761302c615a6e565b90506020020135089150600080516020615cd4833981519152828c8c608081811061305957613059615a6e565b90506020020135096105c08501526080840151600080516020615cd4833981519152908c8c608381811061308f5761308f615a6e565b90506020020135089150600080516020615cd48339815191528285602e6020020151096105c08501526130ce8b8b6056818110612c9257612c92615a6e565b610620850152600080516020615cd48339815191528b8b60578181106130f6576130f6615a6e565b905060200201358560026054811061311057613110615a6e565b602002015108610640850152600080516020615cd48339815191528b8b608381811061313e5761313e615a6e565b90506020020135600080516020615cd483398151915261315e9190615bfe565b8c8c608181811061317157613171615a6e565b9050602002013508610660850152600080516020615cd48339815191528b8b607f8181106131a1576131a1615a6e565b90506020020135600080516020615cd48339815191526131c19190615bfe565b6001089150600080516020615cd48339815191528285600e602002015109610680850152600080516020615cd48339815191528b8b607f81811061320757613207615a6e565b905060200201358c8c607f81811061322157613221615a6e565b90506020020135099150600080516020615cd48339815191528b8b607f81811061324d5761324d615a6e565b90506020020135600080516020615cd483398151915261326d9190615bfe565b83089150600080516020615cd4833981519152828560146020020151096106a08501526060840151610620850151600080516020615cd48339815191529190089150600080516020615cd4833981519152828c8c607f8181106132d2576132d2615a6e565b90506020020135096106208501526080840151610640850151600080516020615cd48339815191529190089150600080516020615cd4833981519152828560316020020151099150600080516020615cd483398151915261334183600080516020615cd4833981519152615bfe565b6105c0860151089150600080516020615cd483398151915284600f602002015183096105c08501526106608401516101c0850151600080516020615cd4833981519152919009610620850152600080516020615cd48339815191528b8b60828181106133af576133af615a6e565b90506020020135600080516020615cd48339815191526133cf9190615bfe565b8c8c60818181106133e2576133e2615a6e565b90506020020135089150600080516020615cd4833981519152828560336020020151099150600080516020615cd483398151915284600f602002015183096106408501526060840151600080516020615cd4833981519152908c8c608681811061344e5761344e615a6e565b90506020020135089150600080516020615cd4833981519152828c8c608581811061347b5761347b615a6e565b90506020020135096106608501526080840151600080516020615cd4833981519152908c8c60888181106134b1576134b1615a6e565b90506020020135089150600080516020615cd4833981519152828560336020020151096106608501526134f08b8b6058818110612c9257612c92615a6e565b6106c0850152600080516020615cd48339815191528b8b605981811061351857613518615a6e565b905060200201358560026054811061353257613532615a6e565b6020020151086040850152600080516020615cd48339815191528b8b608881811061355f5761355f615a6e565b90506020020135600080516020615cd483398151915261357f9190615bfe565b8c8c608681811061359257613592615a6e565b90506020020135086106e0850152600080516020615cd48339815191528b8b60848181106135c2576135c2615a6e565b90506020020135600080516020615cd48339815191526135e29190615bfe565b6001089150600080516020615cd48339815191528285600e602002015109610700850152600080516020615cd48339815191528b8b608481811061362857613628615a6e565b905060200201358c8c608481811061364257613642615a6e565b90506020020135099150600080516020615cd48339815191528b8b608481811061366e5761366e615a6e565b90506020020135600080516020615cd483398151915261368e9190615bfe565b83089150600080516020615cd48339815191528285601460200201510961028085015260608401516106c0850151600080516020615cd48339815191529190089150600080516020615cd4833981519152828c8c60848181106136f3576136f3615a6e565b9050602002013509606085015260808401516040850151600080516020615cd48339815191529190089150600080516020615cd4833981519152828560036020020151099150600080516020615cd483398151915261376083600080516020615cd4833981519152615bfe565b610660860151089150600080516020615cd483398151915284600f6020020151830960408501526106e08401516101c0850151600080516020615cd48339815191529190096060850152600080516020615cd48339815191528b8b60878181106137cc576137cc615a6e565b90506020020135600080516020615cd48339815191526137ec9190615bfe565b8c8c60868181106137ff576137ff615a6e565b90506020020135089150600080516020615cd4833981519152828560376020020151099150600080516020615cd483398151915284600f60200201518309608085015260a084015161385590600086601061122f565b915061388a8480600560200201517f35342d2c29302f2827192b2a24232226251f1e1d21201a18171c1b15161312118561524a565b91506138a884806005602002015168ff040302143832312e8561524a565b91506138bb8285600d60200201516151ed565b6040850152610100840151600080516020615cd483398151915290800960608501819052610100850151600080516020615cd4833981519152910960808501526139458b8b608f81811061391157613911615a6e565b905060200201358c8c609081811061392b5761392b615a6e565b90506020020135866004605481106105cb576105cb615a6e565b909250905061395e848c8c65ffff088b038d86866152cd565b90925090506139a182828d8d608981811061397b5761397b615a6e565b905060200201358e8e608a81811061399557613995615a6e565b905060200201356153d5565b6101e08601526101c08501526101608401516080850151600080516020615cd483398151915291900960a085015260e08401516080850151600080516020615cd4833981519152919009610160850181905260e0850151600080516020615cd483398151915291096101a0850181905260e0850151600080516020615cd48339815191529109610200850181905260e0850151600080516020615cd48339815191529109610220850181905260e0850151600080516020615cd48339815191529109610240850181905260e0850151600080516020615cd48339815191529109610260850152600080516020615cd48339815191528b8b6087818110613aa957613aa9615a6e565b9050602002013585601360548110613ac357613ac3615a6e565b6020020151099150613ae4848c8c6bffff0b6e0d731078117d128286615443565b9150613b218b8b6069818110613afc57613afc615a6e565b9050602002013585600460548110613b1657613b16615a6e565b60200201518461521d565b6102808501526101408401516060850151600080516020615cd4833981519152919009610140850152613b878b8b6063818110613b6057613b60615a6e565b9050602002013585600360548110613b7a57613b7a615a6e565b602002015186601461122f565b610280850152610120840151610100850151600080516020615cd483398151915291900961012085015260e0840151610100850151600080516020615cd48339815191529190096102a0850152600091505b6008821015613c8857600080516020615cd483398151915284613bfd846000615b89565b613c08906007615acc565b60548110613c1857613c18615a6e565b602002015185613c29856001615b89565b613c34906015615acc565b60548110613c4457613c44615a6e565b60200201510984613c56846001615b89565b613c61906016615acc565b60548110613c7157613c71615a6e565b602002015281613c8081615bc6565b925050613bd9565b600080516020615cd48339815191528b8b6085818110613caa57613caa615a6e565b9050602002013585601d60548110613cc457613cc4615a6e565b6020020151099150613ced848c8c73ffff0848156216651767186c19711a761b7b1c8086615443565b9150600080516020615cd4833981519152828560146020020151086102808501526102a08401516060850151600080516020615cd4833981519152919008606085015260e0840151600080516020615cd48339815191529080096102a0850181905260e0850151600080516020615cd483398151915291096103c0850152600091505b6032821015613e1f57600080516020615cd483398151915284613d94846000615b89565b613d9f906007615acc565b60548110613daf57613daf615a6e565b602002015185613dc0856001615b89565b613dcb90601e615acc565b60548110613ddb57613ddb615a6e565b60200201510984613ded846001615b89565b613df890601f615acc565b60548110613e0857613e08615a6e565b602002015281613e1781615bc6565b925050613d70565b600080516020615cd48339815191528b8b605a818110613e4157613e41615a6e565b9050602002013585605060548110613e5b57613e5b615a6e565b602002015109610a208501526101808401516109e0850151600080516020615cd4833981519152919009610a408501819052610180850151600080516020615cd48339815191529109610a608501819052610180850151600080516020615cd483398151915291096101808501526109e08401516040850151613ee1919086605161122f565b9150613f10848c8c7f3f50405141524253435444554556465747584859495b4a5c4b5d4c5e4d5f4e6086615443565b9150613f3f848c8c7f2f7a307c317e327f338134833584368637883849394a3a4b3b4c3c4d3d4e3e4f86615443565b9150613f6e848c8c7f1f4620472161226423662468256a266b276d286f29702a722b742c752d772e7986615443565b9150613f85848c8c67ffff074315441e4586615443565b9150600080516020615cd48339815191528b8b6042818110613fa957613fa9615a6e565b9050602002013583089150600080516020615cd48339815191528285601460200201510860408501526106c0840151610260850151600080516020615cd48339815191529190086102608501526106a08401516103a0850151600080516020615cd4833981519152919008610280850152610660840151610240850151600080516020615cd4833981519152919008610240850152610640840151610380850151600080516020615cd4833981519152919008610380850152610600840151610220850151600080516020615cd48339815191529190086102208501526105e0840151610360850151600080516020615cd48339815191529190086103608501526105a0840151610200850151600080516020615cd4833981519152919008610200850152610580840151610340850151600080516020615cd48339815191529190086103408501526105408401516101a0850151600080516020615cd48339815191529190086101a0850152610520840151610320850151600080516020615cd48339815191529190086103208501526104e0840151610160850151600080516020615cd48339815191529190086101608501526104c0840151610300850151600080516020615cd48339815191529190086103008501526104808401516080850151600080516020615cd483398151915291900860808501526104608401516102e0850151600080516020615cd48339815191529190086102e08501526104408401516102c0850151600080516020615cd48339815191529190086102c08501526104208401516060850151600080516020615cd48339815191529190086060850152610400840151610100850151600080516020615cd483398151915291900861010085015261427c8b8b608f81811061424857614248615a6e565b905060200201358c8c609081811061426257614262615a6e565b90506020020135866005605481106105cb576105cb615a6e565b90925090506142af848c8c7f182c192e1a301b321c341436098b03260a8d040a0b0e0d121016111a121e132286866152cd565b90925090506142d6848c8c73ffff4f3a523c533e0c405038068908081628172a86866152cd565b90925090506143287f0c7334a3b9a24f18780f368cf4e581f3ee206c995efcf2ad1d591075f34800d67f07c9c852e7cdf6ec7b0d7a9c71343fcc823836563a1eafe2964a7db347c644b486604e610623565b909250905061437a7f303399d69867569f44829166dbc811aec4050eb4351f07ce94137b2ea62615b77f21affd1d03a9a9e428842d8ef3da673c25888eba270e2de56fc7598de155776f86604d610623565b90925090506143cc7f0f8286c37689450e1171ff5f25b1fc58521cf3470ae9ea771918ecbee2094d847f1d371d5b9d97c37a0f1b8f3492dda158aa2dad81c52f7f2a512f63e59c705bed86604c610623565b909250905061441e7f139f3c97001d2d25928cab388bfe3f941f47bb46ef39095d1b0bc055185fa57f7f24d470b72fd0eecea0f5c65668c33110a005984460d7304582d1fcdd211df76886604b610623565b90925090506144707f1f9f5ab677532016ef9475fd5d43659678db3a699ad3d52e85c3f6ef2b3098c17f2cd62bc191e831701421d97bd158995f0f23e8645c14aa050602e958dd503b4786604a610623565b90925090506144c27f244e8af4f5d8644cfe7df55d0735c26e229afa7c7b92a39020bd02d8c8677b037f15a6dd332a6f0e9a9b643e86173dc6f99f4dc4bc18b215e0ac6a22e941fd9972866049610623565b90925090506145147f2bf75d9dd944249cd720ee71585980774cb83905b860feb5af3da42ca043b1157f07b4ff44a8e4250bf3ce16c06e8430b585a7a1e85243febe565a7929db37cc9f866048610623565b90925090506145667f20353da49405dca58c00c961510a2838b2bdeb06a053b8ed5931b8490967135b7f1ba4067d380f1db72eed4990fed1eb78d22addd5044bbea7d480f4e058d2fd08866047610623565b90925090506145b87f25d344a083be7e69cb907b8705b3bab3417d4a23f06d43ca7b287028a88ec5837f2c03f591ec6858cdff27cadaac1a67a1dc9ab7877f898686efe7033e7fd02a16866046610623565b909250905061460a7f19d9668da068ddb43d2e3d2c31214fefc028b0df0501ff8604575dafda6f1ae77f155edc361fbe4a694d9c6e3124a1c13d3180f39ab1af7521b35b6e2bb653b3da866045610623565b909250905061465c7f2bf75d9dd944249cd720ee71585980774cb83905b860feb5af3da42ca043b1157f07b4ff44a8e4250bf3ce16c06e8430b585a7a1e85243febe565a7929db37cc9f866044610623565b90925090506146ae7f1936a9539ed59e0f2c4665a13ee2bdf544ee1359b2a47f4f8d3666540d5be89e7f15efeffb7af6c45498a8d4779c0a2ca3a116a96348e8e51392ef924d6ab7dbfd866043610623565b90925090506147007f2fd08ae291ca0c95ada3f562b9f9be896737fd57493c4cefa087979abda4d2d67f04a6506069e2d39e944abcc54e70e881ccdd429ed4c1017fbe1099efeb70465f866042610623565b90925090506147527f0141bcf8e5540e9f5aa60645bf265946a71874beb52ddca1a0df8df6bbc0e0fa7f14e8506ee1911816df221897db48964bf861b4abecdb9da24afbcf9b0c4d18b8866041610623565b90925090506147a47f2ea5cb6082a4df4a36091fef8188e8e0f8d4b6e1e37707746707d99f548aef427f1766582f9e1ec20bed2f0d93154ae653f3089c934fca9f7b87192ed78b760c8d866040610623565b90925090506147f67f136635b335232ad0bb9ec1dd165740fb1f32464fd47c68a84fa6844059faf5217f090e5e51625ce01fec4c2647771bd32f228b8ea580c498822ee58d2a607b892186603f610623565b90925090506148487f143877d82d6f4d6a6e18301f05defdfa526f0d95977cec3c32e231b1aa0a81567f1906928f9c2d199d9062ece64e8dbff97e27ab2d8326b40e7ea77a950b21ddd986603e610623565b909250905061489a7f27ebdd749900c0af821c3d7bfee6f6216c2a101d247a8dd93db6590692d1689a7f2da8ee70127f67344aded9134ceff263c69790b3d020786c616f76349b19aef386603d610623565b90925090506148ec7f148ff3c1217e5849d79a5ad4e55e1f66e553e0c24a335730306b58c35f0be7647f29d393499e332436f2578d1e95f1aa58d1539c3bd0820157a6e9ed12a906301586603c610623565b909250905061493e7f1d0246b7158fd8adee20544a12a9c7037653efa8e5ca0da702f29744a3cc595d7f0d1c5bd48350de3282920c3453c6da531a1fd6fce81bacfd5e5289123458d67586603b610623565b90925090506149907f0a690884507cd616b1598e45913a0478135225c4a1ed39eb4d22552feff5f3b07f119e66501b5ff7f5a2d09bce4b7b1fe0e078c6764867222ed23ba35f317f200086603a610623565b90925090506149e27f18cfb2048fda3eb8a660efd7855014c0500be2531cbcd7e163455fe2b1972ce37f0e835d2d22b6c1e675e76f544bb7aea2e74b04659f91ecf97eccca4024c49326866039610623565b9092509050614a347f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000866038610623565b9092509050614a5f848c8c77ffff070015021e041f06250c28102b142e18311c3420372486866152cd565b85516020870151929450909250614a7991849184916153d5565b60208601528452614a8e6001600286816105cb565b85516020870151929450909250614aa69184846154e5565b602086018190528186526101c08601516101e090960151959d959c50909a509850929650505050505050565b614ada615834565b80517f186282957db913abd99f91db59fe69922e95040603ef44c0bd7aa3adeef8f5ac905280517f17944351223333f260ddc3b4af45191b856689eda9eab5cbcddbbe570ce860d2602091820152810180517f298adc7396bd3865cbf6d6df91bae406694e6d2215baa893bdeadb63052895f49052517f297772d34bc9aa8ae56162486363ffe417b02dc7e8c207fc2cc20203e67a02ad9060015b602002015290565b614b85615834565b80517f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2905280517f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed602091820152810180517f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec9052517f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d906001614b75565b60008083516006614c359190615b89565b905060008167ffffffffffffffff811115614c5257614c52615ae4565b604051908082528060200260200182016040528015614c7b578160200160208202803683370190505b509050614c86615897565b60008551875114614c9657600080fd5b60005b8751811015614ecf57878181518110614cb457614cb4615a6e565b60200260200101516000015184826006614cce9190615b89565b614cd9906000615acc565b81518110614ce957614ce9615a6e565b602002602001018181525050878181518110614d0757614d07615a6e565b60200260200101516020015184826006614d219190615b89565b614d2c906001615acc565b81518110614d3c57614d3c615a6e565b602002602001018181525050868181518110614d5a57614d5a615a6e565b6020908102919091010151515184614d73836006615b89565b614d7e906002615acc565b81518110614d8e57614d8e615a6e565b602002602001018181525050868181518110614dac57614dac615a6e565b60209081029190910181015151015184614dc7836006615b89565b614dd2906003615acc565b81518110614de257614de2615a6e565b602002602001018181525050868181518110614e0057614e00615a6e565b602002602001015160200151600060028110614e1e57614e1e615a6e565b602002015184614e2f836006615b89565b614e3a906004615acc565b81518110614e4a57614e4a615a6e565b602002602001018181525050868181518110614e6857614e68615a6e565b602002602001015160200151600160028110614e8657614e86615a6e565b602002015184614e97836006615b89565b614ea2906005615acc565b81518110614eb257614eb2615a6e565b602090810291909101015280614ec781615bc6565b915050614c99565b50602082602086026020860160085afa905080614eeb57600080fd5b5051151595945050505050565b60606000614f058361552a565b600101905060008167ffffffffffffffff811115614f2557614f25615ae4565b6040519080825280601f01601f191660200182016040528015614f4f576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084614f5957509392505050565b600080614fc16158b5565b6000614fe0604051806040016040528060008152602001600081525090565b8783526020830187905260408084018790528160608560075afa91508161500657600080fd5b8051602090910151909890975095505050505050565b6000806150276158d3565b8781526020810187905260408101869052606081018590526080810184905261504f8161560d565b6060810151608090910151909890975095505050505050565b6002828261507581615bc6565b93506090811061508757615087615a6e565b602002015282828261509881615bc6565b9350609081106150aa576150aa615a6e565b6020020152505050565b600182826150c181615bc6565b9350609081106150d3576150d3615a6e565b60200201528382826150e481615bc6565b9350609081106150f6576150f6615a6e565b602002015282828261510781615bc6565b93506090811061511957615119615a6e565b602002015250505050565b600080838363ffffffff166090811061513f5761513f615a6e565b60200201818152505060006151718484602061515b9190615c15565b615166906001615c41565b63ffffffff16615648565b51905061517d8161567e565b93525090919050565b6000615190615816565b615198615897565b6020808352828101819052604083018190526060830186905260808301859052600080516020615cd483398151915260a08401526000908260c08560055afa9050806151e357600080fd5b5051949350505050565b6000816000036151fc57600080fd5b600080516020615cd4833981519152615214836157f2565b84099392505050565b6000600080516020615cd483398151915282600080516020615cd483398151915285870908949350505050565b6000805b60208110156152c35760ff8085169081146152aa5760089490941c93600080516020615cd483398151915287826054811061528b5761528b615a6e565b6020020151600080516020615cd48339815191528689090893506152b0565b506152c3565b506152bc600182615acc565b905061524e565b5090949350505050565b6000806152d86158d3565b606081018590526080810184905260005b60208110156153ba5760ff8088169081146153a157601088901c9760081c60ff168a8a8381811061531c5761531c615a6e565b905060200201358460006005811061533657615336615a6e565b60200201528a8a615348846001615acc565b81811061535757615357615a6e565b905060200201358460016005811061537157615371615a6e565b60200201528b816054811061538857615388615a6e565b6020020151604085015261539b8461560d565b506153a7565b506153ba565b506153b3600282615acc565b90506152e9565b50606081015160809091015190999098509650505050505050565b60008060006153f7604051806040016040528060008152602001600081525090565b6153ff6158f1565b888152602081018890526040808201889052606082018790528260808360065afa92508261542c57600080fd5b508051602090910151909890975095505050505050565b6000805b60208110156154da5760ff8085169081146154c157601085901c9460081c60ff16600080516020615cd483398151915285600080516020615cd48339815191528b846054811061549957615499615a6e565b60200201518b8b878181106154b0576154b0615a6e565b9050602002013509089450506154c7565b506154da565b506154d3600282615acc565b9050615447565b509095945050505050565b60008061551d868686615518877f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47615bfe565b6153d5565b9150915094509492505050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310615573577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef8100000000831061559f576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106155bd57662386f26fc10000830492506010015b6305f5e10083106155d5576305f5e100830492506008015b61271083106155e957612710830492506004015b606483106155fb576064830492506002015b600a8310615607576001015b92915050565b600060406020830160608460075afa90508061562857600080fd5b60406060830160806020850160065afa90508061564457600080fd5b5050565b615650615897565b6000602082848660026107d05a03fa9050808061566957fe5b508061567757615677615c69565b5092915050565b6000816157d18160008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b6008827fff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0016901c1790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b6010827fffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff000016901c1790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b6020827fffffffff00000000ffffffff00000000ffffffff00000000ffffffff0000000016901c17905060408177ffffffffffffffff0000000000000000ffffffffffffffff16901b6040827fffffffffffffffff0000000000000000ffffffffffffffff000000000000000016901c179050608081901b608082901c179050919050565b90506157eb600080516020615cd483398151915282615c98565b9392505050565b6000615607826158116002600080516020615cd4833981519152615bfe565b615186565b6040518060c001604052806006906020820280368337509192915050565b604051806040016040528061584761590f565b815260200161585461590f565b905290565b60405180610a8001604052806054906020820280368337509192915050565b6040518061120001604052806090906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b60405180606001604052806003906020820280368337509192915050565b6040518060a001604052806005906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b60008083601f84011261593f57600080fd5b50813567ffffffffffffffff81111561595757600080fd5b6020830191508360208260051b850101111561597257600080fd5b9250929050565b60008060008060006060868803121561599157600080fd5b853567ffffffffffffffff808211156159a957600080fd5b6159b589838a0161592d565b909750955060208801359150808211156159ce57600080fd5b506159db8882890161592d565b96999598509660400135949350505050565b60005b83811015615a085781810151838201526020016159f0565b83811115615a17576000848401525b50505050565b6020815260008251806020840152615a3c8160408501602087016159ed565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115615adf57615adf615a9d565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008451615b258184602089016159ed565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551615b61816001850160208a016159ed565b60019201918201528351615b7c8160028401602088016159ed565b0160020195945050505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615bc157615bc1615a9d565b500290565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615bf757615bf7615a9d565b5060010190565b600082821015615c1057615c10615a9d565b500390565b600063ffffffff80831681851681830481118215151615615c3857615c38615a9d565b02949350505050565b600063ffffffff808316818516808303821115615c6057615c60615a9d565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082615cce577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50069056fe30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a164736f6c634300080f000a", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80634292dc3e1461003b57806354fd4d5014610063575b600080fd5b61004e610049366004615979565b610078565b60405190151581526020015b60405180910390f35b61006b6104c7565b60405161005a9190615a1d565b6000610082615816565b8484600081811061009557610095615a6e565b9050602002013570ffffffffffffffffffffffffffffffffff16816000600681106100c2576100c2615a6e565b60200201526088858560018181106100dc576100dc615a6e565b90506020020135600116901b6088868660008181106100fd576100fd615a6e565b90506020020135901c6101109190615acc565b60208201528484600281811061012857610128615a6e565b9050602002013570ffffffffffffffffffffffffffffffffff168160026006811061015557610155615a6e565b602002015260888585600381811061016f5761016f615a6e565b90506020020135600116901b60888686600281811061019057610190615a6e565b90506020020135901c6101a39190615acc565b606080830191909152608084811c908301526fffffffffffffffffffffffffffffffff841660a08301526040805160028082529281019091526000918291829182918291816020015b60408051808201909152600080825260208201528152602001906001900390816101ec5750506040805160028082526060820190925291925060009190602082015b610236615834565b81526020019060019003908161022e5790505090506102568d8d8961056a565b855193995090975090955093508690839060009061027657610276615a6e565b60200260200101516000018181525050838260008151811061029a5761029a615a6e565b6020026020010151602001818152505084826001815181106102be576102be615a6e565b6020026020010151600001818152505082826001815181106102e2576102e2615a6e565b602002602001015160200181815250506102fa614ad2565b8160008151811061030d5761030d615a6e565b6020026020010181905250610320614b7d565b8160018151811061033357610333615a6e565b60200260200101819052506103488282614c24565b61035c5760009750505050505050506104be565b8a8a600081811061036f5761036f615a6e565b905060200201358260008151811061038957610389615a6e565b6020908102919091010151528a8a60018181106103a8576103a8615a6e565b90506020020135826000815181106103c2576103c2615a6e565b602002602001015160200181815250508a8a60028181106103e5576103e5615a6e565b90506020020135826001815181106103ff576103ff615a6e565b6020908102919091010151528a8a600381811061041e5761041e615a6e565b905060200201358260018151811061043857610438615a6e565b60200260200101516020018181525050610450614ad2565b8160008151811061046357610463615a6e565b6020026020010181905250610476614b7d565b8160018151811061048957610489615a6e565b602002602001018190525061049e8282614c24565b6104b25760009750505050505050506104be565b60019750505050505050505b95945050505050565b60606104f27f0000000000000000000000000000000000000000000000000000000000000000614ef8565b61051b7f0000000000000000000000000000000000000000000000000000000000000000614ef8565b6105447f0000000000000000000000000000000000000000000000000000000000000000614ef8565b60405160200161055693929190615b13565b604051602081830303815290604052905090565b600080600080610578615859565b610580615878565b6000806105d57f2754b04f3f510d0e86a0d0e811f0fc16f92b722514e1729066d2abf90811d6f27f1816b0f9909a5a979bd34c559e57b4096bee5cce7eb668bc0a9805677f40dc858b845b6020020151614fb6565b909250905061062f7f174fa57071f8f6e53fcb31a5ecc33274ec76e4e186eeb0b64255d2f314cd50b27f1c399365e85e4de2761ebcf350da85ff4518cc82f7cef64a477a7a5fd11d4a448b60015b6020020151858561501c565b90925090506106817f259a4d5cd83279b6dc9ca2008b669f82e91f23804e2524c5087a2452d52c33bd7f303abddb7ae0f35e3a6bd39314b347c3c3a433f72833dda1998ad2176258baa38b6002610623565b90925090506106d37f252b158900f31a7c0c00b924e7d3c8d61a60c5e9fd2b83251ba73d1dc0b680f57f29c8c2b3f0d74267bc2b0f9f3568838cdb0eee4719391790d93d0015c00ce5af8b6003610623565b90925090506107257f0c25f9f3c38b6a128d7d38c5625a3976d389b5f9f33098bb419968e4d18e150e7f21fb777462c7f4af71940423babc7f882f0c97be9620ef84f6f11974ee0edb8e8b6004610623565b90925090506107777f2280a0fd7dbf95c450830906ffc607a373d5b9b56b9101138e925ad557eb355a7f0697ab7e9a5377e2759ab6d1283301ccae9c72bad14946a9513ee19be1ec825e8b6005610623565b602086015284526107aa7f0000000000000000000000000000000000000000000000000000000000000000846000615068565b835160208501516107be91908560026150b4565b600091505b6004821161085c5761084a8b8b6107db856002615b89565b6107e6906000615acc565b8181106107f5576107f5615a6e565b905060200201358c8c85600261080b9190615b89565b610816906001615acc565b81811061082557610825615a6e565b905060200201358585600361083a9190615b89565b610845906005615acc565b6150b4565b8161085481615bc6565b9250506107c3565b610867836014615124565b6040850152600091505b600d8211610905576108f38b8b610889856002615b89565b61089490600a615acc565b8181106108a3576108a3615a6e565b905060200201358c8c8560026108b99190615b89565b6108c490600b615acc565b8181106108d3576108d3615a6e565b90506020020135858560036108e89190615b89565b610845906001615acc565b816108fd81615bc6565b925050610871565b61091083602b615124565b6060850152610920836001615124565b6080850152600091505b6009821161098f5761097d8b8b610942856002615b89565b61094d906026615acc565b81811061095c5761095c615a6e565b905060200201358c8c8560026109729190615b89565b6108c4906027615acc565b8161098781615bc6565b92505061092a565b61099a83601f615124565b60a0850152600091505b60038211610a09576109f78b8b6109bc856002615b89565b6109c790603a615acc565b8181106109d6576109d6615a6e565b905060200201358c8c8560026109ec9190615b89565b6108c490603b615acc565b81610a0181615bc6565b9250506109a4565b610a1483600d615124565b60c0850152600091505b60468211610a8757610a758b8b610a36856001615b89565b610a41906042615acc565b818110610a5057610a50615a6e565b9050602002013584846002610a659190615b89565b610a70906001615acc565b615068565b81610a7f81615bc6565b925050610a1e565b610a9283608f615124565b60e0850152600091505b60038211610b0157610aef8b8b610ab4856002615b89565b610abf906089615acc565b818110610ace57610ace615a6e565b905060200201358c8c856002610ae49190615b89565b6108c490608a615acc565b81610af981615bc6565b925050610a9c565b610b0c83600d615124565b61010085015260c0840151600080516020615cd4833981519152907f1dba8b5bdd64ef6ce29a9039aca3c0e524395c43b9227b96c75090cc6cc7ec97900961012085015260c0840151600080516020615cd4833981519152907f24a1fcd63e9f03b27281db85fe631ec8e5c466f8178a4ee94d4942b7ccd90e1c900961014085015260c0840151600080516020615cd4833981519152907f20bab6e5f766b4edf82399e9c5ff0e40d4b6875321a3d8020e18521d8f5c7241900961016085015260c0840151610bdf906304000000615186565b610180850152600080516020615cd4833981519152610bff600182615bfe565b610180860151086101a08501819052600080516020615cd4833981519152907f30644e66c81e03716be83b486d6feabcc7ddd0fe6cbf5e72d585d142f7829b05096101c0850152600080516020615cd4833981519152610c60600182615bfe565b60c0860151089150610c7a84600e5b6020020151836151ed565b6101c08501526101a0840151600080516020615cd4833981519152907f07baaa5b7af9cf52cd226bc56865f0f99ef8fcd4219060f09f43e9a148b5ab68096101e0850152600080516020615cd4833981519152610cf77f20bab6e5f766b4edf82399e9c5ff0e40d4b6875321a3d8020e18521d8f5c724182615bfe565b60c0860151089150610d0a84600f610c6f565b6101e08501526101a0840151600080516020615cd4833981519152907f1c699f652457365bf2fc4fa2c5c63d6c4349b03cb46d633d7a2655c5da4b900a09610200850152600080516020615cd4833981519152610d877f19277f31ecb5bfe8604677099c09556812b0b5c50cceb2b584098183a5a6c5c882615bfe565b60c0860151089150610d9a846010610c6f565b6102008501526101a0840151600080516020615cd4833981519152907f205cdbaf03903a5c23e60eef0df90673bc65a25762694c501e3281153b4e588a09610220850152600080516020615cd4833981519152610e177f082a7bd4c0a7e4352229d332c27a160da18f0d7c651f3047df41b80345532f6e82615bfe565b60c0860151089150610e2a846011610c6f565b6102208501526101a0840151600080516020615cd4833981519152907f27db73b1a831278e143aab90091db38afdea3294c4ba05d1c697a392eb09cc7909610240850152600080516020615cd4833981519152610ea77f26501ebfe559ea5826f023d3e76e4b66f170cd940408eb5590a4075c80b498d682615bfe565b60c0860151089150610eba846012610c6f565b6102408501526101a0840151600080516020615cd4833981519152907f0204822d629ab653697f028f5fa17d23ac2ba08c60c7112d98ebd28f325f0af609610260850152600080516020615cd4833981519152610f377f0d5eb4c216db2c3262de3f6a2ef71a9be95ff21a7a1a50ed069d6131e7d54e5f82615bfe565b60c0860151089150610f4a846013610c6f565b6102608501526101a0840151600080516020615cd4833981519152907f2622622a60c0d9327ccf066a0f1fce13c48601b976affd1f41c2a72a9f77da6409610280850152600080516020615cd4833981519152610fc77f24a1fcd63e9f03b27281db85fe631ec8e5c466f8178a4ee94d4942b7ccd90e1c82615bfe565b60c0860151089150610fda846014610c6f565b6102808501526102008401516101e0850151600080516020615cd48339815191529190089150600080516020615cd4833981519152846011602002015183089150600080516020615cd4833981519152846012602002015183089150600080516020615cd4833981519152846013602002015183086101e08501526110ab8b8b604a81811061106b5761106b615a6e565b905060200201358c8c604881811061108557611085615a6e565b905060200201358d8d604981811061109f5761109f615a6e565b9050602002013561521d565b91506110ea8b8b604b8181106110c3576110c3615a6e565b905060200201358c8c60438181106110dd576110dd615a6e565b905060200201358461521d565b915061111c8b8b604c81811061110257611102615a6e565b905060200201358c8c60448181106110dd576110dd615a6e565b915061114e8b8b604d81811061113457611134615a6e565b905060200201358c8c60458181106110dd576110dd615a6e565b91506111808b8b604e81811061116657611166615a6e565b905060200201358c8c60468181106110dd576110dd615a6e565b91506111b28b8b604f81811061119857611198615a6e565b905060200201358c8c60478181106110dd576110dd615a6e565b610200850152600080516020615cd48339815191528b8b60448181106111da576111da615a6e565b905060200201358c8c60438181106111f4576111f4615a6e565b905060200201350991506112398b8b605081811061121457611214615a6e565b90506020020135838660106054811061122f5761122f615a6e565b602002015161521d565b610200850152600080516020615cd48339815191528b8b604681811061126157611261615a6e565b905060200201358c8c604581811061127b5761127b615a6e565b9050602002013509915061129b8b8b605181811061121457611214615a6e565b610200850152600080516020615cd48339815191528b8b60618181106112c3576112c3615a6e565b90506020020135600080516020615cd48339815191526112e39190615bfe565b6001089150600080516020615cd48339815191528285600e602002015109610220850152600080516020615cd48339815191528b8b606481811061132957611329615a6e565b905060200201358c8c606481811061134357611343615a6e565b90506020020135099150600080516020615cd48339815191528b8b606481811061136f5761136f615a6e565b90506020020135600080516020615cd483398151915261138f9190615bfe565b83089150600080516020615cd483398151915282856014602002015109610240850152600080516020615cd48339815191528b8b60638181106113d4576113d4615a6e565b90506020020135600080516020615cd48339815191526113f49190615bfe565b8c8c606481811061140757611407615a6e565b90506020020135089150600080516020615cd483398151915284600e6020020151830961026085015260c08401516060850151600080516020615cd48339815191529190096102a08501526101e0840151610280850151600080516020615cd48339815191529190089150600080516020615cd483398151915261149983600080516020615cd4833981519152615bfe565b6001086101e08501526080840151600080516020615cd4833981519152908c8c60438181106114ca576114ca615a6e565b90506020020135086102c08501526115158b8b605b8181106114ee576114ee615a6e565b905060200201358560036054811061150857611508615a6e565b602002015186601661122f565b9150600080516020615cd48339815191528b8b606281811061153957611539615a6e565b9050602002013583096102e08501526102a08401516102c0850151600080516020615cd48339815191529190089150600080516020615cd48339815191528b8b606181811061158a5761158a615a6e565b9050602002013583096102c08501526102a0840151600080516020615cd4833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096103008501526080840151600080516020615cd4833981519152908c8c60448181106115ff576115ff615a6e565b905060200201350861032085015261164a8b8b605c81811061162357611623615a6e565b905060200201358560036054811061163d5761163d615a6e565b602002015186601961122f565b9150600080516020615cd4833981519152846017602002015183096102e0850152610300840151610320850151600080516020615cd48339815191529190089150600080516020615cd4833981519152846016602002015183096102c0850152610300840151600080516020615cd4833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096103008501526080840151600080516020615cd4833981519152908c8c604581811061171057611710615a6e565b90506020020135086103208501526117348b8b605d81811061162357611623615a6e565b9150600080516020615cd4833981519152846017602002015183096102e0850152610300840151610320850151600080516020615cd48339815191529190089150600080516020615cd4833981519152846016602002015183096102c0850152610300840151600080516020615cd4833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096103008501526102c0840151600080516020615cd4833981519152906117f29082615bfe565b6102e0860151089150600080516020615cd483398151915284600f602002015183096102c08501526102a0840151600080516020615cd4833981519152907f18afdf23e9bd9302673fc1e076a492d4d65bd18ebc4d854ed189139bab313e5290096102a08501526080840151600080516020615cd4833981519152908c8c604681811061188157611881615a6e565b90506020020135086102e08501526118cc8b8b605e8181106118a5576118a5615a6e565b90506020020135856003605481106118bf576118bf615a6e565b602002015186601761122f565b9150600080516020615cd48339815191528b8b60658181106118f0576118f0615a6e565b9050602002013583096103008501526102a08401516102e0850151600080516020615cd48339815191529190089150600080516020615cd48339815191528b8b606481811061194157611941615a6e565b9050602002013583096102e08501526102a0840151600080516020615cd4833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096102a08501526080840151600080516020615cd4833981519152908c8c60478181106119b6576119b6615a6e565b90506020020135086103208501526119da8b8b605f81811061162357611623615a6e565b9150600080516020615cd4833981519152846018602002015183096103008501526102a0840151610320850151600080516020615cd48339815191529190089150600080516020615cd4833981519152846017602002015183096102e08501526102a0840151600080516020615cd4833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096102a08501526080840151600080516020615cd4833981519152908c8c6042818110611aa057611aa0615a6e565b9050602002013508610320850152611ac48b8b606081811061162357611623615a6e565b9150600080516020615cd4833981519152846018602002015183096103008501526102a0840151610320850151600080516020615cd48339815191529190089150600080516020615cd4833981519152846017602002015183096102e08501526102a0840151600080516020615cd4833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096102a08501526102e0840151600080516020615cd483398151915290611b829082615bfe565b610300860151089150600080516020615cd483398151915284600f602002015183096102a08501526060840151600080516020615cd4833981519152908c8c6068818110611bd257611bd2615a6e565b90506020020135089150600080516020615cd4833981519152828c8c6067818110611bff57611bff615a6e565b90506020020135096102e08501526080840151600080516020615cd4833981519152908c8c606a818110611c3557611c35615a6e565b90506020020135089150600080516020615cd4833981519152828560176020020151096102e0850152600080516020615cd48339815191528b8b6052818110611c8057611c80615a6e565b905060200201358c8c6043818110611c9a57611c9a615a6e565b90506020020135096103008501526040840151600080516020615cd48339815191529060000960408501819052610300850151600080516020615cd48339815191529108610300850152600080516020615cd48339815191528b8b6053818110611d0657611d06615a6e565b9050602002013585600260548110611d2057611d20615a6e565b602002015108610320850152600080516020615cd48339815191528b8b606a818110611d4e57611d4e615a6e565b90506020020135600080516020615cd4833981519152611d6e9190615bfe565b8c8c6068818110611d8157611d81615a6e565b9050602002013508610340850152600080516020615cd48339815191528b8b6066818110611db157611db1615a6e565b90506020020135600080516020615cd4833981519152611dd19190615bfe565b6001089150600080516020615cd48339815191528285600e602002015109610360850152600080516020615cd48339815191528b8b6066818110611e1757611e17615a6e565b905060200201358c8c6066818110611e3157611e31615a6e565b90506020020135099150600080516020615cd48339815191528b8b6066818110611e5d57611e5d615a6e565b90506020020135600080516020615cd4833981519152611e7d9190615bfe565b83089150600080516020615cd4833981519152828560146020020151096103808501526060840151610300850151600080516020615cd48339815191529190089150600080516020615cd4833981519152828c8c6066818110611ee257611ee2615a6e565b90506020020135096103008501526080840151610320850151600080516020615cd48339815191529190086103208501819052610300850151600080516020615cd48339815191529190099150600080516020615cd4833981519152611f5683600080516020615cd4833981519152615bfe565b6102e0860151089150600080516020615cd483398151915284600f602002015183096102e08501526103408401516101c0850151600080516020615cd4833981519152919009610300850152600080516020615cd48339815191528b8b6069818110611fc457611fc4615a6e565b90506020020135600080516020615cd4833981519152611fe49190615bfe565b8c8c6068818110611ff757611ff7615a6e565b90506020020135089150600080516020615cd48339815191528285601a6020020151099150600080516020615cd483398151915284600f602002015183096103408501526060840151600080516020615cd4833981519152908c8c606d81811061206357612063615a6e565b90506020020135089150600080516020615cd4833981519152828c8c606c81811061209057612090615a6e565b90506020020135096103a08501526080840151600080516020615cd4833981519152908c8c606f8181106120c6576120c6615a6e565b90506020020135089150600080516020615cd48339815191528285601d6020020151096103a08501526121398b8b605281811061210557612105615a6e565b905060200201358c8c604481811061211f5761211f615a6e565b905060200201358660026054811061122f5761122f615a6e565b6103c0850152600080516020615cd48339815191528b8b606f81811061216157612161615a6e565b90506020020135600080516020615cd48339815191526121819190615bfe565b8c8c606d81811061219457612194615a6e565b90506020020135086103e0850152600080516020615cd48339815191528b8b606b8181106121c4576121c4615a6e565b90506020020135600080516020615cd48339815191526121e49190615bfe565b6001089150600080516020615cd48339815191528285600e602002015109610400850152600080516020615cd48339815191528b8b606b81811061222a5761222a615a6e565b905060200201358c8c606b81811061224457612244615a6e565b90506020020135099150600080516020615cd48339815191528b8b606b81811061227057612270615a6e565b90506020020135600080516020615cd48339815191526122909190615bfe565b83089150600080516020615cd48339815191528285601460200201510961042085015260608401516103c0850151600080516020615cd48339815191529190089150600080516020615cd4833981519152828c8c606b8181106122f5576122f5615a6e565b90506020020135099150600080516020615cd4833981519152846019602002015183099150600080516020615cd483398151915261234183600080516020615cd4833981519152615bfe565b6103a0860151089150600080516020615cd483398151915284600f602002015183096103a08501526103e08401516101c0850151600080516020615cd48339815191529190096103c0850152600080516020615cd48339815191528b8b606e8181106123af576123af615a6e565b90506020020135600080516020615cd48339815191526123cf9190615bfe565b8c8c606d8181106123e2576123e2615a6e565b90506020020135089150600080516020615cd48339815191528285601f6020020151099150600080516020615cd483398151915284600f602002015183096103e08501526060840151600080516020615cd4833981519152908c8c607281811061244e5761244e615a6e565b90506020020135089150600080516020615cd4833981519152828c8c607181811061247b5761247b615a6e565b90506020020135096104408501526080840151600080516020615cd4833981519152908c8c60748181106124b1576124b1615a6e565b90506020020135089150600080516020615cd48339815191528285602260200201510961044085015261250a8b8b60528181106124f0576124f0615a6e565b905060200201358c8c604581811061211f5761211f615a6e565b610460850152600080516020615cd48339815191528b8b607481811061253257612532615a6e565b90506020020135600080516020615cd48339815191526125529190615bfe565b8c8c607281811061256557612565615a6e565b9050602002013508610480850152600080516020615cd48339815191528b8b607081811061259557612595615a6e565b90506020020135600080516020615cd48339815191526125b59190615bfe565b6001089150600080516020615cd48339815191528285600e6020020151096104a0850152600080516020615cd48339815191528b8b60708181106125fb576125fb615a6e565b905060200201358c8c607081811061261557612615615a6e565b90506020020135099150600080516020615cd48339815191528b8b607081811061264157612641615a6e565b90506020020135600080516020615cd48339815191526126619190615bfe565b83089150600080516020615cd4833981519152828560146020020151096104c08501526060840151610460850151600080516020615cd48339815191529190089150600080516020615cd4833981519152828c8c60708181106126c6576126c6615a6e565b90506020020135099150600080516020615cd4833981519152846019602002015183099150600080516020615cd483398151915261271283600080516020615cd4833981519152615bfe565b610440860151089150600080516020615cd483398151915284600f602002015183096104408501526104808401516101c0850151600080516020615cd4833981519152919009610460850152600080516020615cd48339815191528b8b607381811061278057612780615a6e565b90506020020135600080516020615cd48339815191526127a09190615bfe565b8c8c60728181106127b3576127b3615a6e565b90506020020135089150600080516020615cd4833981519152828560246020020151099150600080516020615cd483398151915284600f602002015183096104808501526060840151600080516020615cd4833981519152908c8c607781811061281f5761281f615a6e565b90506020020135089150600080516020615cd4833981519152828c8c607681811061284c5761284c615a6e565b90506020020135096104e08501526080840151600080516020615cd4833981519152908c8c607981811061288257612882615a6e565b90506020020135089150600080516020615cd4833981519152828560276020020151096104e08501526128db8b8b60528181106128c1576128c1615a6e565b905060200201358c8c604681811061211f5761211f615a6e565b610500850152600080516020615cd48339815191528b8b607981811061290357612903615a6e565b90506020020135600080516020615cd48339815191526129239190615bfe565b8c8c607781811061293657612936615a6e565b9050602002013508610520850152600080516020615cd48339815191528b8b607581811061296657612966615a6e565b90506020020135600080516020615cd48339815191526129869190615bfe565b6001089150600080516020615cd48339815191528285600e602002015109610540850152600080516020615cd48339815191528b8b60758181106129cc576129cc615a6e565b905060200201358c8c60758181106129e6576129e6615a6e565b90506020020135099150600080516020615cd48339815191528b8b6075818110612a1257612a12615a6e565b90506020020135600080516020615cd4833981519152612a329190615bfe565b83089150600080516020615cd4833981519152828560146020020151096105608501526060840151610500850151600080516020615cd48339815191529190089150600080516020615cd4833981519152828c8c6075818110612a9757612a97615a6e565b90506020020135099150600080516020615cd4833981519152846019602002015183099150600080516020615cd4833981519152612ae383600080516020615cd4833981519152615bfe565b6104e0860151089150600080516020615cd483398151915284600f602002015183096103208501526105208401516101c0850151600080516020615cd48339815191529190096104e0850152600080516020615cd48339815191528b8b6078818110612b5157612b51615a6e565b90506020020135600080516020615cd4833981519152612b719190615bfe565b8c8c6077818110612b8457612b84615a6e565b90506020020135089150600080516020615cd4833981519152828560296020020151099150600080516020615cd483398151915284600f602002015183096105008501526060840151600080516020615cd4833981519152908c8c607c818110612bf057612bf0615a6e565b90506020020135089150600080516020615cd4833981519152828c8c607b818110612c1d57612c1d615a6e565b90506020020135096105208501526080840151600080516020615cd4833981519152908c8c607e818110612c5357612c53615a6e565b90506020020135089150600080516020615cd483398151915282856029602002015109610520850152612cac8b8b6054818110612c9257612c92615a6e565b905060200201358c8c604381811061211f5761211f615a6e565b610580850152600080516020615cd48339815191528b8b6055818110612cd457612cd4615a6e565b9050602002013585600260548110612cee57612cee615a6e565b6020020151086105a0850152600080516020615cd48339815191528b8b607e818110612d1c57612d1c615a6e565b90506020020135600080516020615cd4833981519152612d3c9190615bfe565b8c8c607c818110612d4f57612d4f615a6e565b90506020020135086105c0850152600080516020615cd48339815191528b8b607a818110612d7f57612d7f615a6e565b90506020020135600080516020615cd4833981519152612d9f9190615bfe565b6001089150600080516020615cd48339815191528285600e6020020151096105e0850152600080516020615cd48339815191528b8b607a818110612de557612de5615a6e565b905060200201358c8c607a818110612dff57612dff615a6e565b90506020020135099150600080516020615cd48339815191528b8b607a818110612e2b57612e2b615a6e565b90506020020135600080516020615cd4833981519152612e4b9190615bfe565b83089150600080516020615cd4833981519152828560146020020151096106008501526060840151610580850151600080516020615cd48339815191529190089150600080516020615cd4833981519152828c8c607a818110612eb057612eb0615a6e565b905060200201350961058085015260808401516105a0850151600080516020615cd48339815191529190089150600080516020615cd48339815191528285602c6020020151099150600080516020615cd4833981519152612f1f83600080516020615cd4833981519152615bfe565b610520860151089150600080516020615cd483398151915284600f602002015183096105208501526105c08401516101c0850151600080516020615cd4833981519152919009610580850152600080516020615cd48339815191528b8b607d818110612f8d57612f8d615a6e565b90506020020135600080516020615cd4833981519152612fad9190615bfe565b8c8c607c818110612fc057612fc0615a6e565b90506020020135089150600080516020615cd48339815191528285602e6020020151099150600080516020615cd483398151915284600f602002015183096105a08501526060840151600080516020615cd4833981519152908c8c608181811061302c5761302c615a6e565b90506020020135089150600080516020615cd4833981519152828c8c608081811061305957613059615a6e565b90506020020135096105c08501526080840151600080516020615cd4833981519152908c8c608381811061308f5761308f615a6e565b90506020020135089150600080516020615cd48339815191528285602e6020020151096105c08501526130ce8b8b6056818110612c9257612c92615a6e565b610620850152600080516020615cd48339815191528b8b60578181106130f6576130f6615a6e565b905060200201358560026054811061311057613110615a6e565b602002015108610640850152600080516020615cd48339815191528b8b608381811061313e5761313e615a6e565b90506020020135600080516020615cd483398151915261315e9190615bfe565b8c8c608181811061317157613171615a6e565b9050602002013508610660850152600080516020615cd48339815191528b8b607f8181106131a1576131a1615a6e565b90506020020135600080516020615cd48339815191526131c19190615bfe565b6001089150600080516020615cd48339815191528285600e602002015109610680850152600080516020615cd48339815191528b8b607f81811061320757613207615a6e565b905060200201358c8c607f81811061322157613221615a6e565b90506020020135099150600080516020615cd48339815191528b8b607f81811061324d5761324d615a6e565b90506020020135600080516020615cd483398151915261326d9190615bfe565b83089150600080516020615cd4833981519152828560146020020151096106a08501526060840151610620850151600080516020615cd48339815191529190089150600080516020615cd4833981519152828c8c607f8181106132d2576132d2615a6e565b90506020020135096106208501526080840151610640850151600080516020615cd48339815191529190089150600080516020615cd4833981519152828560316020020151099150600080516020615cd483398151915261334183600080516020615cd4833981519152615bfe565b6105c0860151089150600080516020615cd483398151915284600f602002015183096105c08501526106608401516101c0850151600080516020615cd4833981519152919009610620850152600080516020615cd48339815191528b8b60828181106133af576133af615a6e565b90506020020135600080516020615cd48339815191526133cf9190615bfe565b8c8c60818181106133e2576133e2615a6e565b90506020020135089150600080516020615cd4833981519152828560336020020151099150600080516020615cd483398151915284600f602002015183096106408501526060840151600080516020615cd4833981519152908c8c608681811061344e5761344e615a6e565b90506020020135089150600080516020615cd4833981519152828c8c608581811061347b5761347b615a6e565b90506020020135096106608501526080840151600080516020615cd4833981519152908c8c60888181106134b1576134b1615a6e565b90506020020135089150600080516020615cd4833981519152828560336020020151096106608501526134f08b8b6058818110612c9257612c92615a6e565b6106c0850152600080516020615cd48339815191528b8b605981811061351857613518615a6e565b905060200201358560026054811061353257613532615a6e565b6020020151086040850152600080516020615cd48339815191528b8b608881811061355f5761355f615a6e565b90506020020135600080516020615cd483398151915261357f9190615bfe565b8c8c608681811061359257613592615a6e565b90506020020135086106e0850152600080516020615cd48339815191528b8b60848181106135c2576135c2615a6e565b90506020020135600080516020615cd48339815191526135e29190615bfe565b6001089150600080516020615cd48339815191528285600e602002015109610700850152600080516020615cd48339815191528b8b608481811061362857613628615a6e565b905060200201358c8c608481811061364257613642615a6e565b90506020020135099150600080516020615cd48339815191528b8b608481811061366e5761366e615a6e565b90506020020135600080516020615cd483398151915261368e9190615bfe565b83089150600080516020615cd48339815191528285601460200201510961028085015260608401516106c0850151600080516020615cd48339815191529190089150600080516020615cd4833981519152828c8c60848181106136f3576136f3615a6e565b9050602002013509606085015260808401516040850151600080516020615cd48339815191529190089150600080516020615cd4833981519152828560036020020151099150600080516020615cd483398151915261376083600080516020615cd4833981519152615bfe565b610660860151089150600080516020615cd483398151915284600f6020020151830960408501526106e08401516101c0850151600080516020615cd48339815191529190096060850152600080516020615cd48339815191528b8b60878181106137cc576137cc615a6e565b90506020020135600080516020615cd48339815191526137ec9190615bfe565b8c8c60868181106137ff576137ff615a6e565b90506020020135089150600080516020615cd4833981519152828560376020020151099150600080516020615cd483398151915284600f60200201518309608085015260a084015161385590600086601061122f565b915061388a8480600560200201517f35342d2c29302f2827192b2a24232226251f1e1d21201a18171c1b15161312118561524a565b91506138a884806005602002015168ff040302143832312e8561524a565b91506138bb8285600d60200201516151ed565b6040850152610100840151600080516020615cd483398151915290800960608501819052610100850151600080516020615cd4833981519152910960808501526139458b8b608f81811061391157613911615a6e565b905060200201358c8c609081811061392b5761392b615a6e565b90506020020135866004605481106105cb576105cb615a6e565b909250905061395e848c8c65ffff088b038d86866152cd565b90925090506139a182828d8d608981811061397b5761397b615a6e565b905060200201358e8e608a81811061399557613995615a6e565b905060200201356153d5565b6101e08601526101c08501526101608401516080850151600080516020615cd483398151915291900960a085015260e08401516080850151600080516020615cd4833981519152919009610160850181905260e0850151600080516020615cd483398151915291096101a0850181905260e0850151600080516020615cd48339815191529109610200850181905260e0850151600080516020615cd48339815191529109610220850181905260e0850151600080516020615cd48339815191529109610240850181905260e0850151600080516020615cd48339815191529109610260850152600080516020615cd48339815191528b8b6087818110613aa957613aa9615a6e565b9050602002013585601360548110613ac357613ac3615a6e565b6020020151099150613ae4848c8c6bffff0b6e0d731078117d128286615443565b9150613b218b8b6069818110613afc57613afc615a6e565b9050602002013585600460548110613b1657613b16615a6e565b60200201518461521d565b6102808501526101408401516060850151600080516020615cd4833981519152919009610140850152613b878b8b6063818110613b6057613b60615a6e565b9050602002013585600360548110613b7a57613b7a615a6e565b602002015186601461122f565b610280850152610120840151610100850151600080516020615cd483398151915291900961012085015260e0840151610100850151600080516020615cd48339815191529190096102a0850152600091505b6008821015613c8857600080516020615cd483398151915284613bfd846000615b89565b613c08906007615acc565b60548110613c1857613c18615a6e565b602002015185613c29856001615b89565b613c34906015615acc565b60548110613c4457613c44615a6e565b60200201510984613c56846001615b89565b613c61906016615acc565b60548110613c7157613c71615a6e565b602002015281613c8081615bc6565b925050613bd9565b600080516020615cd48339815191528b8b6085818110613caa57613caa615a6e565b9050602002013585601d60548110613cc457613cc4615a6e565b6020020151099150613ced848c8c73ffff0848156216651767186c19711a761b7b1c8086615443565b9150600080516020615cd4833981519152828560146020020151086102808501526102a08401516060850151600080516020615cd4833981519152919008606085015260e0840151600080516020615cd48339815191529080096102a0850181905260e0850151600080516020615cd483398151915291096103c0850152600091505b6032821015613e1f57600080516020615cd483398151915284613d94846000615b89565b613d9f906007615acc565b60548110613daf57613daf615a6e565b602002015185613dc0856001615b89565b613dcb90601e615acc565b60548110613ddb57613ddb615a6e565b60200201510984613ded846001615b89565b613df890601f615acc565b60548110613e0857613e08615a6e565b602002015281613e1781615bc6565b925050613d70565b600080516020615cd48339815191528b8b605a818110613e4157613e41615a6e565b9050602002013585605060548110613e5b57613e5b615a6e565b602002015109610a208501526101808401516109e0850151600080516020615cd4833981519152919009610a408501819052610180850151600080516020615cd48339815191529109610a608501819052610180850151600080516020615cd483398151915291096101808501526109e08401516040850151613ee1919086605161122f565b9150613f10848c8c7f3f50405141524253435444554556465747584859495b4a5c4b5d4c5e4d5f4e6086615443565b9150613f3f848c8c7f2f7a307c317e327f338134833584368637883849394a3a4b3b4c3c4d3d4e3e4f86615443565b9150613f6e848c8c7f1f4620472161226423662468256a266b276d286f29702a722b742c752d772e7986615443565b9150613f85848c8c67ffff074315441e4586615443565b9150600080516020615cd48339815191528b8b6042818110613fa957613fa9615a6e565b9050602002013583089150600080516020615cd48339815191528285601460200201510860408501526106c0840151610260850151600080516020615cd48339815191529190086102608501526106a08401516103a0850151600080516020615cd4833981519152919008610280850152610660840151610240850151600080516020615cd4833981519152919008610240850152610640840151610380850151600080516020615cd4833981519152919008610380850152610600840151610220850151600080516020615cd48339815191529190086102208501526105e0840151610360850151600080516020615cd48339815191529190086103608501526105a0840151610200850151600080516020615cd4833981519152919008610200850152610580840151610340850151600080516020615cd48339815191529190086103408501526105408401516101a0850151600080516020615cd48339815191529190086101a0850152610520840151610320850151600080516020615cd48339815191529190086103208501526104e0840151610160850151600080516020615cd48339815191529190086101608501526104c0840151610300850151600080516020615cd48339815191529190086103008501526104808401516080850151600080516020615cd483398151915291900860808501526104608401516102e0850151600080516020615cd48339815191529190086102e08501526104408401516102c0850151600080516020615cd48339815191529190086102c08501526104208401516060850151600080516020615cd48339815191529190086060850152610400840151610100850151600080516020615cd483398151915291900861010085015261427c8b8b608f81811061424857614248615a6e565b905060200201358c8c609081811061426257614262615a6e565b90506020020135866005605481106105cb576105cb615a6e565b90925090506142af848c8c7f182c192e1a301b321c341436098b03260a8d040a0b0e0d121016111a121e132286866152cd565b90925090506142d6848c8c73ffff4f3a523c533e0c405038068908081628172a86866152cd565b90925090506143287f0c7334a3b9a24f18780f368cf4e581f3ee206c995efcf2ad1d591075f34800d67f07c9c852e7cdf6ec7b0d7a9c71343fcc823836563a1eafe2964a7db347c644b486604e610623565b909250905061437a7f303399d69867569f44829166dbc811aec4050eb4351f07ce94137b2ea62615b77f21affd1d03a9a9e428842d8ef3da673c25888eba270e2de56fc7598de155776f86604d610623565b90925090506143cc7f0f8286c37689450e1171ff5f25b1fc58521cf3470ae9ea771918ecbee2094d847f1d371d5b9d97c37a0f1b8f3492dda158aa2dad81c52f7f2a512f63e59c705bed86604c610623565b909250905061441e7f139f3c97001d2d25928cab388bfe3f941f47bb46ef39095d1b0bc055185fa57f7f24d470b72fd0eecea0f5c65668c33110a005984460d7304582d1fcdd211df76886604b610623565b90925090506144707f1f9f5ab677532016ef9475fd5d43659678db3a699ad3d52e85c3f6ef2b3098c17f2cd62bc191e831701421d97bd158995f0f23e8645c14aa050602e958dd503b4786604a610623565b90925090506144c27f244e8af4f5d8644cfe7df55d0735c26e229afa7c7b92a39020bd02d8c8677b037f15a6dd332a6f0e9a9b643e86173dc6f99f4dc4bc18b215e0ac6a22e941fd9972866049610623565b90925090506145147f2bf75d9dd944249cd720ee71585980774cb83905b860feb5af3da42ca043b1157f07b4ff44a8e4250bf3ce16c06e8430b585a7a1e85243febe565a7929db37cc9f866048610623565b90925090506145667f20353da49405dca58c00c961510a2838b2bdeb06a053b8ed5931b8490967135b7f1ba4067d380f1db72eed4990fed1eb78d22addd5044bbea7d480f4e058d2fd08866047610623565b90925090506145b87f25d344a083be7e69cb907b8705b3bab3417d4a23f06d43ca7b287028a88ec5837f2c03f591ec6858cdff27cadaac1a67a1dc9ab7877f898686efe7033e7fd02a16866046610623565b909250905061460a7f19d9668da068ddb43d2e3d2c31214fefc028b0df0501ff8604575dafda6f1ae77f155edc361fbe4a694d9c6e3124a1c13d3180f39ab1af7521b35b6e2bb653b3da866045610623565b909250905061465c7f2bf75d9dd944249cd720ee71585980774cb83905b860feb5af3da42ca043b1157f07b4ff44a8e4250bf3ce16c06e8430b585a7a1e85243febe565a7929db37cc9f866044610623565b90925090506146ae7f1936a9539ed59e0f2c4665a13ee2bdf544ee1359b2a47f4f8d3666540d5be89e7f15efeffb7af6c45498a8d4779c0a2ca3a116a96348e8e51392ef924d6ab7dbfd866043610623565b90925090506147007f2fd08ae291ca0c95ada3f562b9f9be896737fd57493c4cefa087979abda4d2d67f04a6506069e2d39e944abcc54e70e881ccdd429ed4c1017fbe1099efeb70465f866042610623565b90925090506147527f0141bcf8e5540e9f5aa60645bf265946a71874beb52ddca1a0df8df6bbc0e0fa7f14e8506ee1911816df221897db48964bf861b4abecdb9da24afbcf9b0c4d18b8866041610623565b90925090506147a47f2ea5cb6082a4df4a36091fef8188e8e0f8d4b6e1e37707746707d99f548aef427f1766582f9e1ec20bed2f0d93154ae653f3089c934fca9f7b87192ed78b760c8d866040610623565b90925090506147f67f136635b335232ad0bb9ec1dd165740fb1f32464fd47c68a84fa6844059faf5217f090e5e51625ce01fec4c2647771bd32f228b8ea580c498822ee58d2a607b892186603f610623565b90925090506148487f143877d82d6f4d6a6e18301f05defdfa526f0d95977cec3c32e231b1aa0a81567f1906928f9c2d199d9062ece64e8dbff97e27ab2d8326b40e7ea77a950b21ddd986603e610623565b909250905061489a7f27ebdd749900c0af821c3d7bfee6f6216c2a101d247a8dd93db6590692d1689a7f2da8ee70127f67344aded9134ceff263c69790b3d020786c616f76349b19aef386603d610623565b90925090506148ec7f148ff3c1217e5849d79a5ad4e55e1f66e553e0c24a335730306b58c35f0be7647f29d393499e332436f2578d1e95f1aa58d1539c3bd0820157a6e9ed12a906301586603c610623565b909250905061493e7f1d0246b7158fd8adee20544a12a9c7037653efa8e5ca0da702f29744a3cc595d7f0d1c5bd48350de3282920c3453c6da531a1fd6fce81bacfd5e5289123458d67586603b610623565b90925090506149907f0a690884507cd616b1598e45913a0478135225c4a1ed39eb4d22552feff5f3b07f119e66501b5ff7f5a2d09bce4b7b1fe0e078c6764867222ed23ba35f317f200086603a610623565b90925090506149e27f18cfb2048fda3eb8a660efd7855014c0500be2531cbcd7e163455fe2b1972ce37f0e835d2d22b6c1e675e76f544bb7aea2e74b04659f91ecf97eccca4024c49326866039610623565b9092509050614a347f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000866038610623565b9092509050614a5f848c8c77ffff070015021e041f06250c28102b142e18311c3420372486866152cd565b85516020870151929450909250614a7991849184916153d5565b60208601528452614a8e6001600286816105cb565b85516020870151929450909250614aa69184846154e5565b602086018190528186526101c08601516101e090960151959d959c50909a509850929650505050505050565b614ada615834565b80517f186282957db913abd99f91db59fe69922e95040603ef44c0bd7aa3adeef8f5ac905280517f17944351223333f260ddc3b4af45191b856689eda9eab5cbcddbbe570ce860d2602091820152810180517f298adc7396bd3865cbf6d6df91bae406694e6d2215baa893bdeadb63052895f49052517f297772d34bc9aa8ae56162486363ffe417b02dc7e8c207fc2cc20203e67a02ad9060015b602002015290565b614b85615834565b80517f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2905280517f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed602091820152810180517f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec9052517f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d906001614b75565b60008083516006614c359190615b89565b905060008167ffffffffffffffff811115614c5257614c52615ae4565b604051908082528060200260200182016040528015614c7b578160200160208202803683370190505b509050614c86615897565b60008551875114614c9657600080fd5b60005b8751811015614ecf57878181518110614cb457614cb4615a6e565b60200260200101516000015184826006614cce9190615b89565b614cd9906000615acc565b81518110614ce957614ce9615a6e565b602002602001018181525050878181518110614d0757614d07615a6e565b60200260200101516020015184826006614d219190615b89565b614d2c906001615acc565b81518110614d3c57614d3c615a6e565b602002602001018181525050868181518110614d5a57614d5a615a6e565b6020908102919091010151515184614d73836006615b89565b614d7e906002615acc565b81518110614d8e57614d8e615a6e565b602002602001018181525050868181518110614dac57614dac615a6e565b60209081029190910181015151015184614dc7836006615b89565b614dd2906003615acc565b81518110614de257614de2615a6e565b602002602001018181525050868181518110614e0057614e00615a6e565b602002602001015160200151600060028110614e1e57614e1e615a6e565b602002015184614e2f836006615b89565b614e3a906004615acc565b81518110614e4a57614e4a615a6e565b602002602001018181525050868181518110614e6857614e68615a6e565b602002602001015160200151600160028110614e8657614e86615a6e565b602002015184614e97836006615b89565b614ea2906005615acc565b81518110614eb257614eb2615a6e565b602090810291909101015280614ec781615bc6565b915050614c99565b50602082602086026020860160085afa905080614eeb57600080fd5b5051151595945050505050565b60606000614f058361552a565b600101905060008167ffffffffffffffff811115614f2557614f25615ae4565b6040519080825280601f01601f191660200182016040528015614f4f576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084614f5957509392505050565b600080614fc16158b5565b6000614fe0604051806040016040528060008152602001600081525090565b8783526020830187905260408084018790528160608560075afa91508161500657600080fd5b8051602090910151909890975095505050505050565b6000806150276158d3565b8781526020810187905260408101869052606081018590526080810184905261504f8161560d565b6060810151608090910151909890975095505050505050565b6002828261507581615bc6565b93506090811061508757615087615a6e565b602002015282828261509881615bc6565b9350609081106150aa576150aa615a6e565b6020020152505050565b600182826150c181615bc6565b9350609081106150d3576150d3615a6e565b60200201528382826150e481615bc6565b9350609081106150f6576150f6615a6e565b602002015282828261510781615bc6565b93506090811061511957615119615a6e565b602002015250505050565b600080838363ffffffff166090811061513f5761513f615a6e565b60200201818152505060006151718484602061515b9190615c15565b615166906001615c41565b63ffffffff16615648565b51905061517d8161567e565b93525090919050565b6000615190615816565b615198615897565b6020808352828101819052604083018190526060830186905260808301859052600080516020615cd483398151915260a08401526000908260c08560055afa9050806151e357600080fd5b5051949350505050565b6000816000036151fc57600080fd5b600080516020615cd4833981519152615214836157f2565b84099392505050565b6000600080516020615cd483398151915282600080516020615cd483398151915285870908949350505050565b6000805b60208110156152c35760ff8085169081146152aa5760089490941c93600080516020615cd483398151915287826054811061528b5761528b615a6e565b6020020151600080516020615cd48339815191528689090893506152b0565b506152c3565b506152bc600182615acc565b905061524e565b5090949350505050565b6000806152d86158d3565b606081018590526080810184905260005b60208110156153ba5760ff8088169081146153a157601088901c9760081c60ff168a8a8381811061531c5761531c615a6e565b905060200201358460006005811061533657615336615a6e565b60200201528a8a615348846001615acc565b81811061535757615357615a6e565b905060200201358460016005811061537157615371615a6e565b60200201528b816054811061538857615388615a6e565b6020020151604085015261539b8461560d565b506153a7565b506153ba565b506153b3600282615acc565b90506152e9565b50606081015160809091015190999098509650505050505050565b60008060006153f7604051806040016040528060008152602001600081525090565b6153ff6158f1565b888152602081018890526040808201889052606082018790528260808360065afa92508261542c57600080fd5b508051602090910151909890975095505050505050565b6000805b60208110156154da5760ff8085169081146154c157601085901c9460081c60ff16600080516020615cd483398151915285600080516020615cd48339815191528b846054811061549957615499615a6e565b60200201518b8b878181106154b0576154b0615a6e565b9050602002013509089450506154c7565b506154da565b506154d3600282615acc565b9050615447565b509095945050505050565b60008061551d868686615518877f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47615bfe565b6153d5565b9150915094509492505050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310615573577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef8100000000831061559f576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106155bd57662386f26fc10000830492506010015b6305f5e10083106155d5576305f5e100830492506008015b61271083106155e957612710830492506004015b606483106155fb576064830492506002015b600a8310615607576001015b92915050565b600060406020830160608460075afa90508061562857600080fd5b60406060830160806020850160065afa90508061564457600080fd5b5050565b615650615897565b6000602082848660026107d05a03fa9050808061566957fe5b508061567757615677615c69565b5092915050565b6000816157d18160008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b6008827fff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0016901c1790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b6010827fffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff000016901c1790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b6020827fffffffff00000000ffffffff00000000ffffffff00000000ffffffff0000000016901c17905060408177ffffffffffffffff0000000000000000ffffffffffffffff16901b6040827fffffffffffffffff0000000000000000ffffffffffffffff000000000000000016901c179050608081901b608082901c179050919050565b90506157eb600080516020615cd483398151915282615c98565b9392505050565b6000615607826158116002600080516020615cd4833981519152615bfe565b615186565b6040518060c001604052806006906020820280368337509192915050565b604051806040016040528061584761590f565b815260200161585461590f565b905290565b60405180610a8001604052806054906020820280368337509192915050565b6040518061120001604052806090906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b60405180606001604052806003906020820280368337509192915050565b6040518060a001604052806005906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b60008083601f84011261593f57600080fd5b50813567ffffffffffffffff81111561595757600080fd5b6020830191508360208260051b850101111561597257600080fd5b9250929050565b60008060008060006060868803121561599157600080fd5b853567ffffffffffffffff808211156159a957600080fd5b6159b589838a0161592d565b909750955060208801359150808211156159ce57600080fd5b506159db8882890161592d565b96999598509660400135949350505050565b60005b83811015615a085781810151838201526020016159f0565b83811115615a17576000848401525b50505050565b6020815260008251806020840152615a3c8160408501602087016159ed565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115615adf57615adf615a9d565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008451615b258184602089016159ed565b80830190507f2e000000000000000000000000000000000000000000000000000000000000008082528551615b61816001850160208a016159ed565b60019201918201528351615b7c8160028401602088016159ed565b0160020195945050505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615bc157615bc1615a9d565b500290565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615bf757615bf7615a9d565b5060010190565b600082821015615c1057615c10615a9d565b500390565b600063ffffffff80831681851681830481118215151615615c3857615c38615a9d565b02949350505050565b600063ffffffff808316818516808303821115615c6057615c60615a9d565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082615cce577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50069056fe30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a164736f6c634300080f000a", + "numDeployments": 3, + "solcInputHash": "863c43a48ece9e85473cc53ed33ac014", + "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_hashScalar\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_m56Px\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_m56Py\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"proof\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"target_circuit_final_pair\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes32\",\"name\":\"publicInputHash\",\"type\":\"bytes32\"}],\"name\":\"verify\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"stateVariables\":{\"version\":{\"custom:semver\":\"0.1.5\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"version()\":{\"notice\":\"Semantic version.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/L1/ZKVerifier.sol\":\"ZKVerifier\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/\",\":@rari-capital/solmate/=node_modules/@rari-capital/solmate/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\",\":hardhat-deploy/=node_modules/hardhat-deploy/\",\":hardhat/=node_modules/hardhat/\"]},\"sources\":{\"contracts/L1/ZKVerifier.sol\":{\"keccak256\":\"0x4fdfa0741e02a406e77e6865ca0db9204b0f65fd029465c78f0aa05a3de99090\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://f6dbef4fd954c221f015f49301f4cf449804c716bfafc6a20ccecdef973b5662\",\"dweb:/ipfs/QmadP4tKoG3o4SakiRbSsASiKtJzGSL7eYHkkL4w2fYF8i\"]},\"contracts/universal/ISemver.sol\":{\"keccak256\":\"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a\",\"dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR\"]}},\"version\":1}", + "bytecode": "0x60e06040523480156200001157600080fd5b5060405162005b1738038062005b17833981016040819052620000349162000046565b60809290925260a05260c05262000075565b6000806000606084860312156200005c57600080fd5b8351925060208401519150604084015190509250925092565b60805160a05160c051615a72620000a5600039600061499e0152600061497d015260006107140152615a726000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80634292dc3e1461003b57806354fd4d5014610063575b600080fd5b61004e61004936600461576f565b6100ac565b60405190151581526020015b60405180910390f35b61009f6040518060400160405280600581526020017f302e312e3500000000000000000000000000000000000000000000000000000081525081565b60405161005a91906157e3565b60006100b661560c565b848460008181106100c9576100c9615856565b9050602002013570ffffffffffffffffffffffffffffffffff16816000600681106100f6576100f6615856565b602002015260888585600181811061011057610110615856565b90506020020135600116901b60888686600081811061013157610131615856565b90506020020135901c61014491906158b4565b60208201528484600281811061015c5761015c615856565b9050602002013570ffffffffffffffffffffffffffffffffff168160026006811061018957610189615856565b60200201526088858560038181106101a3576101a3615856565b90506020020135600116901b6088868660028181106101c4576101c4615856565b90506020020135901c6101d791906158b4565b606080830191909152608084811c908301526fffffffffffffffffffffffffffffffff841660a08301526040805160028082529281019091526000918291829182918291816020015b60408051808201909152600080825260208201528152602001906001900390816102205750506040805160028082526060820190925291925060009190602082015b61026a61562a565b81526020019060019003908161026257905050905061028a8d8d896104fb565b85519399509097509095509350869083906000906102aa576102aa615856565b6020026020010151600001818152505083826000815181106102ce576102ce615856565b6020026020010151602001818152505084826001815181106102f2576102f2615856565b60200260200101516000018181525050828260018151811061031657610316615856565b6020026020010151602001818152505061032e614a63565b8160008151811061034157610341615856565b6020026020010181905250610354614b0e565b8160018151811061036757610367615856565b602002602001018190525061037c8282614bb5565b6103905760009750505050505050506104f2565b8a8a60008181106103a3576103a3615856565b90506020020135826000815181106103bd576103bd615856565b6020908102919091010151528a8a60018181106103dc576103dc615856565b90506020020135826000815181106103f6576103f6615856565b602002602001015160200181815250508a8a600281811061041957610419615856565b905060200201358260018151811061043357610433615856565b6020908102919091010151528a8a600381811061045257610452615856565b905060200201358260018151811061046c5761046c615856565b60200260200101516020018181525050610484614a63565b8160008151811061049757610497615856565b60200260200101819052506104aa614b0e565b816001815181106104bd576104bd615856565b60200260200101819052506104d28282614bb5565b6104e65760009750505050505050506104f2565b60019750505050505050505b95945050505050565b60008060008061050961564f565b61051161566e565b6000806105667f2754b04f3f510d0e86a0d0e811f0fc16f92b722514e1729066d2abf90811d6f27f1816b0f9909a5a979bd34c559e57b4096bee5cce7eb668bc0a9805677f40dc858b845b6020020151614e89565b90925090506105c07f174fa57071f8f6e53fcb31a5ecc33274ec76e4e186eeb0b64255d2f314cd50b27f1c399365e85e4de2761ebcf350da85ff4518cc82f7cef64a477a7a5fd11d4a448b60015b60200201518585614eef565b90925090506106127f259a4d5cd83279b6dc9ca2008b669f82e91f23804e2524c5087a2452d52c33bd7f303abddb7ae0f35e3a6bd39314b347c3c3a433f72833dda1998ad2176258baa38b60026105b4565b90925090506106647f252b158900f31a7c0c00b924e7d3c8d61a60c5e9fd2b83251ba73d1dc0b680f57f29c8c2b3f0d74267bc2b0f9f3568838cdb0eee4719391790d93d0015c00ce5af8b60036105b4565b90925090506106b67f0c25f9f3c38b6a128d7d38c5625a3976d389b5f9f33098bb419968e4d18e150e7f21fb777462c7f4af71940423babc7f882f0c97be9620ef84f6f11974ee0edb8e8b60046105b4565b90925090506107087f2280a0fd7dbf95c450830906ffc607a373d5b9b56b9101138e925ad557eb355a7f0697ab7e9a5377e2759ab6d1283301ccae9c72bad14946a9513ee19be1ec825e8b60056105b4565b6020860152845261073b7f0000000000000000000000000000000000000000000000000000000000000000846000614f3b565b8351602085015161074f9190856002614f87565b600091505b600482116107ed576107db8b8b61076c8560026158fb565b6107779060006158b4565b81811061078657610786615856565b905060200201358c8c85600261079c91906158fb565b6107a79060016158b4565b8181106107b6576107b6615856565b90506020020135858560036107cb91906158fb565b6107d69060056158b4565b614f87565b816107e581615938565b925050610754565b6107f8836014614ff7565b6040850152600091505b600d8211610896576108848b8b61081a8560026158fb565b61082590600a6158b4565b81811061083457610834615856565b905060200201358c8c85600261084a91906158fb565b61085590600b6158b4565b81811061086457610864615856565b905060200201358585600361087991906158fb565b6107d69060016158b4565b8161088e81615938565b925050610802565b6108a183602b614ff7565b60608501526108b1836001614ff7565b6080850152600091505b600982116109205761090e8b8b6108d38560026158fb565b6108de9060266158b4565b8181106108ed576108ed615856565b905060200201358c8c85600261090391906158fb565b6108559060276158b4565b8161091881615938565b9250506108bb565b61092b83601f614ff7565b60a0850152600091505b6003821161099a576109888b8b61094d8560026158fb565b61095890603a6158b4565b81811061096757610967615856565b905060200201358c8c85600261097d91906158fb565b61085590603b6158b4565b8161099281615938565b925050610935565b6109a583600d614ff7565b60c0850152600091505b60468211610a1857610a068b8b6109c78560016158fb565b6109d29060426158b4565b8181106109e1576109e1615856565b90506020020135848460026109f691906158fb565b610a019060016158b4565b614f3b565b81610a1081615938565b9250506109af565b610a2383608f614ff7565b60e0850152600091505b60038211610a9257610a808b8b610a458560026158fb565b610a509060896158b4565b818110610a5f57610a5f615856565b905060200201358c8c856002610a7591906158fb565b61085590608a6158b4565b81610a8a81615938565b925050610a2d565b610a9d83600d614ff7565b61010085015260c0840151600080516020615a46833981519152907f1dba8b5bdd64ef6ce29a9039aca3c0e524395c43b9227b96c75090cc6cc7ec97900961012085015260c0840151600080516020615a46833981519152907f24a1fcd63e9f03b27281db85fe631ec8e5c466f8178a4ee94d4942b7ccd90e1c900961014085015260c0840151600080516020615a46833981519152907f20bab6e5f766b4edf82399e9c5ff0e40d4b6875321a3d8020e18521d8f5c7241900961016085015260c0840151610b70906304000000615059565b610180850152600080516020615a46833981519152610b90600182615970565b610180860151086101a08501819052600080516020615a46833981519152907f30644e66c81e03716be83b486d6feabcc7ddd0fe6cbf5e72d585d142f7829b05096101c0850152600080516020615a46833981519152610bf1600182615970565b60c0860151089150610c0b84600e5b6020020151836150c0565b6101c08501526101a0840151600080516020615a46833981519152907f07baaa5b7af9cf52cd226bc56865f0f99ef8fcd4219060f09f43e9a148b5ab68096101e0850152600080516020615a46833981519152610c887f20bab6e5f766b4edf82399e9c5ff0e40d4b6875321a3d8020e18521d8f5c724182615970565b60c0860151089150610c9b84600f610c00565b6101e08501526101a0840151600080516020615a46833981519152907f1c699f652457365bf2fc4fa2c5c63d6c4349b03cb46d633d7a2655c5da4b900a09610200850152600080516020615a46833981519152610d187f19277f31ecb5bfe8604677099c09556812b0b5c50cceb2b584098183a5a6c5c882615970565b60c0860151089150610d2b846010610c00565b6102008501526101a0840151600080516020615a46833981519152907f205cdbaf03903a5c23e60eef0df90673bc65a25762694c501e3281153b4e588a09610220850152600080516020615a46833981519152610da87f082a7bd4c0a7e4352229d332c27a160da18f0d7c651f3047df41b80345532f6e82615970565b60c0860151089150610dbb846011610c00565b6102208501526101a0840151600080516020615a46833981519152907f27db73b1a831278e143aab90091db38afdea3294c4ba05d1c697a392eb09cc7909610240850152600080516020615a46833981519152610e387f26501ebfe559ea5826f023d3e76e4b66f170cd940408eb5590a4075c80b498d682615970565b60c0860151089150610e4b846012610c00565b6102408501526101a0840151600080516020615a46833981519152907f0204822d629ab653697f028f5fa17d23ac2ba08c60c7112d98ebd28f325f0af609610260850152600080516020615a46833981519152610ec87f0d5eb4c216db2c3262de3f6a2ef71a9be95ff21a7a1a50ed069d6131e7d54e5f82615970565b60c0860151089150610edb846013610c00565b6102608501526101a0840151600080516020615a46833981519152907f2622622a60c0d9327ccf066a0f1fce13c48601b976affd1f41c2a72a9f77da6409610280850152600080516020615a46833981519152610f587f24a1fcd63e9f03b27281db85fe631ec8e5c466f8178a4ee94d4942b7ccd90e1c82615970565b60c0860151089150610f6b846014610c00565b6102808501526102008401516101e0850151600080516020615a468339815191529190089150600080516020615a46833981519152846011602002015183089150600080516020615a46833981519152846012602002015183089150600080516020615a46833981519152846013602002015183086101e085015261103c8b8b604a818110610ffc57610ffc615856565b905060200201358c8c604881811061101657611016615856565b905060200201358d8d604981811061103057611030615856565b905060200201356150f0565b915061107b8b8b604b81811061105457611054615856565b905060200201358c8c604381811061106e5761106e615856565b90506020020135846150f0565b91506110ad8b8b604c81811061109357611093615856565b905060200201358c8c604481811061106e5761106e615856565b91506110df8b8b604d8181106110c5576110c5615856565b905060200201358c8c604581811061106e5761106e615856565b91506111118b8b604e8181106110f7576110f7615856565b905060200201358c8c604681811061106e5761106e615856565b91506111438b8b604f81811061112957611129615856565b905060200201358c8c604781811061106e5761106e615856565b610200850152600080516020615a468339815191528b8b604481811061116b5761116b615856565b905060200201358c8c604381811061118557611185615856565b905060200201350991506111ca8b8b60508181106111a5576111a5615856565b9050602002013583866010605481106111c0576111c0615856565b60200201516150f0565b610200850152600080516020615a468339815191528b8b60468181106111f2576111f2615856565b905060200201358c8c604581811061120c5761120c615856565b9050602002013509915061122c8b8b60518181106111a5576111a5615856565b610200850152600080516020615a468339815191528b8b606181811061125457611254615856565b90506020020135600080516020615a468339815191526112749190615970565b6001089150600080516020615a468339815191528285600e602002015109610220850152600080516020615a468339815191528b8b60648181106112ba576112ba615856565b905060200201358c8c60648181106112d4576112d4615856565b90506020020135099150600080516020615a468339815191528b8b606481811061130057611300615856565b90506020020135600080516020615a468339815191526113209190615970565b83089150600080516020615a4683398151915282856014602002015109610240850152600080516020615a468339815191528b8b606381811061136557611365615856565b90506020020135600080516020615a468339815191526113859190615970565b8c8c606481811061139857611398615856565b90506020020135089150600080516020615a4683398151915284600e6020020151830961026085015260c08401516060850151600080516020615a468339815191529190096102a08501526101e0840151610280850151600080516020615a468339815191529190089150600080516020615a4683398151915261142a83600080516020615a46833981519152615970565b6001086101e08501526080840151600080516020615a46833981519152908c8c604381811061145b5761145b615856565b90506020020135086102c08501526114a68b8b605b81811061147f5761147f615856565b905060200201358560036054811061149957611499615856565b60200201518660166111c0565b9150600080516020615a468339815191528b8b60628181106114ca576114ca615856565b9050602002013583096102e08501526102a08401516102c0850151600080516020615a468339815191529190089150600080516020615a468339815191528b8b606181811061151b5761151b615856565b9050602002013583096102c08501526102a0840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096103008501526080840151600080516020615a46833981519152908c8c604481811061159057611590615856565b90506020020135086103208501526115db8b8b605c8181106115b4576115b4615856565b90506020020135856003605481106115ce576115ce615856565b60200201518660196111c0565b9150600080516020615a46833981519152846017602002015183096102e0850152610300840151610320850151600080516020615a468339815191529190089150600080516020615a46833981519152846016602002015183096102c0850152610300840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096103008501526080840151600080516020615a46833981519152908c8c60458181106116a1576116a1615856565b90506020020135086103208501526116c58b8b605d8181106115b4576115b4615856565b9150600080516020615a46833981519152846017602002015183096102e0850152610300840151610320850151600080516020615a468339815191529190089150600080516020615a46833981519152846016602002015183096102c0850152610300840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096103008501526102c0840151600080516020615a46833981519152906117839082615970565b6102e0860151089150600080516020615a4683398151915284600f602002015183096102c08501526102a0840151600080516020615a46833981519152907f18afdf23e9bd9302673fc1e076a492d4d65bd18ebc4d854ed189139bab313e5290096102a08501526080840151600080516020615a46833981519152908c8c604681811061181257611812615856565b90506020020135086102e085015261185d8b8b605e81811061183657611836615856565b905060200201358560036054811061185057611850615856565b60200201518660176111c0565b9150600080516020615a468339815191528b8b606581811061188157611881615856565b9050602002013583096103008501526102a08401516102e0850151600080516020615a468339815191529190089150600080516020615a468339815191528b8b60648181106118d2576118d2615856565b9050602002013583096102e08501526102a0840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096102a08501526080840151600080516020615a46833981519152908c8c604781811061194757611947615856565b905060200201350861032085015261196b8b8b605f8181106115b4576115b4615856565b9150600080516020615a46833981519152846018602002015183096103008501526102a0840151610320850151600080516020615a468339815191529190089150600080516020615a46833981519152846017602002015183096102e08501526102a0840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096102a08501526080840151600080516020615a46833981519152908c8c6042818110611a3157611a31615856565b9050602002013508610320850152611a558b8b60608181106115b4576115b4615856565b9150600080516020615a46833981519152846018602002015183096103008501526102a0840151610320850151600080516020615a468339815191529190089150600080516020615a46833981519152846017602002015183096102e08501526102a0840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096102a08501526102e0840151600080516020615a4683398151915290611b139082615970565b610300860151089150600080516020615a4683398151915284600f602002015183096102a08501526060840151600080516020615a46833981519152908c8c6068818110611b6357611b63615856565b90506020020135089150600080516020615a46833981519152828c8c6067818110611b9057611b90615856565b90506020020135096102e08501526080840151600080516020615a46833981519152908c8c606a818110611bc657611bc6615856565b90506020020135089150600080516020615a46833981519152828560176020020151096102e0850152600080516020615a468339815191528b8b6052818110611c1157611c11615856565b905060200201358c8c6043818110611c2b57611c2b615856565b90506020020135096103008501526040840151600080516020615a468339815191529060000960408501819052610300850151600080516020615a468339815191529108610300850152600080516020615a468339815191528b8b6053818110611c9757611c97615856565b9050602002013585600260548110611cb157611cb1615856565b602002015108610320850152600080516020615a468339815191528b8b606a818110611cdf57611cdf615856565b90506020020135600080516020615a46833981519152611cff9190615970565b8c8c6068818110611d1257611d12615856565b9050602002013508610340850152600080516020615a468339815191528b8b6066818110611d4257611d42615856565b90506020020135600080516020615a46833981519152611d629190615970565b6001089150600080516020615a468339815191528285600e602002015109610360850152600080516020615a468339815191528b8b6066818110611da857611da8615856565b905060200201358c8c6066818110611dc257611dc2615856565b90506020020135099150600080516020615a468339815191528b8b6066818110611dee57611dee615856565b90506020020135600080516020615a46833981519152611e0e9190615970565b83089150600080516020615a46833981519152828560146020020151096103808501526060840151610300850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c6066818110611e7357611e73615856565b90506020020135096103008501526080840151610320850151600080516020615a468339815191529190086103208501819052610300850151600080516020615a468339815191529190099150600080516020615a46833981519152611ee783600080516020615a46833981519152615970565b6102e0860151089150600080516020615a4683398151915284600f602002015183096102e08501526103408401516101c0850151600080516020615a46833981519152919009610300850152600080516020615a468339815191528b8b6069818110611f5557611f55615856565b90506020020135600080516020615a46833981519152611f759190615970565b8c8c6068818110611f8857611f88615856565b90506020020135089150600080516020615a468339815191528285601a6020020151099150600080516020615a4683398151915284600f602002015183096103408501526060840151600080516020615a46833981519152908c8c606d818110611ff457611ff4615856565b90506020020135089150600080516020615a46833981519152828c8c606c81811061202157612021615856565b90506020020135096103a08501526080840151600080516020615a46833981519152908c8c606f81811061205757612057615856565b90506020020135089150600080516020615a468339815191528285601d6020020151096103a08501526120ca8b8b605281811061209657612096615856565b905060200201358c8c60448181106120b0576120b0615856565b90506020020135866002605481106111c0576111c0615856565b6103c0850152600080516020615a468339815191528b8b606f8181106120f2576120f2615856565b90506020020135600080516020615a468339815191526121129190615970565b8c8c606d81811061212557612125615856565b90506020020135086103e0850152600080516020615a468339815191528b8b606b81811061215557612155615856565b90506020020135600080516020615a468339815191526121759190615970565b6001089150600080516020615a468339815191528285600e602002015109610400850152600080516020615a468339815191528b8b606b8181106121bb576121bb615856565b905060200201358c8c606b8181106121d5576121d5615856565b90506020020135099150600080516020615a468339815191528b8b606b81811061220157612201615856565b90506020020135600080516020615a468339815191526122219190615970565b83089150600080516020615a468339815191528285601460200201510961042085015260608401516103c0850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c606b81811061228657612286615856565b90506020020135099150600080516020615a46833981519152846019602002015183099150600080516020615a468339815191526122d283600080516020615a46833981519152615970565b6103a0860151089150600080516020615a4683398151915284600f602002015183096103a08501526103e08401516101c0850151600080516020615a468339815191529190096103c0850152600080516020615a468339815191528b8b606e81811061234057612340615856565b90506020020135600080516020615a468339815191526123609190615970565b8c8c606d81811061237357612373615856565b90506020020135089150600080516020615a468339815191528285601f6020020151099150600080516020615a4683398151915284600f602002015183096103e08501526060840151600080516020615a46833981519152908c8c60728181106123df576123df615856565b90506020020135089150600080516020615a46833981519152828c8c607181811061240c5761240c615856565b90506020020135096104408501526080840151600080516020615a46833981519152908c8c607481811061244257612442615856565b90506020020135089150600080516020615a468339815191528285602260200201510961044085015261249b8b8b605281811061248157612481615856565b905060200201358c8c60458181106120b0576120b0615856565b610460850152600080516020615a468339815191528b8b60748181106124c3576124c3615856565b90506020020135600080516020615a468339815191526124e39190615970565b8c8c60728181106124f6576124f6615856565b9050602002013508610480850152600080516020615a468339815191528b8b607081811061252657612526615856565b90506020020135600080516020615a468339815191526125469190615970565b6001089150600080516020615a468339815191528285600e6020020151096104a0850152600080516020615a468339815191528b8b607081811061258c5761258c615856565b905060200201358c8c60708181106125a6576125a6615856565b90506020020135099150600080516020615a468339815191528b8b60708181106125d2576125d2615856565b90506020020135600080516020615a468339815191526125f29190615970565b83089150600080516020615a46833981519152828560146020020151096104c08501526060840151610460850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c607081811061265757612657615856565b90506020020135099150600080516020615a46833981519152846019602002015183099150600080516020615a468339815191526126a383600080516020615a46833981519152615970565b610440860151089150600080516020615a4683398151915284600f602002015183096104408501526104808401516101c0850151600080516020615a46833981519152919009610460850152600080516020615a468339815191528b8b607381811061271157612711615856565b90506020020135600080516020615a468339815191526127319190615970565b8c8c607281811061274457612744615856565b90506020020135089150600080516020615a46833981519152828560246020020151099150600080516020615a4683398151915284600f602002015183096104808501526060840151600080516020615a46833981519152908c8c60778181106127b0576127b0615856565b90506020020135089150600080516020615a46833981519152828c8c60768181106127dd576127dd615856565b90506020020135096104e08501526080840151600080516020615a46833981519152908c8c607981811061281357612813615856565b90506020020135089150600080516020615a46833981519152828560276020020151096104e085015261286c8b8b605281811061285257612852615856565b905060200201358c8c60468181106120b0576120b0615856565b610500850152600080516020615a468339815191528b8b607981811061289457612894615856565b90506020020135600080516020615a468339815191526128b49190615970565b8c8c60778181106128c7576128c7615856565b9050602002013508610520850152600080516020615a468339815191528b8b60758181106128f7576128f7615856565b90506020020135600080516020615a468339815191526129179190615970565b6001089150600080516020615a468339815191528285600e602002015109610540850152600080516020615a468339815191528b8b607581811061295d5761295d615856565b905060200201358c8c607581811061297757612977615856565b90506020020135099150600080516020615a468339815191528b8b60758181106129a3576129a3615856565b90506020020135600080516020615a468339815191526129c39190615970565b83089150600080516020615a46833981519152828560146020020151096105608501526060840151610500850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c6075818110612a2857612a28615856565b90506020020135099150600080516020615a46833981519152846019602002015183099150600080516020615a46833981519152612a7483600080516020615a46833981519152615970565b6104e0860151089150600080516020615a4683398151915284600f602002015183096103208501526105208401516101c0850151600080516020615a468339815191529190096104e0850152600080516020615a468339815191528b8b6078818110612ae257612ae2615856565b90506020020135600080516020615a46833981519152612b029190615970565b8c8c6077818110612b1557612b15615856565b90506020020135089150600080516020615a46833981519152828560296020020151099150600080516020615a4683398151915284600f602002015183096105008501526060840151600080516020615a46833981519152908c8c607c818110612b8157612b81615856565b90506020020135089150600080516020615a46833981519152828c8c607b818110612bae57612bae615856565b90506020020135096105208501526080840151600080516020615a46833981519152908c8c607e818110612be457612be4615856565b90506020020135089150600080516020615a4683398151915282856029602002015109610520850152612c3d8b8b6054818110612c2357612c23615856565b905060200201358c8c60438181106120b0576120b0615856565b610580850152600080516020615a468339815191528b8b6055818110612c6557612c65615856565b9050602002013585600260548110612c7f57612c7f615856565b6020020151086105a0850152600080516020615a468339815191528b8b607e818110612cad57612cad615856565b90506020020135600080516020615a46833981519152612ccd9190615970565b8c8c607c818110612ce057612ce0615856565b90506020020135086105c0850152600080516020615a468339815191528b8b607a818110612d1057612d10615856565b90506020020135600080516020615a46833981519152612d309190615970565b6001089150600080516020615a468339815191528285600e6020020151096105e0850152600080516020615a468339815191528b8b607a818110612d7657612d76615856565b905060200201358c8c607a818110612d9057612d90615856565b90506020020135099150600080516020615a468339815191528b8b607a818110612dbc57612dbc615856565b90506020020135600080516020615a46833981519152612ddc9190615970565b83089150600080516020615a46833981519152828560146020020151096106008501526060840151610580850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c607a818110612e4157612e41615856565b905060200201350961058085015260808401516105a0850151600080516020615a468339815191529190089150600080516020615a468339815191528285602c6020020151099150600080516020615a46833981519152612eb083600080516020615a46833981519152615970565b610520860151089150600080516020615a4683398151915284600f602002015183096105208501526105c08401516101c0850151600080516020615a46833981519152919009610580850152600080516020615a468339815191528b8b607d818110612f1e57612f1e615856565b90506020020135600080516020615a46833981519152612f3e9190615970565b8c8c607c818110612f5157612f51615856565b90506020020135089150600080516020615a468339815191528285602e6020020151099150600080516020615a4683398151915284600f602002015183096105a08501526060840151600080516020615a46833981519152908c8c6081818110612fbd57612fbd615856565b90506020020135089150600080516020615a46833981519152828c8c6080818110612fea57612fea615856565b90506020020135096105c08501526080840151600080516020615a46833981519152908c8c608381811061302057613020615856565b90506020020135089150600080516020615a468339815191528285602e6020020151096105c085015261305f8b8b6056818110612c2357612c23615856565b610620850152600080516020615a468339815191528b8b605781811061308757613087615856565b90506020020135856002605481106130a1576130a1615856565b602002015108610640850152600080516020615a468339815191528b8b60838181106130cf576130cf615856565b90506020020135600080516020615a468339815191526130ef9190615970565b8c8c608181811061310257613102615856565b9050602002013508610660850152600080516020615a468339815191528b8b607f81811061313257613132615856565b90506020020135600080516020615a468339815191526131529190615970565b6001089150600080516020615a468339815191528285600e602002015109610680850152600080516020615a468339815191528b8b607f81811061319857613198615856565b905060200201358c8c607f8181106131b2576131b2615856565b90506020020135099150600080516020615a468339815191528b8b607f8181106131de576131de615856565b90506020020135600080516020615a468339815191526131fe9190615970565b83089150600080516020615a46833981519152828560146020020151096106a08501526060840151610620850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c607f81811061326357613263615856565b90506020020135096106208501526080840151610640850151600080516020615a468339815191529190089150600080516020615a46833981519152828560316020020151099150600080516020615a468339815191526132d283600080516020615a46833981519152615970565b6105c0860151089150600080516020615a4683398151915284600f602002015183096105c08501526106608401516101c0850151600080516020615a46833981519152919009610620850152600080516020615a468339815191528b8b608281811061334057613340615856565b90506020020135600080516020615a468339815191526133609190615970565b8c8c608181811061337357613373615856565b90506020020135089150600080516020615a46833981519152828560336020020151099150600080516020615a4683398151915284600f602002015183096106408501526060840151600080516020615a46833981519152908c8c60868181106133df576133df615856565b90506020020135089150600080516020615a46833981519152828c8c608581811061340c5761340c615856565b90506020020135096106608501526080840151600080516020615a46833981519152908c8c608881811061344257613442615856565b90506020020135089150600080516020615a46833981519152828560336020020151096106608501526134818b8b6058818110612c2357612c23615856565b6106c0850152600080516020615a468339815191528b8b60598181106134a9576134a9615856565b90506020020135856002605481106134c3576134c3615856565b6020020151086040850152600080516020615a468339815191528b8b60888181106134f0576134f0615856565b90506020020135600080516020615a468339815191526135109190615970565b8c8c608681811061352357613523615856565b90506020020135086106e0850152600080516020615a468339815191528b8b608481811061355357613553615856565b90506020020135600080516020615a468339815191526135739190615970565b6001089150600080516020615a468339815191528285600e602002015109610700850152600080516020615a468339815191528b8b60848181106135b9576135b9615856565b905060200201358c8c60848181106135d3576135d3615856565b90506020020135099150600080516020615a468339815191528b8b60848181106135ff576135ff615856565b90506020020135600080516020615a4683398151915261361f9190615970565b83089150600080516020615a468339815191528285601460200201510961028085015260608401516106c0850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c608481811061368457613684615856565b9050602002013509606085015260808401516040850151600080516020615a468339815191529190089150600080516020615a46833981519152828560036020020151099150600080516020615a468339815191526136f183600080516020615a46833981519152615970565b610660860151089150600080516020615a4683398151915284600f6020020151830960408501526106e08401516101c0850151600080516020615a468339815191529190096060850152600080516020615a468339815191528b8b608781811061375d5761375d615856565b90506020020135600080516020615a4683398151915261377d9190615970565b8c8c608681811061379057613790615856565b90506020020135089150600080516020615a46833981519152828560376020020151099150600080516020615a4683398151915284600f60200201518309608085015260a08401516137e69060008660106111c0565b915061381b8480600560200201517f35342d2c29302f2827192b2a24232226251f1e1d21201a18171c1b15161312118561511d565b915061383984806005602002015168ff040302143832312e8561511d565b915061384c8285600d60200201516150c0565b6040850152610100840151600080516020615a4683398151915290800960608501819052610100850151600080516020615a46833981519152910960808501526138d68b8b608f8181106138a2576138a2615856565b905060200201358c8c60908181106138bc576138bc615856565b905060200201358660046054811061055c5761055c615856565b90925090506138ef848c8c65ffff088b038d86866151a0565b909250905061393282828d8d608981811061390c5761390c615856565b905060200201358e8e608a81811061392657613926615856565b905060200201356152a8565b6101e08601526101c08501526101608401516080850151600080516020615a4683398151915291900960a085015260e08401516080850151600080516020615a46833981519152919009610160850181905260e0850151600080516020615a4683398151915291096101a0850181905260e0850151600080516020615a468339815191529109610200850181905260e0850151600080516020615a468339815191529109610220850181905260e0850151600080516020615a468339815191529109610240850181905260e0850151600080516020615a468339815191529109610260850152600080516020615a468339815191528b8b6087818110613a3a57613a3a615856565b9050602002013585601360548110613a5457613a54615856565b6020020151099150613a75848c8c6bffff0b6e0d731078117d128286615316565b9150613ab28b8b6069818110613a8d57613a8d615856565b9050602002013585600460548110613aa757613aa7615856565b6020020151846150f0565b6102808501526101408401516060850151600080516020615a46833981519152919009610140850152613b188b8b6063818110613af157613af1615856565b9050602002013585600360548110613b0b57613b0b615856565b60200201518660146111c0565b610280850152610120840151610100850151600080516020615a4683398151915291900961012085015260e0840151610100850151600080516020615a468339815191529190096102a0850152600091505b6008821015613c1957600080516020615a4683398151915284613b8e8460006158fb565b613b999060076158b4565b60548110613ba957613ba9615856565b602002015185613bba8560016158fb565b613bc59060156158b4565b60548110613bd557613bd5615856565b60200201510984613be78460016158fb565b613bf29060166158b4565b60548110613c0257613c02615856565b602002015281613c1181615938565b925050613b6a565b600080516020615a468339815191528b8b6085818110613c3b57613c3b615856565b9050602002013585601d60548110613c5557613c55615856565b6020020151099150613c7e848c8c73ffff0848156216651767186c19711a761b7b1c8086615316565b9150600080516020615a46833981519152828560146020020151086102808501526102a08401516060850151600080516020615a46833981519152919008606085015260e0840151600080516020615a468339815191529080096102a0850181905260e0850151600080516020615a4683398151915291096103c0850152600091505b6032821015613db057600080516020615a4683398151915284613d258460006158fb565b613d309060076158b4565b60548110613d4057613d40615856565b602002015185613d518560016158fb565b613d5c90601e6158b4565b60548110613d6c57613d6c615856565b60200201510984613d7e8460016158fb565b613d8990601f6158b4565b60548110613d9957613d99615856565b602002015281613da881615938565b925050613d01565b600080516020615a468339815191528b8b605a818110613dd257613dd2615856565b9050602002013585605060548110613dec57613dec615856565b602002015109610a208501526101808401516109e0850151600080516020615a46833981519152919009610a408501819052610180850151600080516020615a468339815191529109610a608501819052610180850151600080516020615a4683398151915291096101808501526109e08401516040850151613e7291908660516111c0565b9150613ea1848c8c7f3f50405141524253435444554556465747584859495b4a5c4b5d4c5e4d5f4e6086615316565b9150613ed0848c8c7f2f7a307c317e327f338134833584368637883849394a3a4b3b4c3c4d3d4e3e4f86615316565b9150613eff848c8c7f1f4620472161226423662468256a266b276d286f29702a722b742c752d772e7986615316565b9150613f16848c8c67ffff074315441e4586615316565b9150600080516020615a468339815191528b8b6042818110613f3a57613f3a615856565b9050602002013583089150600080516020615a468339815191528285601460200201510860408501526106c0840151610260850151600080516020615a468339815191529190086102608501526106a08401516103a0850151600080516020615a46833981519152919008610280850152610660840151610240850151600080516020615a46833981519152919008610240850152610640840151610380850151600080516020615a46833981519152919008610380850152610600840151610220850151600080516020615a468339815191529190086102208501526105e0840151610360850151600080516020615a468339815191529190086103608501526105a0840151610200850151600080516020615a46833981519152919008610200850152610580840151610340850151600080516020615a468339815191529190086103408501526105408401516101a0850151600080516020615a468339815191529190086101a0850152610520840151610320850151600080516020615a468339815191529190086103208501526104e0840151610160850151600080516020615a468339815191529190086101608501526104c0840151610300850151600080516020615a468339815191529190086103008501526104808401516080850151600080516020615a4683398151915291900860808501526104608401516102e0850151600080516020615a468339815191529190086102e08501526104408401516102c0850151600080516020615a468339815191529190086102c08501526104208401516060850151600080516020615a468339815191529190086060850152610400840151610100850151600080516020615a4683398151915291900861010085015261420d8b8b608f8181106141d9576141d9615856565b905060200201358c8c60908181106141f3576141f3615856565b905060200201358660056054811061055c5761055c615856565b9092509050614240848c8c7f182c192e1a301b321c341436098b03260a8d040a0b0e0d121016111a121e132286866151a0565b9092509050614267848c8c73ffff4f3a523c533e0c405038068908081628172a86866151a0565b90925090506142b97f22cbc20a434be99c890d0fbf8c441feaf0dfb2178561a82783b0e74fad5d91eb7f186f16fd4e05464ed8a90fea4fac4fa3a80944bcaf19d9f536f8a67e301e75f386604e6105b4565b909250905061430b7f034336e9ed495c46a1c3ca745bad166bbb675c8ee31092792d0b3d435d3da0a77f120d0016a186defe5e27918247f5fb2c6f578d8ed259080a6a91ed9e503bc79c86604d6105b4565b909250905061435d7f2c4cbb935d4c9990fcaae8d9b0a244ee3f5327a7ca816aa58a58a40c8e00457e7f130d42ccd64a2e29acce747d0e976a363ab4b22f78b8a11b13ca81cf3549943986604c6105b4565b90925090506143af7f05ba13020527a88585e1f01f1d23dd68ee0d64cad4dcb82fce758883bafc1ef27f01696dcfadbe9736c07870ef063e349b30fddbd9ce85ccc7f7b19d1b18ddaf4b86604b6105b4565b90925090506144017f1adae7001a26c1f2f5640d6c60724b413dc22ae2ed96aaaccc659021a3ae1a307f2e6ff83e2f71937c1be92fe36ad1280cb68bcdf07699ee52e4d5540fef5a4bf386604a6105b4565b90925090506144537f1b9a33b5b4544142fd3f804b5f9457c34a4ff7da0852efc4b8d4241954ef859b7f2dc9f73c2504de7a2996b6c20aac9e53a6d6bee0e32ccdd44562c3498bd57a4e8660496105b4565b90925090506144a57f2bf75d9dd944249cd720ee71585980774cb83905b860feb5af3da42ca043b1157f07b4ff44a8e4250bf3ce16c06e8430b585a7a1e85243febe565a7929db37cc9f8660486105b4565b90925090506144f77f2444b554a3ef28ed5743cf5883acf229c2d774bf5076626197ca3093666a7fe57f2f54a38842d7fb7870618b48df360608f1a801e01dfa34b49e5964dc43f989bf8660476105b4565b90925090506145497f25d344a083be7e69cb907b8705b3bab3417d4a23f06d43ca7b287028a88ec5837f2c03f591ec6858cdff27cadaac1a67a1dc9ab7877f898686efe7033e7fd02a168660466105b4565b909250905061459b7f2fd1b96dd6e1ac88d9b5d438bace1ce6e7fe07412454779502af65284fef7e227f2fe224e0009d4ab99131c7c1cc045d0d0d7a50d6757fc12e4cfd720abc066d058660456105b4565b90925090506145ed7f2bf75d9dd944249cd720ee71585980774cb83905b860feb5af3da42ca043b1157f07b4ff44a8e4250bf3ce16c06e8430b585a7a1e85243febe565a7929db37cc9f8660446105b4565b909250905061463f7f1969a5f2f2d86eecccfdee75c39368f79759667bf445eed2f9d2d72c859011bf7f055449f64bace3dadff58d914f1647a98729c5476b53b66f1ff472b9537d183c8660436105b4565b90925090506146917f2fd08ae291ca0c95ada3f562b9f9be896737fd57493c4cefa087979abda4d2d67f04a6506069e2d39e944abcc54e70e881ccdd429ed4c1017fbe1099efeb70465f8660426105b4565b90925090506146e37f0ce55ceb7e62f5d45b387d78d357bc9a8423737e1c47b079a6cd4b64748aca117f2f92a53112cbb38374218eafba1349b77d3647f0423a3b48c8cc622f53c9c3e48660416105b4565b90925090506147357f229f748a69bee4ae7fdc62af12994ec2bd7f47b607216d282cc1f96054dac0787f015e9c5665a513c49920a46fbf7e607586f5b394f7487e045d45e99b7104f4778660406105b4565b90925090506147877f1fbdd7e6e58f01eb5a63b5922c2c6babed9c93d98d28363d97f78cd474cd4f1a7f23a726f04321315f0a8d73d3b596905c3e72eb5a899bd281f18abf3d674d1cfe86603f6105b4565b90925090506147d97f250ebdee646f64bb4af9f5f55fd76ae257408de7f0786f4817032e2581aeb8477f0ec875e3938bc9be9eab457a7d1655c96e5573e0d5c047692c45c3e4eaaa5a4386603e6105b4565b909250905061482b7f2617cd43f1512cc7ec9c2b728bbf4cf18de4b4f30912c811a6bd6d7a90eb35807f0c6dd39b0cb2bde148a8aa1dd84b71f6e47365a1cd726b8428c166e2d6f9e2d886603d6105b4565b909250905061487d7f24f6a4c5ff09d31cca15502ee379d50685bfe70be297201f44d4d967deb8be147f13e3df7f2f1cd670e9f473583298014f5286eb1f2402750ece5f75825484678286603c6105b4565b90925090506148cf7f0102612ad204a0291df816e0cbd8bfb60d03a26493db681420f83add5da28c3e7f0a229f00ff3a8cfce146e4c3ab5447e9d300c83f88e2072c860e05da3b9d60cc86603b6105b4565b90925090506149217f138c357f0a9847d66feca030756c854971c8783fb6a2c2547db480cda037781c7f2c03ebe8c2606106b122920dfe0a42293421ddff6bd205db46eacc956ff2a8a186603a6105b4565b90925090506149737f04a6e8bdc030c8594e55d7fb89399e76dba4d5e9bf60fb6e1fbdb2c0ffed69267f1094abfe954af52dbe746c8cf9aaabad56aa7e4da6a9294a1736fe685fee312f8660396105b4565b90925090506149c57f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008660386105b4565b90925090506149f0848c8c77ffff070015021e041f06250c28102b142e18311c3420372486866151a0565b85516020870151929450909250614a0a91849184916152a8565b60208601528452614a1f60016002868161055c565b85516020870151929450909250614a379184846153b8565b602086018190528186526101c08601516101e090960151959d959c50909a509850929650505050505050565b614a6b61562a565b80517f186282957db913abd99f91db59fe69922e95040603ef44c0bd7aa3adeef8f5ac905280517f17944351223333f260ddc3b4af45191b856689eda9eab5cbcddbbe570ce860d2602091820152810180517f298adc7396bd3865cbf6d6df91bae406694e6d2215baa893bdeadb63052895f49052517f297772d34bc9aa8ae56162486363ffe417b02dc7e8c207fc2cc20203e67a02ad9060015b602002015290565b614b1661562a565b80517f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2905280517f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed602091820152810180517f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec9052517f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d906001614b06565b60008083516006614bc691906158fb565b905060008167ffffffffffffffff811115614be357614be36158cc565b604051908082528060200260200182016040528015614c0c578160200160208202803683370190505b509050614c1761568d565b60008551875114614c2757600080fd5b60005b8751811015614e6057878181518110614c4557614c45615856565b60200260200101516000015184826006614c5f91906158fb565b614c6a9060006158b4565b81518110614c7a57614c7a615856565b602002602001018181525050878181518110614c9857614c98615856565b60200260200101516020015184826006614cb291906158fb565b614cbd9060016158b4565b81518110614ccd57614ccd615856565b602002602001018181525050868181518110614ceb57614ceb615856565b6020908102919091010151515184614d048360066158fb565b614d0f9060026158b4565b81518110614d1f57614d1f615856565b602002602001018181525050868181518110614d3d57614d3d615856565b60209081029190910181015151015184614d588360066158fb565b614d639060036158b4565b81518110614d7357614d73615856565b602002602001018181525050868181518110614d9157614d91615856565b602002602001015160200151600060028110614daf57614daf615856565b602002015184614dc08360066158fb565b614dcb9060046158b4565b81518110614ddb57614ddb615856565b602002602001018181525050868181518110614df957614df9615856565b602002602001015160200151600160028110614e1757614e17615856565b602002015184614e288360066158fb565b614e339060056158b4565b81518110614e4357614e43615856565b602090810291909101015280614e5881615938565b915050614c2a565b50602082602086026020860160085afa905080614e7c57600080fd5b5051151595945050505050565b600080614e946156ab565b6000614eb3604051806040016040528060008152602001600081525090565b8783526020830187905260408084018790528160608560075afa915081614ed957600080fd5b8051602090910151909890975095505050505050565b600080614efa6156c9565b87815260208101879052604081018690526060810185905260808101849052614f22816153fd565b6060810151608090910151909890975095505050505050565b60028282614f4881615938565b935060908110614f5a57614f5a615856565b6020020152828282614f6b81615938565b935060908110614f7d57614f7d615856565b6020020152505050565b60018282614f9481615938565b935060908110614fa657614fa6615856565b6020020152838282614fb781615938565b935060908110614fc957614fc9615856565b6020020152828282614fda81615938565b935060908110614fec57614fec615856565b602002015250505050565b600080838363ffffffff166090811061501257615012615856565b60200201818152505060006150448484602061502e9190615987565b6150399060016159b3565b63ffffffff16615438565b5190506150508161546e565b93525090919050565b600061506361560c565b61506b61568d565b6020808352828101819052604083018190526060830186905260808301859052600080516020615a4683398151915260a08401526000908260c08560055afa9050806150b657600080fd5b5051949350505050565b6000816000036150cf57600080fd5b600080516020615a468339815191526150e7836155e2565b84099392505050565b6000600080516020615a4683398151915282600080516020615a4683398151915285870908949350505050565b6000805b60208110156151965760ff80851690811461517d5760089490941c93600080516020615a4683398151915287826054811061515e5761515e615856565b6020020151600080516020615a46833981519152868909089350615183565b50615196565b5061518f6001826158b4565b9050615121565b5090949350505050565b6000806151ab6156c9565b606081018590526080810184905260005b602081101561528d5760ff80881690811461527457601088901c9760081c60ff168a8a838181106151ef576151ef615856565b905060200201358460006005811061520957615209615856565b60200201528a8a61521b8460016158b4565b81811061522a5761522a615856565b905060200201358460016005811061524457615244615856565b60200201528b816054811061525b5761525b615856565b6020020151604085015261526e846153fd565b5061527a565b5061528d565b506152866002826158b4565b90506151bc565b50606081015160809091015190999098509650505050505050565b60008060006152ca604051806040016040528060008152602001600081525090565b6152d26156e7565b888152602081018890526040808201889052606082018790528260808360065afa9250826152ff57600080fd5b508051602090910151909890975095505050505050565b6000805b60208110156153ad5760ff80851690811461539457601085901c9460081c60ff16600080516020615a4683398151915285600080516020615a468339815191528b846054811061536c5761536c615856565b60200201518b8b8781811061538357615383615856565b90506020020135090894505061539a565b506153ad565b506153a66002826158b4565b905061531a565b509095945050505050565b6000806153f08686866153eb877f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47615970565b6152a8565b9150915094509492505050565b600060406020830160608460075afa90508061541857600080fd5b60406060830160806020850160065afa90508061543457600080fd5b5050565b61544061568d565b6000602082848660026107d05a03fa9050808061545957fe5b5080615467576154676159db565b5092915050565b6000816155c18160008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b6008827fff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0016901c1790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b6010827fffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff000016901c1790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b6020827fffffffff00000000ffffffff00000000ffffffff00000000ffffffff0000000016901c17905060408177ffffffffffffffff0000000000000000ffffffffffffffff16901b6040827fffffffffffffffff0000000000000000ffffffffffffffff000000000000000016901c179050608081901b608082901c179050919050565b90506155db600080516020615a4683398151915282615a0a565b9392505050565b6000615606826156016002600080516020615a46833981519152615970565b615059565b92915050565b6040518060c001604052806006906020820280368337509192915050565b604051806040016040528061563d615705565b815260200161564a615705565b905290565b60405180610a8001604052806054906020820280368337509192915050565b6040518061120001604052806090906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b60405180606001604052806003906020820280368337509192915050565b6040518060a001604052806005906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b60008083601f84011261573557600080fd5b50813567ffffffffffffffff81111561574d57600080fd5b6020830191508360208260051b850101111561576857600080fd5b9250929050565b60008060008060006060868803121561578757600080fd5b853567ffffffffffffffff8082111561579f57600080fd5b6157ab89838a01615723565b909750955060208801359150808211156157c457600080fd5b506157d188828901615723565b96999598509660400135949350505050565b600060208083528351808285015260005b81811015615810578581018301518582016040015282016157f4565b81811115615822576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156158c7576158c7615885565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561593357615933615885565b500290565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361596957615969615885565b5060010190565b60008282101561598257615982615885565b500390565b600063ffffffff808316818516818304811182151516156159aa576159aa615885565b02949350505050565b600063ffffffff8083168185168083038211156159d2576159d2615885565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082615a40577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50069056fe30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a164736f6c634300080f000a", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c80634292dc3e1461003b57806354fd4d5014610063575b600080fd5b61004e61004936600461576f565b6100ac565b60405190151581526020015b60405180910390f35b61009f6040518060400160405280600581526020017f302e312e3500000000000000000000000000000000000000000000000000000081525081565b60405161005a91906157e3565b60006100b661560c565b848460008181106100c9576100c9615856565b9050602002013570ffffffffffffffffffffffffffffffffff16816000600681106100f6576100f6615856565b602002015260888585600181811061011057610110615856565b90506020020135600116901b60888686600081811061013157610131615856565b90506020020135901c61014491906158b4565b60208201528484600281811061015c5761015c615856565b9050602002013570ffffffffffffffffffffffffffffffffff168160026006811061018957610189615856565b60200201526088858560038181106101a3576101a3615856565b90506020020135600116901b6088868660028181106101c4576101c4615856565b90506020020135901c6101d791906158b4565b606080830191909152608084811c908301526fffffffffffffffffffffffffffffffff841660a08301526040805160028082529281019091526000918291829182918291816020015b60408051808201909152600080825260208201528152602001906001900390816102205750506040805160028082526060820190925291925060009190602082015b61026a61562a565b81526020019060019003908161026257905050905061028a8d8d896104fb565b85519399509097509095509350869083906000906102aa576102aa615856565b6020026020010151600001818152505083826000815181106102ce576102ce615856565b6020026020010151602001818152505084826001815181106102f2576102f2615856565b60200260200101516000018181525050828260018151811061031657610316615856565b6020026020010151602001818152505061032e614a63565b8160008151811061034157610341615856565b6020026020010181905250610354614b0e565b8160018151811061036757610367615856565b602002602001018190525061037c8282614bb5565b6103905760009750505050505050506104f2565b8a8a60008181106103a3576103a3615856565b90506020020135826000815181106103bd576103bd615856565b6020908102919091010151528a8a60018181106103dc576103dc615856565b90506020020135826000815181106103f6576103f6615856565b602002602001015160200181815250508a8a600281811061041957610419615856565b905060200201358260018151811061043357610433615856565b6020908102919091010151528a8a600381811061045257610452615856565b905060200201358260018151811061046c5761046c615856565b60200260200101516020018181525050610484614a63565b8160008151811061049757610497615856565b60200260200101819052506104aa614b0e565b816001815181106104bd576104bd615856565b60200260200101819052506104d28282614bb5565b6104e65760009750505050505050506104f2565b60019750505050505050505b95945050505050565b60008060008061050961564f565b61051161566e565b6000806105667f2754b04f3f510d0e86a0d0e811f0fc16f92b722514e1729066d2abf90811d6f27f1816b0f9909a5a979bd34c559e57b4096bee5cce7eb668bc0a9805677f40dc858b845b6020020151614e89565b90925090506105c07f174fa57071f8f6e53fcb31a5ecc33274ec76e4e186eeb0b64255d2f314cd50b27f1c399365e85e4de2761ebcf350da85ff4518cc82f7cef64a477a7a5fd11d4a448b60015b60200201518585614eef565b90925090506106127f259a4d5cd83279b6dc9ca2008b669f82e91f23804e2524c5087a2452d52c33bd7f303abddb7ae0f35e3a6bd39314b347c3c3a433f72833dda1998ad2176258baa38b60026105b4565b90925090506106647f252b158900f31a7c0c00b924e7d3c8d61a60c5e9fd2b83251ba73d1dc0b680f57f29c8c2b3f0d74267bc2b0f9f3568838cdb0eee4719391790d93d0015c00ce5af8b60036105b4565b90925090506106b67f0c25f9f3c38b6a128d7d38c5625a3976d389b5f9f33098bb419968e4d18e150e7f21fb777462c7f4af71940423babc7f882f0c97be9620ef84f6f11974ee0edb8e8b60046105b4565b90925090506107087f2280a0fd7dbf95c450830906ffc607a373d5b9b56b9101138e925ad557eb355a7f0697ab7e9a5377e2759ab6d1283301ccae9c72bad14946a9513ee19be1ec825e8b60056105b4565b6020860152845261073b7f0000000000000000000000000000000000000000000000000000000000000000846000614f3b565b8351602085015161074f9190856002614f87565b600091505b600482116107ed576107db8b8b61076c8560026158fb565b6107779060006158b4565b81811061078657610786615856565b905060200201358c8c85600261079c91906158fb565b6107a79060016158b4565b8181106107b6576107b6615856565b90506020020135858560036107cb91906158fb565b6107d69060056158b4565b614f87565b816107e581615938565b925050610754565b6107f8836014614ff7565b6040850152600091505b600d8211610896576108848b8b61081a8560026158fb565b61082590600a6158b4565b81811061083457610834615856565b905060200201358c8c85600261084a91906158fb565b61085590600b6158b4565b81811061086457610864615856565b905060200201358585600361087991906158fb565b6107d69060016158b4565b8161088e81615938565b925050610802565b6108a183602b614ff7565b60608501526108b1836001614ff7565b6080850152600091505b600982116109205761090e8b8b6108d38560026158fb565b6108de9060266158b4565b8181106108ed576108ed615856565b905060200201358c8c85600261090391906158fb565b6108559060276158b4565b8161091881615938565b9250506108bb565b61092b83601f614ff7565b60a0850152600091505b6003821161099a576109888b8b61094d8560026158fb565b61095890603a6158b4565b81811061096757610967615856565b905060200201358c8c85600261097d91906158fb565b61085590603b6158b4565b8161099281615938565b925050610935565b6109a583600d614ff7565b60c0850152600091505b60468211610a1857610a068b8b6109c78560016158fb565b6109d29060426158b4565b8181106109e1576109e1615856565b90506020020135848460026109f691906158fb565b610a019060016158b4565b614f3b565b81610a1081615938565b9250506109af565b610a2383608f614ff7565b60e0850152600091505b60038211610a9257610a808b8b610a458560026158fb565b610a509060896158b4565b818110610a5f57610a5f615856565b905060200201358c8c856002610a7591906158fb565b61085590608a6158b4565b81610a8a81615938565b925050610a2d565b610a9d83600d614ff7565b61010085015260c0840151600080516020615a46833981519152907f1dba8b5bdd64ef6ce29a9039aca3c0e524395c43b9227b96c75090cc6cc7ec97900961012085015260c0840151600080516020615a46833981519152907f24a1fcd63e9f03b27281db85fe631ec8e5c466f8178a4ee94d4942b7ccd90e1c900961014085015260c0840151600080516020615a46833981519152907f20bab6e5f766b4edf82399e9c5ff0e40d4b6875321a3d8020e18521d8f5c7241900961016085015260c0840151610b70906304000000615059565b610180850152600080516020615a46833981519152610b90600182615970565b610180860151086101a08501819052600080516020615a46833981519152907f30644e66c81e03716be83b486d6feabcc7ddd0fe6cbf5e72d585d142f7829b05096101c0850152600080516020615a46833981519152610bf1600182615970565b60c0860151089150610c0b84600e5b6020020151836150c0565b6101c08501526101a0840151600080516020615a46833981519152907f07baaa5b7af9cf52cd226bc56865f0f99ef8fcd4219060f09f43e9a148b5ab68096101e0850152600080516020615a46833981519152610c887f20bab6e5f766b4edf82399e9c5ff0e40d4b6875321a3d8020e18521d8f5c724182615970565b60c0860151089150610c9b84600f610c00565b6101e08501526101a0840151600080516020615a46833981519152907f1c699f652457365bf2fc4fa2c5c63d6c4349b03cb46d633d7a2655c5da4b900a09610200850152600080516020615a46833981519152610d187f19277f31ecb5bfe8604677099c09556812b0b5c50cceb2b584098183a5a6c5c882615970565b60c0860151089150610d2b846010610c00565b6102008501526101a0840151600080516020615a46833981519152907f205cdbaf03903a5c23e60eef0df90673bc65a25762694c501e3281153b4e588a09610220850152600080516020615a46833981519152610da87f082a7bd4c0a7e4352229d332c27a160da18f0d7c651f3047df41b80345532f6e82615970565b60c0860151089150610dbb846011610c00565b6102208501526101a0840151600080516020615a46833981519152907f27db73b1a831278e143aab90091db38afdea3294c4ba05d1c697a392eb09cc7909610240850152600080516020615a46833981519152610e387f26501ebfe559ea5826f023d3e76e4b66f170cd940408eb5590a4075c80b498d682615970565b60c0860151089150610e4b846012610c00565b6102408501526101a0840151600080516020615a46833981519152907f0204822d629ab653697f028f5fa17d23ac2ba08c60c7112d98ebd28f325f0af609610260850152600080516020615a46833981519152610ec87f0d5eb4c216db2c3262de3f6a2ef71a9be95ff21a7a1a50ed069d6131e7d54e5f82615970565b60c0860151089150610edb846013610c00565b6102608501526101a0840151600080516020615a46833981519152907f2622622a60c0d9327ccf066a0f1fce13c48601b976affd1f41c2a72a9f77da6409610280850152600080516020615a46833981519152610f587f24a1fcd63e9f03b27281db85fe631ec8e5c466f8178a4ee94d4942b7ccd90e1c82615970565b60c0860151089150610f6b846014610c00565b6102808501526102008401516101e0850151600080516020615a468339815191529190089150600080516020615a46833981519152846011602002015183089150600080516020615a46833981519152846012602002015183089150600080516020615a46833981519152846013602002015183086101e085015261103c8b8b604a818110610ffc57610ffc615856565b905060200201358c8c604881811061101657611016615856565b905060200201358d8d604981811061103057611030615856565b905060200201356150f0565b915061107b8b8b604b81811061105457611054615856565b905060200201358c8c604381811061106e5761106e615856565b90506020020135846150f0565b91506110ad8b8b604c81811061109357611093615856565b905060200201358c8c604481811061106e5761106e615856565b91506110df8b8b604d8181106110c5576110c5615856565b905060200201358c8c604581811061106e5761106e615856565b91506111118b8b604e8181106110f7576110f7615856565b905060200201358c8c604681811061106e5761106e615856565b91506111438b8b604f81811061112957611129615856565b905060200201358c8c604781811061106e5761106e615856565b610200850152600080516020615a468339815191528b8b604481811061116b5761116b615856565b905060200201358c8c604381811061118557611185615856565b905060200201350991506111ca8b8b60508181106111a5576111a5615856565b9050602002013583866010605481106111c0576111c0615856565b60200201516150f0565b610200850152600080516020615a468339815191528b8b60468181106111f2576111f2615856565b905060200201358c8c604581811061120c5761120c615856565b9050602002013509915061122c8b8b60518181106111a5576111a5615856565b610200850152600080516020615a468339815191528b8b606181811061125457611254615856565b90506020020135600080516020615a468339815191526112749190615970565b6001089150600080516020615a468339815191528285600e602002015109610220850152600080516020615a468339815191528b8b60648181106112ba576112ba615856565b905060200201358c8c60648181106112d4576112d4615856565b90506020020135099150600080516020615a468339815191528b8b606481811061130057611300615856565b90506020020135600080516020615a468339815191526113209190615970565b83089150600080516020615a4683398151915282856014602002015109610240850152600080516020615a468339815191528b8b606381811061136557611365615856565b90506020020135600080516020615a468339815191526113859190615970565b8c8c606481811061139857611398615856565b90506020020135089150600080516020615a4683398151915284600e6020020151830961026085015260c08401516060850151600080516020615a468339815191529190096102a08501526101e0840151610280850151600080516020615a468339815191529190089150600080516020615a4683398151915261142a83600080516020615a46833981519152615970565b6001086101e08501526080840151600080516020615a46833981519152908c8c604381811061145b5761145b615856565b90506020020135086102c08501526114a68b8b605b81811061147f5761147f615856565b905060200201358560036054811061149957611499615856565b60200201518660166111c0565b9150600080516020615a468339815191528b8b60628181106114ca576114ca615856565b9050602002013583096102e08501526102a08401516102c0850151600080516020615a468339815191529190089150600080516020615a468339815191528b8b606181811061151b5761151b615856565b9050602002013583096102c08501526102a0840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096103008501526080840151600080516020615a46833981519152908c8c604481811061159057611590615856565b90506020020135086103208501526115db8b8b605c8181106115b4576115b4615856565b90506020020135856003605481106115ce576115ce615856565b60200201518660196111c0565b9150600080516020615a46833981519152846017602002015183096102e0850152610300840151610320850151600080516020615a468339815191529190089150600080516020615a46833981519152846016602002015183096102c0850152610300840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096103008501526080840151600080516020615a46833981519152908c8c60458181106116a1576116a1615856565b90506020020135086103208501526116c58b8b605d8181106115b4576115b4615856565b9150600080516020615a46833981519152846017602002015183096102e0850152610300840151610320850151600080516020615a468339815191529190089150600080516020615a46833981519152846016602002015183096102c0850152610300840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096103008501526102c0840151600080516020615a46833981519152906117839082615970565b6102e0860151089150600080516020615a4683398151915284600f602002015183096102c08501526102a0840151600080516020615a46833981519152907f18afdf23e9bd9302673fc1e076a492d4d65bd18ebc4d854ed189139bab313e5290096102a08501526080840151600080516020615a46833981519152908c8c604681811061181257611812615856565b90506020020135086102e085015261185d8b8b605e81811061183657611836615856565b905060200201358560036054811061185057611850615856565b60200201518660176111c0565b9150600080516020615a468339815191528b8b606581811061188157611881615856565b9050602002013583096103008501526102a08401516102e0850151600080516020615a468339815191529190089150600080516020615a468339815191528b8b60648181106118d2576118d2615856565b9050602002013583096102e08501526102a0840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096102a08501526080840151600080516020615a46833981519152908c8c604781811061194757611947615856565b905060200201350861032085015261196b8b8b605f8181106115b4576115b4615856565b9150600080516020615a46833981519152846018602002015183096103008501526102a0840151610320850151600080516020615a468339815191529190089150600080516020615a46833981519152846017602002015183096102e08501526102a0840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096102a08501526080840151600080516020615a46833981519152908c8c6042818110611a3157611a31615856565b9050602002013508610320850152611a558b8b60608181106115b4576115b4615856565b9150600080516020615a46833981519152846018602002015183096103008501526102a0840151610320850151600080516020615a468339815191529190089150600080516020615a46833981519152846017602002015183096102e08501526102a0840151600080516020615a46833981519152907f09226b6e22c6f0ca64ec26aad4c86e715b5f898e5e963f25870e56bbe533e9a2096102a08501526102e0840151600080516020615a4683398151915290611b139082615970565b610300860151089150600080516020615a4683398151915284600f602002015183096102a08501526060840151600080516020615a46833981519152908c8c6068818110611b6357611b63615856565b90506020020135089150600080516020615a46833981519152828c8c6067818110611b9057611b90615856565b90506020020135096102e08501526080840151600080516020615a46833981519152908c8c606a818110611bc657611bc6615856565b90506020020135089150600080516020615a46833981519152828560176020020151096102e0850152600080516020615a468339815191528b8b6052818110611c1157611c11615856565b905060200201358c8c6043818110611c2b57611c2b615856565b90506020020135096103008501526040840151600080516020615a468339815191529060000960408501819052610300850151600080516020615a468339815191529108610300850152600080516020615a468339815191528b8b6053818110611c9757611c97615856565b9050602002013585600260548110611cb157611cb1615856565b602002015108610320850152600080516020615a468339815191528b8b606a818110611cdf57611cdf615856565b90506020020135600080516020615a46833981519152611cff9190615970565b8c8c6068818110611d1257611d12615856565b9050602002013508610340850152600080516020615a468339815191528b8b6066818110611d4257611d42615856565b90506020020135600080516020615a46833981519152611d629190615970565b6001089150600080516020615a468339815191528285600e602002015109610360850152600080516020615a468339815191528b8b6066818110611da857611da8615856565b905060200201358c8c6066818110611dc257611dc2615856565b90506020020135099150600080516020615a468339815191528b8b6066818110611dee57611dee615856565b90506020020135600080516020615a46833981519152611e0e9190615970565b83089150600080516020615a46833981519152828560146020020151096103808501526060840151610300850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c6066818110611e7357611e73615856565b90506020020135096103008501526080840151610320850151600080516020615a468339815191529190086103208501819052610300850151600080516020615a468339815191529190099150600080516020615a46833981519152611ee783600080516020615a46833981519152615970565b6102e0860151089150600080516020615a4683398151915284600f602002015183096102e08501526103408401516101c0850151600080516020615a46833981519152919009610300850152600080516020615a468339815191528b8b6069818110611f5557611f55615856565b90506020020135600080516020615a46833981519152611f759190615970565b8c8c6068818110611f8857611f88615856565b90506020020135089150600080516020615a468339815191528285601a6020020151099150600080516020615a4683398151915284600f602002015183096103408501526060840151600080516020615a46833981519152908c8c606d818110611ff457611ff4615856565b90506020020135089150600080516020615a46833981519152828c8c606c81811061202157612021615856565b90506020020135096103a08501526080840151600080516020615a46833981519152908c8c606f81811061205757612057615856565b90506020020135089150600080516020615a468339815191528285601d6020020151096103a08501526120ca8b8b605281811061209657612096615856565b905060200201358c8c60448181106120b0576120b0615856565b90506020020135866002605481106111c0576111c0615856565b6103c0850152600080516020615a468339815191528b8b606f8181106120f2576120f2615856565b90506020020135600080516020615a468339815191526121129190615970565b8c8c606d81811061212557612125615856565b90506020020135086103e0850152600080516020615a468339815191528b8b606b81811061215557612155615856565b90506020020135600080516020615a468339815191526121759190615970565b6001089150600080516020615a468339815191528285600e602002015109610400850152600080516020615a468339815191528b8b606b8181106121bb576121bb615856565b905060200201358c8c606b8181106121d5576121d5615856565b90506020020135099150600080516020615a468339815191528b8b606b81811061220157612201615856565b90506020020135600080516020615a468339815191526122219190615970565b83089150600080516020615a468339815191528285601460200201510961042085015260608401516103c0850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c606b81811061228657612286615856565b90506020020135099150600080516020615a46833981519152846019602002015183099150600080516020615a468339815191526122d283600080516020615a46833981519152615970565b6103a0860151089150600080516020615a4683398151915284600f602002015183096103a08501526103e08401516101c0850151600080516020615a468339815191529190096103c0850152600080516020615a468339815191528b8b606e81811061234057612340615856565b90506020020135600080516020615a468339815191526123609190615970565b8c8c606d81811061237357612373615856565b90506020020135089150600080516020615a468339815191528285601f6020020151099150600080516020615a4683398151915284600f602002015183096103e08501526060840151600080516020615a46833981519152908c8c60728181106123df576123df615856565b90506020020135089150600080516020615a46833981519152828c8c607181811061240c5761240c615856565b90506020020135096104408501526080840151600080516020615a46833981519152908c8c607481811061244257612442615856565b90506020020135089150600080516020615a468339815191528285602260200201510961044085015261249b8b8b605281811061248157612481615856565b905060200201358c8c60458181106120b0576120b0615856565b610460850152600080516020615a468339815191528b8b60748181106124c3576124c3615856565b90506020020135600080516020615a468339815191526124e39190615970565b8c8c60728181106124f6576124f6615856565b9050602002013508610480850152600080516020615a468339815191528b8b607081811061252657612526615856565b90506020020135600080516020615a468339815191526125469190615970565b6001089150600080516020615a468339815191528285600e6020020151096104a0850152600080516020615a468339815191528b8b607081811061258c5761258c615856565b905060200201358c8c60708181106125a6576125a6615856565b90506020020135099150600080516020615a468339815191528b8b60708181106125d2576125d2615856565b90506020020135600080516020615a468339815191526125f29190615970565b83089150600080516020615a46833981519152828560146020020151096104c08501526060840151610460850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c607081811061265757612657615856565b90506020020135099150600080516020615a46833981519152846019602002015183099150600080516020615a468339815191526126a383600080516020615a46833981519152615970565b610440860151089150600080516020615a4683398151915284600f602002015183096104408501526104808401516101c0850151600080516020615a46833981519152919009610460850152600080516020615a468339815191528b8b607381811061271157612711615856565b90506020020135600080516020615a468339815191526127319190615970565b8c8c607281811061274457612744615856565b90506020020135089150600080516020615a46833981519152828560246020020151099150600080516020615a4683398151915284600f602002015183096104808501526060840151600080516020615a46833981519152908c8c60778181106127b0576127b0615856565b90506020020135089150600080516020615a46833981519152828c8c60768181106127dd576127dd615856565b90506020020135096104e08501526080840151600080516020615a46833981519152908c8c607981811061281357612813615856565b90506020020135089150600080516020615a46833981519152828560276020020151096104e085015261286c8b8b605281811061285257612852615856565b905060200201358c8c60468181106120b0576120b0615856565b610500850152600080516020615a468339815191528b8b607981811061289457612894615856565b90506020020135600080516020615a468339815191526128b49190615970565b8c8c60778181106128c7576128c7615856565b9050602002013508610520850152600080516020615a468339815191528b8b60758181106128f7576128f7615856565b90506020020135600080516020615a468339815191526129179190615970565b6001089150600080516020615a468339815191528285600e602002015109610540850152600080516020615a468339815191528b8b607581811061295d5761295d615856565b905060200201358c8c607581811061297757612977615856565b90506020020135099150600080516020615a468339815191528b8b60758181106129a3576129a3615856565b90506020020135600080516020615a468339815191526129c39190615970565b83089150600080516020615a46833981519152828560146020020151096105608501526060840151610500850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c6075818110612a2857612a28615856565b90506020020135099150600080516020615a46833981519152846019602002015183099150600080516020615a46833981519152612a7483600080516020615a46833981519152615970565b6104e0860151089150600080516020615a4683398151915284600f602002015183096103208501526105208401516101c0850151600080516020615a468339815191529190096104e0850152600080516020615a468339815191528b8b6078818110612ae257612ae2615856565b90506020020135600080516020615a46833981519152612b029190615970565b8c8c6077818110612b1557612b15615856565b90506020020135089150600080516020615a46833981519152828560296020020151099150600080516020615a4683398151915284600f602002015183096105008501526060840151600080516020615a46833981519152908c8c607c818110612b8157612b81615856565b90506020020135089150600080516020615a46833981519152828c8c607b818110612bae57612bae615856565b90506020020135096105208501526080840151600080516020615a46833981519152908c8c607e818110612be457612be4615856565b90506020020135089150600080516020615a4683398151915282856029602002015109610520850152612c3d8b8b6054818110612c2357612c23615856565b905060200201358c8c60438181106120b0576120b0615856565b610580850152600080516020615a468339815191528b8b6055818110612c6557612c65615856565b9050602002013585600260548110612c7f57612c7f615856565b6020020151086105a0850152600080516020615a468339815191528b8b607e818110612cad57612cad615856565b90506020020135600080516020615a46833981519152612ccd9190615970565b8c8c607c818110612ce057612ce0615856565b90506020020135086105c0850152600080516020615a468339815191528b8b607a818110612d1057612d10615856565b90506020020135600080516020615a46833981519152612d309190615970565b6001089150600080516020615a468339815191528285600e6020020151096105e0850152600080516020615a468339815191528b8b607a818110612d7657612d76615856565b905060200201358c8c607a818110612d9057612d90615856565b90506020020135099150600080516020615a468339815191528b8b607a818110612dbc57612dbc615856565b90506020020135600080516020615a46833981519152612ddc9190615970565b83089150600080516020615a46833981519152828560146020020151096106008501526060840151610580850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c607a818110612e4157612e41615856565b905060200201350961058085015260808401516105a0850151600080516020615a468339815191529190089150600080516020615a468339815191528285602c6020020151099150600080516020615a46833981519152612eb083600080516020615a46833981519152615970565b610520860151089150600080516020615a4683398151915284600f602002015183096105208501526105c08401516101c0850151600080516020615a46833981519152919009610580850152600080516020615a468339815191528b8b607d818110612f1e57612f1e615856565b90506020020135600080516020615a46833981519152612f3e9190615970565b8c8c607c818110612f5157612f51615856565b90506020020135089150600080516020615a468339815191528285602e6020020151099150600080516020615a4683398151915284600f602002015183096105a08501526060840151600080516020615a46833981519152908c8c6081818110612fbd57612fbd615856565b90506020020135089150600080516020615a46833981519152828c8c6080818110612fea57612fea615856565b90506020020135096105c08501526080840151600080516020615a46833981519152908c8c608381811061302057613020615856565b90506020020135089150600080516020615a468339815191528285602e6020020151096105c085015261305f8b8b6056818110612c2357612c23615856565b610620850152600080516020615a468339815191528b8b605781811061308757613087615856565b90506020020135856002605481106130a1576130a1615856565b602002015108610640850152600080516020615a468339815191528b8b60838181106130cf576130cf615856565b90506020020135600080516020615a468339815191526130ef9190615970565b8c8c608181811061310257613102615856565b9050602002013508610660850152600080516020615a468339815191528b8b607f81811061313257613132615856565b90506020020135600080516020615a468339815191526131529190615970565b6001089150600080516020615a468339815191528285600e602002015109610680850152600080516020615a468339815191528b8b607f81811061319857613198615856565b905060200201358c8c607f8181106131b2576131b2615856565b90506020020135099150600080516020615a468339815191528b8b607f8181106131de576131de615856565b90506020020135600080516020615a468339815191526131fe9190615970565b83089150600080516020615a46833981519152828560146020020151096106a08501526060840151610620850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c607f81811061326357613263615856565b90506020020135096106208501526080840151610640850151600080516020615a468339815191529190089150600080516020615a46833981519152828560316020020151099150600080516020615a468339815191526132d283600080516020615a46833981519152615970565b6105c0860151089150600080516020615a4683398151915284600f602002015183096105c08501526106608401516101c0850151600080516020615a46833981519152919009610620850152600080516020615a468339815191528b8b608281811061334057613340615856565b90506020020135600080516020615a468339815191526133609190615970565b8c8c608181811061337357613373615856565b90506020020135089150600080516020615a46833981519152828560336020020151099150600080516020615a4683398151915284600f602002015183096106408501526060840151600080516020615a46833981519152908c8c60868181106133df576133df615856565b90506020020135089150600080516020615a46833981519152828c8c608581811061340c5761340c615856565b90506020020135096106608501526080840151600080516020615a46833981519152908c8c608881811061344257613442615856565b90506020020135089150600080516020615a46833981519152828560336020020151096106608501526134818b8b6058818110612c2357612c23615856565b6106c0850152600080516020615a468339815191528b8b60598181106134a9576134a9615856565b90506020020135856002605481106134c3576134c3615856565b6020020151086040850152600080516020615a468339815191528b8b60888181106134f0576134f0615856565b90506020020135600080516020615a468339815191526135109190615970565b8c8c608681811061352357613523615856565b90506020020135086106e0850152600080516020615a468339815191528b8b608481811061355357613553615856565b90506020020135600080516020615a468339815191526135739190615970565b6001089150600080516020615a468339815191528285600e602002015109610700850152600080516020615a468339815191528b8b60848181106135b9576135b9615856565b905060200201358c8c60848181106135d3576135d3615856565b90506020020135099150600080516020615a468339815191528b8b60848181106135ff576135ff615856565b90506020020135600080516020615a4683398151915261361f9190615970565b83089150600080516020615a468339815191528285601460200201510961028085015260608401516106c0850151600080516020615a468339815191529190089150600080516020615a46833981519152828c8c608481811061368457613684615856565b9050602002013509606085015260808401516040850151600080516020615a468339815191529190089150600080516020615a46833981519152828560036020020151099150600080516020615a468339815191526136f183600080516020615a46833981519152615970565b610660860151089150600080516020615a4683398151915284600f6020020151830960408501526106e08401516101c0850151600080516020615a468339815191529190096060850152600080516020615a468339815191528b8b608781811061375d5761375d615856565b90506020020135600080516020615a4683398151915261377d9190615970565b8c8c608681811061379057613790615856565b90506020020135089150600080516020615a46833981519152828560376020020151099150600080516020615a4683398151915284600f60200201518309608085015260a08401516137e69060008660106111c0565b915061381b8480600560200201517f35342d2c29302f2827192b2a24232226251f1e1d21201a18171c1b15161312118561511d565b915061383984806005602002015168ff040302143832312e8561511d565b915061384c8285600d60200201516150c0565b6040850152610100840151600080516020615a4683398151915290800960608501819052610100850151600080516020615a46833981519152910960808501526138d68b8b608f8181106138a2576138a2615856565b905060200201358c8c60908181106138bc576138bc615856565b905060200201358660046054811061055c5761055c615856565b90925090506138ef848c8c65ffff088b038d86866151a0565b909250905061393282828d8d608981811061390c5761390c615856565b905060200201358e8e608a81811061392657613926615856565b905060200201356152a8565b6101e08601526101c08501526101608401516080850151600080516020615a4683398151915291900960a085015260e08401516080850151600080516020615a46833981519152919009610160850181905260e0850151600080516020615a4683398151915291096101a0850181905260e0850151600080516020615a468339815191529109610200850181905260e0850151600080516020615a468339815191529109610220850181905260e0850151600080516020615a468339815191529109610240850181905260e0850151600080516020615a468339815191529109610260850152600080516020615a468339815191528b8b6087818110613a3a57613a3a615856565b9050602002013585601360548110613a5457613a54615856565b6020020151099150613a75848c8c6bffff0b6e0d731078117d128286615316565b9150613ab28b8b6069818110613a8d57613a8d615856565b9050602002013585600460548110613aa757613aa7615856565b6020020151846150f0565b6102808501526101408401516060850151600080516020615a46833981519152919009610140850152613b188b8b6063818110613af157613af1615856565b9050602002013585600360548110613b0b57613b0b615856565b60200201518660146111c0565b610280850152610120840151610100850151600080516020615a4683398151915291900961012085015260e0840151610100850151600080516020615a468339815191529190096102a0850152600091505b6008821015613c1957600080516020615a4683398151915284613b8e8460006158fb565b613b999060076158b4565b60548110613ba957613ba9615856565b602002015185613bba8560016158fb565b613bc59060156158b4565b60548110613bd557613bd5615856565b60200201510984613be78460016158fb565b613bf29060166158b4565b60548110613c0257613c02615856565b602002015281613c1181615938565b925050613b6a565b600080516020615a468339815191528b8b6085818110613c3b57613c3b615856565b9050602002013585601d60548110613c5557613c55615856565b6020020151099150613c7e848c8c73ffff0848156216651767186c19711a761b7b1c8086615316565b9150600080516020615a46833981519152828560146020020151086102808501526102a08401516060850151600080516020615a46833981519152919008606085015260e0840151600080516020615a468339815191529080096102a0850181905260e0850151600080516020615a4683398151915291096103c0850152600091505b6032821015613db057600080516020615a4683398151915284613d258460006158fb565b613d309060076158b4565b60548110613d4057613d40615856565b602002015185613d518560016158fb565b613d5c90601e6158b4565b60548110613d6c57613d6c615856565b60200201510984613d7e8460016158fb565b613d8990601f6158b4565b60548110613d9957613d99615856565b602002015281613da881615938565b925050613d01565b600080516020615a468339815191528b8b605a818110613dd257613dd2615856565b9050602002013585605060548110613dec57613dec615856565b602002015109610a208501526101808401516109e0850151600080516020615a46833981519152919009610a408501819052610180850151600080516020615a468339815191529109610a608501819052610180850151600080516020615a4683398151915291096101808501526109e08401516040850151613e7291908660516111c0565b9150613ea1848c8c7f3f50405141524253435444554556465747584859495b4a5c4b5d4c5e4d5f4e6086615316565b9150613ed0848c8c7f2f7a307c317e327f338134833584368637883849394a3a4b3b4c3c4d3d4e3e4f86615316565b9150613eff848c8c7f1f4620472161226423662468256a266b276d286f29702a722b742c752d772e7986615316565b9150613f16848c8c67ffff074315441e4586615316565b9150600080516020615a468339815191528b8b6042818110613f3a57613f3a615856565b9050602002013583089150600080516020615a468339815191528285601460200201510860408501526106c0840151610260850151600080516020615a468339815191529190086102608501526106a08401516103a0850151600080516020615a46833981519152919008610280850152610660840151610240850151600080516020615a46833981519152919008610240850152610640840151610380850151600080516020615a46833981519152919008610380850152610600840151610220850151600080516020615a468339815191529190086102208501526105e0840151610360850151600080516020615a468339815191529190086103608501526105a0840151610200850151600080516020615a46833981519152919008610200850152610580840151610340850151600080516020615a468339815191529190086103408501526105408401516101a0850151600080516020615a468339815191529190086101a0850152610520840151610320850151600080516020615a468339815191529190086103208501526104e0840151610160850151600080516020615a468339815191529190086101608501526104c0840151610300850151600080516020615a468339815191529190086103008501526104808401516080850151600080516020615a4683398151915291900860808501526104608401516102e0850151600080516020615a468339815191529190086102e08501526104408401516102c0850151600080516020615a468339815191529190086102c08501526104208401516060850151600080516020615a468339815191529190086060850152610400840151610100850151600080516020615a4683398151915291900861010085015261420d8b8b608f8181106141d9576141d9615856565b905060200201358c8c60908181106141f3576141f3615856565b905060200201358660056054811061055c5761055c615856565b9092509050614240848c8c7f182c192e1a301b321c341436098b03260a8d040a0b0e0d121016111a121e132286866151a0565b9092509050614267848c8c73ffff4f3a523c533e0c405038068908081628172a86866151a0565b90925090506142b97f22cbc20a434be99c890d0fbf8c441feaf0dfb2178561a82783b0e74fad5d91eb7f186f16fd4e05464ed8a90fea4fac4fa3a80944bcaf19d9f536f8a67e301e75f386604e6105b4565b909250905061430b7f034336e9ed495c46a1c3ca745bad166bbb675c8ee31092792d0b3d435d3da0a77f120d0016a186defe5e27918247f5fb2c6f578d8ed259080a6a91ed9e503bc79c86604d6105b4565b909250905061435d7f2c4cbb935d4c9990fcaae8d9b0a244ee3f5327a7ca816aa58a58a40c8e00457e7f130d42ccd64a2e29acce747d0e976a363ab4b22f78b8a11b13ca81cf3549943986604c6105b4565b90925090506143af7f05ba13020527a88585e1f01f1d23dd68ee0d64cad4dcb82fce758883bafc1ef27f01696dcfadbe9736c07870ef063e349b30fddbd9ce85ccc7f7b19d1b18ddaf4b86604b6105b4565b90925090506144017f1adae7001a26c1f2f5640d6c60724b413dc22ae2ed96aaaccc659021a3ae1a307f2e6ff83e2f71937c1be92fe36ad1280cb68bcdf07699ee52e4d5540fef5a4bf386604a6105b4565b90925090506144537f1b9a33b5b4544142fd3f804b5f9457c34a4ff7da0852efc4b8d4241954ef859b7f2dc9f73c2504de7a2996b6c20aac9e53a6d6bee0e32ccdd44562c3498bd57a4e8660496105b4565b90925090506144a57f2bf75d9dd944249cd720ee71585980774cb83905b860feb5af3da42ca043b1157f07b4ff44a8e4250bf3ce16c06e8430b585a7a1e85243febe565a7929db37cc9f8660486105b4565b90925090506144f77f2444b554a3ef28ed5743cf5883acf229c2d774bf5076626197ca3093666a7fe57f2f54a38842d7fb7870618b48df360608f1a801e01dfa34b49e5964dc43f989bf8660476105b4565b90925090506145497f25d344a083be7e69cb907b8705b3bab3417d4a23f06d43ca7b287028a88ec5837f2c03f591ec6858cdff27cadaac1a67a1dc9ab7877f898686efe7033e7fd02a168660466105b4565b909250905061459b7f2fd1b96dd6e1ac88d9b5d438bace1ce6e7fe07412454779502af65284fef7e227f2fe224e0009d4ab99131c7c1cc045d0d0d7a50d6757fc12e4cfd720abc066d058660456105b4565b90925090506145ed7f2bf75d9dd944249cd720ee71585980774cb83905b860feb5af3da42ca043b1157f07b4ff44a8e4250bf3ce16c06e8430b585a7a1e85243febe565a7929db37cc9f8660446105b4565b909250905061463f7f1969a5f2f2d86eecccfdee75c39368f79759667bf445eed2f9d2d72c859011bf7f055449f64bace3dadff58d914f1647a98729c5476b53b66f1ff472b9537d183c8660436105b4565b90925090506146917f2fd08ae291ca0c95ada3f562b9f9be896737fd57493c4cefa087979abda4d2d67f04a6506069e2d39e944abcc54e70e881ccdd429ed4c1017fbe1099efeb70465f8660426105b4565b90925090506146e37f0ce55ceb7e62f5d45b387d78d357bc9a8423737e1c47b079a6cd4b64748aca117f2f92a53112cbb38374218eafba1349b77d3647f0423a3b48c8cc622f53c9c3e48660416105b4565b90925090506147357f229f748a69bee4ae7fdc62af12994ec2bd7f47b607216d282cc1f96054dac0787f015e9c5665a513c49920a46fbf7e607586f5b394f7487e045d45e99b7104f4778660406105b4565b90925090506147877f1fbdd7e6e58f01eb5a63b5922c2c6babed9c93d98d28363d97f78cd474cd4f1a7f23a726f04321315f0a8d73d3b596905c3e72eb5a899bd281f18abf3d674d1cfe86603f6105b4565b90925090506147d97f250ebdee646f64bb4af9f5f55fd76ae257408de7f0786f4817032e2581aeb8477f0ec875e3938bc9be9eab457a7d1655c96e5573e0d5c047692c45c3e4eaaa5a4386603e6105b4565b909250905061482b7f2617cd43f1512cc7ec9c2b728bbf4cf18de4b4f30912c811a6bd6d7a90eb35807f0c6dd39b0cb2bde148a8aa1dd84b71f6e47365a1cd726b8428c166e2d6f9e2d886603d6105b4565b909250905061487d7f24f6a4c5ff09d31cca15502ee379d50685bfe70be297201f44d4d967deb8be147f13e3df7f2f1cd670e9f473583298014f5286eb1f2402750ece5f75825484678286603c6105b4565b90925090506148cf7f0102612ad204a0291df816e0cbd8bfb60d03a26493db681420f83add5da28c3e7f0a229f00ff3a8cfce146e4c3ab5447e9d300c83f88e2072c860e05da3b9d60cc86603b6105b4565b90925090506149217f138c357f0a9847d66feca030756c854971c8783fb6a2c2547db480cda037781c7f2c03ebe8c2606106b122920dfe0a42293421ddff6bd205db46eacc956ff2a8a186603a6105b4565b90925090506149737f04a6e8bdc030c8594e55d7fb89399e76dba4d5e9bf60fb6e1fbdb2c0ffed69267f1094abfe954af52dbe746c8cf9aaabad56aa7e4da6a9294a1736fe685fee312f8660396105b4565b90925090506149c57f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008660386105b4565b90925090506149f0848c8c77ffff070015021e041f06250c28102b142e18311c3420372486866151a0565b85516020870151929450909250614a0a91849184916152a8565b60208601528452614a1f60016002868161055c565b85516020870151929450909250614a379184846153b8565b602086018190528186526101c08601516101e090960151959d959c50909a509850929650505050505050565b614a6b61562a565b80517f186282957db913abd99f91db59fe69922e95040603ef44c0bd7aa3adeef8f5ac905280517f17944351223333f260ddc3b4af45191b856689eda9eab5cbcddbbe570ce860d2602091820152810180517f298adc7396bd3865cbf6d6df91bae406694e6d2215baa893bdeadb63052895f49052517f297772d34bc9aa8ae56162486363ffe417b02dc7e8c207fc2cc20203e67a02ad9060015b602002015290565b614b1661562a565b80517f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c2905280517f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed602091820152810180517f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec9052517f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d906001614b06565b60008083516006614bc691906158fb565b905060008167ffffffffffffffff811115614be357614be36158cc565b604051908082528060200260200182016040528015614c0c578160200160208202803683370190505b509050614c1761568d565b60008551875114614c2757600080fd5b60005b8751811015614e6057878181518110614c4557614c45615856565b60200260200101516000015184826006614c5f91906158fb565b614c6a9060006158b4565b81518110614c7a57614c7a615856565b602002602001018181525050878181518110614c9857614c98615856565b60200260200101516020015184826006614cb291906158fb565b614cbd9060016158b4565b81518110614ccd57614ccd615856565b602002602001018181525050868181518110614ceb57614ceb615856565b6020908102919091010151515184614d048360066158fb565b614d0f9060026158b4565b81518110614d1f57614d1f615856565b602002602001018181525050868181518110614d3d57614d3d615856565b60209081029190910181015151015184614d588360066158fb565b614d639060036158b4565b81518110614d7357614d73615856565b602002602001018181525050868181518110614d9157614d91615856565b602002602001015160200151600060028110614daf57614daf615856565b602002015184614dc08360066158fb565b614dcb9060046158b4565b81518110614ddb57614ddb615856565b602002602001018181525050868181518110614df957614df9615856565b602002602001015160200151600160028110614e1757614e17615856565b602002015184614e288360066158fb565b614e339060056158b4565b81518110614e4357614e43615856565b602090810291909101015280614e5881615938565b915050614c2a565b50602082602086026020860160085afa905080614e7c57600080fd5b5051151595945050505050565b600080614e946156ab565b6000614eb3604051806040016040528060008152602001600081525090565b8783526020830187905260408084018790528160608560075afa915081614ed957600080fd5b8051602090910151909890975095505050505050565b600080614efa6156c9565b87815260208101879052604081018690526060810185905260808101849052614f22816153fd565b6060810151608090910151909890975095505050505050565b60028282614f4881615938565b935060908110614f5a57614f5a615856565b6020020152828282614f6b81615938565b935060908110614f7d57614f7d615856565b6020020152505050565b60018282614f9481615938565b935060908110614fa657614fa6615856565b6020020152838282614fb781615938565b935060908110614fc957614fc9615856565b6020020152828282614fda81615938565b935060908110614fec57614fec615856565b602002015250505050565b600080838363ffffffff166090811061501257615012615856565b60200201818152505060006150448484602061502e9190615987565b6150399060016159b3565b63ffffffff16615438565b5190506150508161546e565b93525090919050565b600061506361560c565b61506b61568d565b6020808352828101819052604083018190526060830186905260808301859052600080516020615a4683398151915260a08401526000908260c08560055afa9050806150b657600080fd5b5051949350505050565b6000816000036150cf57600080fd5b600080516020615a468339815191526150e7836155e2565b84099392505050565b6000600080516020615a4683398151915282600080516020615a4683398151915285870908949350505050565b6000805b60208110156151965760ff80851690811461517d5760089490941c93600080516020615a4683398151915287826054811061515e5761515e615856565b6020020151600080516020615a46833981519152868909089350615183565b50615196565b5061518f6001826158b4565b9050615121565b5090949350505050565b6000806151ab6156c9565b606081018590526080810184905260005b602081101561528d5760ff80881690811461527457601088901c9760081c60ff168a8a838181106151ef576151ef615856565b905060200201358460006005811061520957615209615856565b60200201528a8a61521b8460016158b4565b81811061522a5761522a615856565b905060200201358460016005811061524457615244615856565b60200201528b816054811061525b5761525b615856565b6020020151604085015261526e846153fd565b5061527a565b5061528d565b506152866002826158b4565b90506151bc565b50606081015160809091015190999098509650505050505050565b60008060006152ca604051806040016040528060008152602001600081525090565b6152d26156e7565b888152602081018890526040808201889052606082018790528260808360065afa9250826152ff57600080fd5b508051602090910151909890975095505050505050565b6000805b60208110156153ad5760ff80851690811461539457601085901c9460081c60ff16600080516020615a4683398151915285600080516020615a468339815191528b846054811061536c5761536c615856565b60200201518b8b8781811061538357615383615856565b90506020020135090894505061539a565b506153ad565b506153a66002826158b4565b905061531a565b509095945050505050565b6000806153f08686866153eb877f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47615970565b6152a8565b9150915094509492505050565b600060406020830160608460075afa90508061541857600080fd5b60406060830160806020850160065afa90508061543457600080fd5b5050565b61544061568d565b6000602082848660026107d05a03fa9050808061545957fe5b5080615467576154676159db565b5092915050565b6000816155c18160008190506008817eff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff16901b6008827fff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff0016901c1790506010817dffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff16901b6010827fffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff000016901c1790506020817bffffffff00000000ffffffff00000000ffffffff00000000ffffffff16901b6020827fffffffff00000000ffffffff00000000ffffffff00000000ffffffff0000000016901c17905060408177ffffffffffffffff0000000000000000ffffffffffffffff16901b6040827fffffffffffffffff0000000000000000ffffffffffffffff000000000000000016901c179050608081901b608082901c179050919050565b90506155db600080516020615a4683398151915282615a0a565b9392505050565b6000615606826156016002600080516020615a46833981519152615970565b615059565b92915050565b6040518060c001604052806006906020820280368337509192915050565b604051806040016040528061563d615705565b815260200161564a615705565b905290565b60405180610a8001604052806054906020820280368337509192915050565b6040518061120001604052806090906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b60405180606001604052806003906020820280368337509192915050565b6040518060a001604052806005906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b60008083601f84011261573557600080fd5b50813567ffffffffffffffff81111561574d57600080fd5b6020830191508360208260051b850101111561576857600080fd5b9250929050565b60008060008060006060868803121561578757600080fd5b853567ffffffffffffffff8082111561579f57600080fd5b6157ab89838a01615723565b909750955060208801359150808211156157c457600080fd5b506157d188828901615723565b96999598509660400135949350505050565b600060208083528351808285015260005b81811015615810578581018301518582016040015282016157f4565b81811115615822576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156158c7576158c7615885565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561593357615933615885565b500290565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361596957615969615885565b5060010190565b60008282101561598257615982615885565b500390565b600063ffffffff808316818516818304811182151516156159aa576159aa615885565b02949350505050565b600063ffffffff8083168185168083038211156159d2576159d2615885565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082615a40577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50069056fe30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001a164736f6c634300080f000a", "devdoc": { "version": 1, "kind": "dev" }, "userdoc": { "version": 1, - "kind": "user" + "kind": "user", + "methods": { + "version()": { + "notice": "Semantic version." + } + } } -} +} \ No newline at end of file diff --git a/packages/contracts/deployments/mainnet/solcInputs/1cc21f973aa4cfc73d832518987f54f8.json b/packages/contracts/deployments/mainnet/solcInputs/1cc21f973aa4cfc73d832518987f54f8.json new file mode 100644 index 0000000000..2cc08a7522 --- /dev/null +++ b/packages/contracts/deployments/mainnet/solcInputs/1cc21f973aa4cfc73d832518987f54f8.json @@ -0,0 +1,132 @@ +{ + "language": "Solidity", + "sources": { + "contracts/governance/GovernanceToken.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.15;\n\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\";\nimport \"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\";\n\nimport { KromaMintableERC20 } from \"../universal/KromaMintableERC20.sol\";\n\n/**\n * @custom:proxied\n * @title GovernanceToken\n * @notice The KRO token used in governance, supporting voting and delegation. Implements\n * EIP 2612 allowing signed approvals. `mint` function is only allowed to the owner or\n * `Bridge`, and the total supply amount is minted at once (TGE). `Bridge` has the\n * permission to `mint` and `burn`, for the purpose of bridging KRO to the remote chain.\n */\ncontract GovernanceToken is KromaMintableERC20, ERC20Votes, Ownable2StepUpgradeable {\n /**\n * @notice Constructs the GovernanceToken contract.\n *\n * @param _bridge Address of the StandardBridge contract on this network.\n * @param _remoteToken Address of the corresponding token on the remote chain.\n */\n constructor(\n address _bridge,\n address _remoteToken\n ) KromaMintableERC20(_bridge, _remoteToken, \"\", \"\") ERC20Permit(\"Kroma\") {\n _disableInitializers();\n }\n\n /**\n * @notice Initializer.\n *\n * @param _owner The owner of this contract.\n */\n function initialize(address _owner) public initializer {\n __Ownable2Step_init();\n transferOwnership(_owner);\n }\n\n /**\n * @notice Allows StandardBridge or the owner to mint tokens.\n *\n * @param _to Address to mint tokens to.\n * @param _amount Amount of tokens to mint.\n */\n function mint(address _to, uint256 _amount) external override {\n require(\n msg.sender == BRIDGE || msg.sender == owner(),\n \"GovernanceToken: only bridge or owner can mint\"\n );\n\n _mint(_to, _amount);\n }\n\n /**\n * @inheritdoc KromaMintableERC20\n */\n function burn(address _from, uint256 _amount) external override onlyBridge {\n _burn(_from, _amount);\n }\n\n /**\n * @inheritdoc ERC20\n */\n function name() public pure override returns (string memory) {\n return \"Kroma\";\n }\n\n /**\n * @inheritdoc ERC20\n */\n function symbol() public pure override returns (string memory) {\n return \"KRO\";\n }\n\n /**\n * @notice Callback called after a token transfer.\n *\n * @param from The account sending tokens.\n * @param to The account receiving tokens.\n * @param amount The amount of tokens being transferred.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20, ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n\n /**\n * @notice Internal mint function.\n *\n * @param account The account receiving minted tokens.\n * @param amount The amount of tokens to mint.\n */\n function _mint(address account, uint256 amount) internal override(ERC20, ERC20Votes) {\n super._mint(account, amount);\n emit Mint(account, amount);\n }\n\n /**\n * @notice Internal burn function.\n *\n * @param account The account that tokens will be burned from.\n * @param amount The amount of tokens that will be burned.\n */\n function _burn(address account, uint256 amount) internal override(ERC20, ERC20Votes) {\n super._burn(account, amount);\n emit Burn(account, amount);\n }\n\n /**\n * @notice Override function.\n */\n function _msgSender() internal view override(Context, ContextUpgradeable) returns (address) {\n return super._msgSender();\n }\n\n /**\n * @notice Override function.\n */\n function _msgData()\n internal\n view\n override(Context, ContextUpgradeable)\n returns (bytes calldata)\n {\n return super._msgData();\n }\n}\n" + }, + "contracts/universal/IKromaMintableERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport { IERC165 } from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\n/**\n * @title IKromaMintableERC20\n * @notice This interface is available on the KromaMintableERC20 contract. We declare it as a\n * separate interface so that it can be used in custom implementations of\n * KromaMintableERC20.\n */\ninterface IKromaMintableERC20 {\n function REMOTE_TOKEN() external view returns (address);\n\n function BRIDGE() external view returns (address);\n\n function mint(address _to, uint256 _amount) external;\n\n function burn(address _from, uint256 _amount) external;\n}\n" + }, + "contracts/universal/ISemver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title ISemver\n/// @notice ISemver is a simple contract for ensuring that contracts are\n/// versioned using semantic versioning.\ninterface ISemver {\n /// @notice Getter for the semantic version of the contract. This is not\n /// meant to be used onchain but instead meant to be used by offchain\n /// tooling.\n /// @return Semver contract version as a string.\n function version() external view returns (string memory);\n}\n" + }, + "contracts/universal/KromaMintableERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.15;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { IERC165 } from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\nimport { ISemver } from \"../universal/ISemver.sol\";\nimport { IKromaMintableERC20 } from \"./IKromaMintableERC20.sol\";\n\n/**\n * @title KromaMintableERC20\n * @notice KromaMintableERC20 is a standard extension of the base ERC20 token contract designed\n * to allow the StandardBridge contracts to mint and burn tokens. This makes it possible to\n * use a KromaMintableRC20 as the L2 representation of an L1 token, or vice-versa.\n * Designed to be backwards compatible with the older StandardL2ERC20 token which was only\n * meant for use on L2.\n */\ncontract KromaMintableERC20 is IKromaMintableERC20, ERC20, ISemver {\n /**\n * @notice Address of the corresponding version of this token on the remote chain.\n */\n address public immutable REMOTE_TOKEN;\n\n /**\n * @notice Address of the StandardBridge on this network.\n */\n address public immutable BRIDGE;\n\n /**\n * @notice Emitted whenever tokens are minted for an account.\n *\n * @param account Address of the account tokens are being minted for.\n * @param amount Amount of tokens minted.\n */\n event Mint(address indexed account, uint256 amount);\n\n /**\n * @notice Emitted whenever tokens are burned from an account.\n *\n * @param account Address of the account tokens are being burned from.\n * @param amount Amount of tokens burned.\n */\n event Burn(address indexed account, uint256 amount);\n\n /**\n * @notice A modifier that only allows the bridge to call\n */\n modifier onlyBridge() {\n require(msg.sender == BRIDGE, \"KromaMintableERC20: only bridge can mint and burn\");\n _;\n }\n\n /**\n * @notice Semantic version.\n * @custom:semver 1.0.0\n */\n string public constant version = \"1.0.0\";\n\n /**\n * @notice Constructs the KromaMintableERC20 contract.\n *\n * @param _bridge Address of the L2 standard bridge.\n * @param _remoteToken Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _bridge,\n address _remoteToken,\n string memory _name,\n string memory _symbol\n ) ERC20(_name, _symbol) {\n REMOTE_TOKEN = _remoteToken;\n BRIDGE = _bridge;\n }\n\n /**\n * @notice Allows the StandardBridge on this network to mint tokens.\n *\n * @param _to Address to mint tokens to.\n * @param _amount Amount of tokens to mint.\n */\n function mint(address _to, uint256 _amount)\n external\n virtual\n override(IKromaMintableERC20)\n onlyBridge\n {\n _mint(_to, _amount);\n emit Mint(_to, _amount);\n }\n\n /**\n * @notice Allows the StandardBridge on this network to burn tokens.\n *\n * @param _from Address to burn tokens from.\n * @param _amount Amount of tokens to burn.\n */\n function burn(address _from, uint256 _amount)\n external\n virtual\n override(IKromaMintableERC20)\n onlyBridge\n {\n _burn(_from, _amount);\n emit Burn(_from, _amount);\n }\n\n /**\n * @notice ERC165 interface check function.\n *\n * @param _interfaceId Interface ID to check.\n *\n * @return Whether or not the interface is supported by this contract.\n */\n function supportsInterface(bytes4 _interfaceId) external pure returns (bool) {\n bytes4 iface1 = type(IERC165).interfaceId;\n // Interface corresponding to the updated KromaMintableERC20 (this contract).\n bytes4 iface2 = type(IKromaMintableERC20).interfaceId;\n return _interfaceId == iface1 || _interfaceId == iface2;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (governance/utils/IVotes.sol)\npragma solidity ^0.8.0;\n\n/**\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\n *\n * _Available since v4.5._\n */\ninterface IVotes {\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Returns the current amount of votes that `account` has.\n */\n function getVotes(address account) external view returns (uint256);\n\n /**\n * @dev Returns the amount of votes that `account` had at a specific moment in the past. If the `clock()` is\n * configured to use block numbers, this will return the value at the end of the corresponding block.\n */\n function getPastVotes(address account, uint256 timepoint) external view returns (uint256);\n\n /**\n * @dev Returns the total supply of votes available at a specific moment in the past. If the `clock()` is\n * configured to use block numbers, this will return the value at the end of the corresponding block.\n *\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\n * vote.\n */\n function getPastTotalSupply(uint256 timepoint) external view returns (uint256);\n\n /**\n * @dev Returns the delegate that `account` has chosen.\n */\n function delegates(address account) external view returns (address);\n\n /**\n * @dev Delegates votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) external;\n\n /**\n * @dev Delegates votes from signer to `delegatee`.\n */\n function delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) external;\n}\n" + }, + "node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5267.sol)\n\npragma solidity ^0.8.0;\n\ninterface IERC5267 {\n /**\n * @dev MAY be emitted to signal that the domain could have changed.\n */\n event EIP712DomainChanged();\n\n /**\n * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712\n * signature.\n */\n function eip712Domain()\n external\n view\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n );\n}\n" + }, + "node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5805.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../governance/utils/IVotes.sol\";\nimport \"./IERC6372.sol\";\n\ninterface IERC5805 is IERC6372, IVotes {}\n" + }, + "node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC6372.sol)\n\npragma solidity ^0.8.0;\n\ninterface IERC6372 {\n /**\n * @dev Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting).\n */\n function clock() external view returns (uint48);\n\n /**\n * @dev Description of the clock\n */\n // solhint-disable-next-line func-name-mixedcase\n function CLOCK_MODE() external view returns (string memory);\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the default value returned by this function, unless\n * it's overridden.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(address from, address to, uint256 amount) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\n // decrementing then incrementing.\n _balances[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n unchecked {\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\n _balances[account] += amount;\n }\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n // Overflow not possible: amount <= accountBalance <= totalSupply.\n _totalSupply -= amount;\n }\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(address owner, address spender, uint256 amount) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20Permit.sol\";\nimport \"../ERC20.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\nimport \"../../../utils/cryptography/EIP712.sol\";\nimport \"../../../utils/Counters.sol\";\n\n/**\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * _Available since v3.4._\n */\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\n using Counters for Counters.Counter;\n\n mapping(address => Counters.Counter) private _nonces;\n\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private constant _PERMIT_TYPEHASH =\n keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n /**\n * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.\n * However, to ensure consistency with the upgradeable transpiler, we will continue\n * to reserve a slot.\n * @custom:oz-renamed-from _PERMIT_TYPEHASH\n */\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;\n\n /**\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n *\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\n */\n constructor(string memory name) EIP712(name, \"1\") {}\n\n /**\n * @dev See {IERC20Permit-permit}.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= deadline, \"ERC20Permit: expired deadline\");\n\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\n\n bytes32 hash = _hashTypedDataV4(structHash);\n\n address signer = ECDSA.recover(hash, v, r, s);\n require(signer == owner, \"ERC20Permit: invalid signature\");\n\n _approve(owner, spender, value);\n }\n\n /**\n * @dev See {IERC20Permit-nonces}.\n */\n function nonces(address owner) public view virtual override returns (uint256) {\n return _nonces[owner].current();\n }\n\n /**\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\n return _domainSeparatorV4();\n }\n\n /**\n * @dev \"Consume a nonce\": return the current value and increment.\n *\n * _Available since v4.1._\n */\n function _useNonce(address owner) internal virtual returns (uint256 current) {\n Counters.Counter storage nonce = _nonces[owner];\n current = nonce.current();\n nonce.increment();\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Votes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20Permit.sol\";\nimport \"../../../interfaces/IERC5805.sol\";\nimport \"../../../utils/math/Math.sol\";\nimport \"../../../utils/math/SafeCast.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is ERC20Permit, IERC5805 {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n /**\n * @dev Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting).\n */\n function clock() public view virtual override returns (uint48) {\n return SafeCast.toUint48(block.number);\n }\n\n /**\n * @dev Description of the clock\n */\n // solhint-disable-next-line func-name-mixedcase\n function CLOCK_MODE() public view virtual override returns (string memory) {\n // Check that the clock was not modified\n require(clock() == block.number, \"ERC20Votes: broken clock mode\");\n return \"mode=blocknumber&from=default\";\n }\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual override returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view virtual override returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n unchecked {\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `timepoint`.\n *\n * Requirements:\n *\n * - `timepoint` must be in the past\n */\n function getPastVotes(address account, uint256 timepoint) public view virtual override returns (uint256) {\n require(timepoint < clock(), \"ERC20Votes: future lookup\");\n return _checkpointsLookup(_checkpoints[account], timepoint);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `timepoint`. Note, this value is the sum of all balances.\n * It is NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `timepoint` must be in the past\n */\n function getPastTotalSupply(uint256 timepoint) public view virtual override returns (uint256) {\n require(timepoint < clock(), \"ERC20Votes: future lookup\");\n return _checkpointsLookup(_totalSupplyCheckpoints, timepoint);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 timepoint) private view returns (uint256) {\n // We run a binary search to look for the last (most recent) checkpoint taken before (or at) `timepoint`.\n //\n // Initially we check if the block is recent to narrow the search range.\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `timepoint`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `timepoint`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `timepoint`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `timepoint`, but it works out\n // the same.\n uint256 length = ckpts.length;\n\n uint256 low = 0;\n uint256 high = length;\n\n if (length > 5) {\n uint256 mid = length - Math.sqrt(length);\n if (_unsafeAccess(ckpts, mid).fromBlock > timepoint) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (_unsafeAccess(ckpts, mid).fromBlock > timepoint) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n unchecked {\n return high == 0 ? 0 : _unsafeAccess(ckpts, high - 1).votes;\n }\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual override {\n _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {IVotes-DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {IVotes-DelegateChanged} and {IVotes-DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(address src, address dst, uint256 amount) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n\n unchecked {\n Checkpoint memory oldCkpt = pos == 0 ? Checkpoint(0, 0) : _unsafeAccess(ckpts, pos - 1);\n\n oldWeight = oldCkpt.votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && oldCkpt.fromBlock == clock()) {\n _unsafeAccess(ckpts, pos - 1).votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(clock()), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n\n /**\n * @dev Access an element of the array without performing bounds check. The position is assumed to be within bounds.\n */\n function _unsafeAccess(Checkpoint[] storage ckpts, uint256 pos) private pure returns (Checkpoint storage result) {\n assembly {\n mstore(0, ckpts.slot)\n result.slot := add(keccak256(0, 0x20), pos)\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/Counters.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/ShortStrings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/ShortStrings.sol)\n\npragma solidity ^0.8.8;\n\nimport \"./StorageSlot.sol\";\n\n// | string | 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |\n// | length | 0x BB |\ntype ShortString is bytes32;\n\n/**\n * @dev This library provides functions to convert short memory strings\n * into a `ShortString` type that can be used as an immutable variable.\n *\n * Strings of arbitrary length can be optimized using this library if\n * they are short enough (up to 31 bytes) by packing them with their\n * length (1 byte) in a single EVM word (32 bytes). Additionally, a\n * fallback mechanism can be used for every other case.\n *\n * Usage example:\n *\n * ```solidity\n * contract Named {\n * using ShortStrings for *;\n *\n * ShortString private immutable _name;\n * string private _nameFallback;\n *\n * constructor(string memory contractName) {\n * _name = contractName.toShortStringWithFallback(_nameFallback);\n * }\n *\n * function name() external view returns (string memory) {\n * return _name.toStringWithFallback(_nameFallback);\n * }\n * }\n * ```\n */\nlibrary ShortStrings {\n // Used as an identifier for strings longer than 31 bytes.\n bytes32 private constant _FALLBACK_SENTINEL = 0x00000000000000000000000000000000000000000000000000000000000000FF;\n\n error StringTooLong(string str);\n error InvalidShortString();\n\n /**\n * @dev Encode a string of at most 31 chars into a `ShortString`.\n *\n * This will trigger a `StringTooLong` error is the input string is too long.\n */\n function toShortString(string memory str) internal pure returns (ShortString) {\n bytes memory bstr = bytes(str);\n if (bstr.length > 31) {\n revert StringTooLong(str);\n }\n return ShortString.wrap(bytes32(uint256(bytes32(bstr)) | bstr.length));\n }\n\n /**\n * @dev Decode a `ShortString` back to a \"normal\" string.\n */\n function toString(ShortString sstr) internal pure returns (string memory) {\n uint256 len = byteLength(sstr);\n // using `new string(len)` would work locally but is not memory safe.\n string memory str = new string(32);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(str, len)\n mstore(add(str, 0x20), sstr)\n }\n return str;\n }\n\n /**\n * @dev Return the length of a `ShortString`.\n */\n function byteLength(ShortString sstr) internal pure returns (uint256) {\n uint256 result = uint256(ShortString.unwrap(sstr)) & 0xFF;\n if (result > 31) {\n revert InvalidShortString();\n }\n return result;\n }\n\n /**\n * @dev Encode a string into a `ShortString`, or write it to storage if it is too long.\n */\n function toShortStringWithFallback(string memory value, string storage store) internal returns (ShortString) {\n if (bytes(value).length < 32) {\n return toShortString(value);\n } else {\n StorageSlot.getStringSlot(store).value = value;\n return ShortString.wrap(_FALLBACK_SENTINEL);\n }\n }\n\n /**\n * @dev Decode a string that was encoded to `ShortString` or written to storage using {setWithFallback}.\n */\n function toStringWithFallback(ShortString value, string storage store) internal pure returns (string memory) {\n if (ShortString.unwrap(value) != _FALLBACK_SENTINEL) {\n return toString(value);\n } else {\n return store;\n }\n }\n\n /**\n * @dev Return the length of a string that was encoded to `ShortString` or written to storage using {setWithFallback}.\n *\n * WARNING: This will return the \"byte length\" of the string. This may not reflect the actual length in terms of\n * actual characters as the UTF-8 encoding of a single character can span over multiple bytes.\n */\n function byteLengthWithFallback(ShortString value, string storage store) internal view returns (uint256) {\n if (ShortString.unwrap(value) != _FALLBACK_SENTINEL) {\n return byteLength(value);\n } else {\n return bytes(store).length;\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/StorageSlot.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n *\n * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._\n * _Available since v4.9 for `string`, `bytes`._\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n struct StringSlot {\n string value;\n }\n\n struct BytesSlot {\n bytes value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` with member `value` located at `slot`.\n */\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n */\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := store.slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` with member `value` located at `slot`.\n */\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n */\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := store.slot\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/Strings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toString(int256 value) internal pure returns (string memory) {\n return string(abi.encodePacked(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value))));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return keccak256(bytes(a)) == keccak256(bytes(b));\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.sol\";\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV // Deprecated in v4.8\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n /// @solidity memory-safe-assembly\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, \"\\x19Ethereum Signed Message:\\n32\")\n mstore(0x1c, hash)\n message := keccak256(0x00, 0x3c)\n }\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from `s`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n\", Strings.toString(s.length), s));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) {\n /// @solidity memory-safe-assembly\n assembly {\n let ptr := mload(0x40)\n mstore(ptr, \"\\x19\\x01\")\n mstore(add(ptr, 0x02), domainSeparator)\n mstore(add(ptr, 0x22), structHash)\n data := keccak256(ptr, 0x42)\n }\n }\n\n /**\n * @dev Returns an Ethereum Signed Data with intended validator, created from a\n * `validator` and `data` according to the version 0 of EIP-191.\n *\n * See {recover}.\n */\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x00\", validator, data));\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.8;\n\nimport \"./ECDSA.sol\";\nimport \"../ShortStrings.sol\";\nimport \"../../interfaces/IERC5267.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain\n * separator of the implementation contract. This will cause the `_domainSeparatorV4` function to always rebuild the\n * separator from the immutable values, which is cheaper than accessing a cached version in cold storage.\n *\n * _Available since v3.4._\n *\n * @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\n */\nabstract contract EIP712 is IERC5267 {\n using ShortStrings for *;\n\n bytes32 private constant _TYPE_HASH =\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\");\n\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _cachedDomainSeparator;\n uint256 private immutable _cachedChainId;\n address private immutable _cachedThis;\n\n bytes32 private immutable _hashedName;\n bytes32 private immutable _hashedVersion;\n\n ShortString private immutable _name;\n ShortString private immutable _version;\n string private _nameFallback;\n string private _versionFallback;\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n _name = name.toShortStringWithFallback(_nameFallback);\n _version = version.toShortStringWithFallback(_versionFallback);\n _hashedName = keccak256(bytes(name));\n _hashedVersion = keccak256(bytes(version));\n\n _cachedChainId = block.chainid;\n _cachedDomainSeparator = _buildDomainSeparator();\n _cachedThis = address(this);\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _cachedThis && block.chainid == _cachedChainId) {\n return _cachedDomainSeparator;\n } else {\n return _buildDomainSeparator();\n }\n }\n\n function _buildDomainSeparator() private view returns (bytes32) {\n return keccak256(abi.encode(_TYPE_HASH, _hashedName, _hashedVersion, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n\n /**\n * @dev See {EIP-5267}.\n *\n * _Available since v4.9._\n */\n function eip712Domain()\n public\n view\n virtual\n override\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n )\n {\n return (\n hex\"0f\", // 01111\n _name.toStringWithFallback(_nameFallback),\n _version.toStringWithFallback(_versionFallback),\n block.chainid,\n address(this),\n bytes32(0),\n new uint256[](0)\n );\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1, \"Math: mulDiv overflow\");\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10 ** 64) {\n value /= 10 ** 64;\n result += 64;\n }\n if (value >= 10 ** 32) {\n value /= 10 ** 32;\n result += 32;\n }\n if (value >= 10 ** 16) {\n value /= 10 ** 16;\n result += 16;\n }\n if (value >= 10 ** 8) {\n value /= 10 ** 8;\n result += 8;\n }\n if (value >= 10 ** 4) {\n value /= 10 ** 4;\n result += 4;\n }\n if (value >= 10 ** 2) {\n value /= 10 ** 2;\n result += 2;\n }\n if (value >= 10 ** 1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SafeCast.sol)\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n require(value <= type(uint248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n require(value <= type(uint240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n require(value <= type(uint232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.2._\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n require(value <= type(uint216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n require(value <= type(uint208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n require(value <= type(uint200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n require(value <= type(uint192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n require(value <= type(uint184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n require(value <= type(uint176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n require(value <= type(uint168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n require(value <= type(uint160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n require(value <= type(uint152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n require(value <= type(uint144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n require(value <= type(uint136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v2.5._\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n require(value <= type(uint120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n require(value <= type(uint112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n require(value <= type(uint104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.2._\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n require(value <= type(uint88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n require(value <= type(uint80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n require(value <= type(uint72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v2.5._\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n require(value <= type(uint56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n require(value <= type(uint48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n require(value <= type(uint40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v2.5._\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n require(value <= type(uint24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v2.5._\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v2.5._\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n *\n * _Available since v3.0._\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toInt248(int256 value) internal pure returns (int248 downcasted) {\n downcasted = int248(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 248 bits\");\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toInt240(int256 value) internal pure returns (int240 downcasted) {\n downcasted = int240(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 240 bits\");\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toInt232(int256 value) internal pure returns (int232 downcasted) {\n downcasted = int232(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 232 bits\");\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.7._\n */\n function toInt224(int256 value) internal pure returns (int224 downcasted) {\n downcasted = int224(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 224 bits\");\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toInt216(int256 value) internal pure returns (int216 downcasted) {\n downcasted = int216(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 216 bits\");\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toInt208(int256 value) internal pure returns (int208 downcasted) {\n downcasted = int208(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 208 bits\");\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toInt200(int256 value) internal pure returns (int200 downcasted) {\n downcasted = int200(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 200 bits\");\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toInt192(int256 value) internal pure returns (int192 downcasted) {\n downcasted = int192(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 192 bits\");\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toInt184(int256 value) internal pure returns (int184 downcasted) {\n downcasted = int184(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 184 bits\");\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toInt176(int256 value) internal pure returns (int176 downcasted) {\n downcasted = int176(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 176 bits\");\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toInt168(int256 value) internal pure returns (int168 downcasted) {\n downcasted = int168(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 168 bits\");\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toInt160(int256 value) internal pure returns (int160 downcasted) {\n downcasted = int160(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 160 bits\");\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toInt152(int256 value) internal pure returns (int152 downcasted) {\n downcasted = int152(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 152 bits\");\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toInt144(int256 value) internal pure returns (int144 downcasted) {\n downcasted = int144(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 144 bits\");\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toInt136(int256 value) internal pure returns (int136 downcasted) {\n downcasted = int136(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 136 bits\");\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128 downcasted) {\n downcasted = int128(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 128 bits\");\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toInt120(int256 value) internal pure returns (int120 downcasted) {\n downcasted = int120(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 120 bits\");\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toInt112(int256 value) internal pure returns (int112 downcasted) {\n downcasted = int112(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 112 bits\");\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toInt104(int256 value) internal pure returns (int104 downcasted) {\n downcasted = int104(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 104 bits\");\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.7._\n */\n function toInt96(int256 value) internal pure returns (int96 downcasted) {\n downcasted = int96(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 96 bits\");\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toInt88(int256 value) internal pure returns (int88 downcasted) {\n downcasted = int88(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 88 bits\");\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toInt80(int256 value) internal pure returns (int80 downcasted) {\n downcasted = int80(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 80 bits\");\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toInt72(int256 value) internal pure returns (int72 downcasted) {\n downcasted = int72(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 72 bits\");\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64 downcasted) {\n downcasted = int64(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 64 bits\");\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toInt56(int256 value) internal pure returns (int56 downcasted) {\n downcasted = int56(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 56 bits\");\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toInt48(int256 value) internal pure returns (int48 downcasted) {\n downcasted = int48(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 48 bits\");\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toInt40(int256 value) internal pure returns (int40 downcasted) {\n downcasted = int40(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 40 bits\");\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32 downcasted) {\n downcasted = int32(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 32 bits\");\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toInt24(int256 value) internal pure returns (int24 downcasted) {\n downcasted = int24(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 24 bits\");\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16 downcasted) {\n downcasted = int16(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 16 bits\");\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8 downcasted) {\n downcasted = int8(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 8 bits\");\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n *\n * _Available since v3.0._\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n /**\n * @dev Returns the largest of two signed numbers.\n */\n function max(int256 a, int256 b) internal pure returns (int256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two signed numbers.\n */\n function min(int256 a, int256 b) internal pure returns (int256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two signed numbers without overflow.\n * The result is rounded towards zero.\n */\n function average(int256 a, int256 b) internal pure returns (int256) {\n // Formula from the book \"Hacker's Delight\"\n int256 x = (a & b) + ((a ^ b) >> 1);\n return x + (int256(uint256(x) >> 255) & (a ^ b));\n }\n\n /**\n * @dev Returns the absolute unsigned value of a signed value.\n */\n function abs(int256 n) internal pure returns (uint256) {\n unchecked {\n // must be unchecked in order to support `n = type(int256).min`\n return uint256(n >= 0 ? n : -n);\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./OwnableUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership} and {acceptOwnership}.\n *\n * This module is used through inheritance. It will make available all functions\n * from parent (Ownable).\n */\nabstract contract Ownable2StepUpgradeable is Initializable, OwnableUpgradeable {\n function __Ownable2Step_init() internal onlyInitializing {\n __Ownable_init_unchained();\n }\n\n function __Ownable2Step_init_unchained() internal onlyInitializing {\n }\n address private _pendingOwner;\n\n event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Returns the address of the pending owner.\n */\n function pendingOwner() public view virtual returns (address) {\n return _pendingOwner;\n }\n\n /**\n * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual override onlyOwner {\n _pendingOwner = newOwner;\n emit OwnershipTransferStarted(owner(), newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual override {\n delete _pendingOwner;\n super._transferOwnership(newOwner);\n }\n\n /**\n * @dev The new owner accepts the ownership transfer.\n */\n function acceptOwnership() public virtual {\n address sender = _msgSender();\n require(pendingOwner() == sender, \"Ownable2Step: caller is not the new owner\");\n _transferOwnership(sender);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n function __Ownable_init() internal onlyInitializing {\n __Ownable_init_unchained();\n }\n\n function __Ownable_init_unchained() internal onlyInitializing {\n _transferOwnership(_msgSender());\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n * @custom:oz-retyped-from bool\n */\n uint8 private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint8 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts.\n *\n * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\n * constructor.\n *\n * Emits an {Initialized} event.\n */\n modifier initializer() {\n bool isTopLevelCall = !_initializing;\n require(\n (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\n \"Initializable: contract is already initialized\"\n );\n _initialized = 1;\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n * are added through upgrades and that require initialization.\n *\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n * cannot be nested. If one is invoked in the context of another, execution will revert.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n *\n * WARNING: setting the version to 255 will prevent any future reinitialization.\n *\n * Emits an {Initialized} event.\n */\n modifier reinitializer(uint8 version) {\n require(!_initializing && _initialized < version, \"Initializable: contract is already initialized\");\n _initialized = version;\n _initializing = true;\n _;\n _initializing = false;\n emit Initialized(version);\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n require(_initializing, \"Initializable: contract is not initializing\");\n _;\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n *\n * Emits an {Initialized} event the first time it is successfully executed.\n */\n function _disableInitializers() internal virtual {\n require(!_initializing, \"Initializable: contract is initializing\");\n if (_initialized != type(uint8).max) {\n _initialized = type(uint8).max;\n emit Initialized(type(uint8).max);\n }\n }\n\n /**\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\n */\n function _getInitializedVersion() internal view returns (uint8) {\n return _initialized;\n }\n\n /**\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n */\n function _isInitializing() internal view returns (bool) {\n return _initializing;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n *\n * Furthermore, `isContract` will also return true if the target contract within\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n * which only has an effect at the end of a transaction.\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal onlyInitializing {\n }\n\n function __Context_init_unchained() internal onlyInitializing {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[50] private __gap;\n}\n" + } + }, + "settings": { + "remappings": [ + "@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/", + "@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/", + "@rari-capital/solmate/=node_modules/@rari-capital/solmate/", + "forge-std/=node_modules/forge-std/src/", + "ds-test/=node_modules/ds-test/src/", + "hardhat-deploy/=node_modules/hardhat-deploy/", + "hardhat/=node_modules/hardhat/" + ], + "optimizer": { + "enabled": true, + "runs": 10000 + }, + "metadata": { + "useLiteralContent": false, + "bytecodeHash": "none" + }, + "outputSelection": { + "*": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + } + }, + "evmVersion": "london", + "viaIR": false, + "libraries": {} + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/mainnet/solcInputs/37a0cebac478897ae0c20446c8a2494a.json b/packages/contracts/deployments/mainnet/solcInputs/37a0cebac478897ae0c20446c8a2494a.json new file mode 100644 index 0000000000..2469337c2c --- /dev/null +++ b/packages/contracts/deployments/mainnet/solcInputs/37a0cebac478897ae0c20446c8a2494a.json @@ -0,0 +1,141 @@ +{ + "language": "Solidity", + "sources": { + "contracts/governance/GovernanceToken.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.15;\n\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\";\nimport \"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\";\n\nimport { KromaMintableERC20 } from \"../universal/KromaMintableERC20.sol\";\n\n/**\n * @custom:proxied\n * @title GovernanceToken\n * @notice The KRO token used in governance, supporting voting and delegation. Implements\n * EIP 2612 allowing signed approvals. `mint` function is only allowed to the owner or\n * `Bridge`, and the total supply amount is minted at once (TGE). `Bridge` has the\n * permission to `mint` and `burn`, for the purpose of bridging KRO to the remote chain.\n */\ncontract GovernanceToken is KromaMintableERC20, ERC20Votes, Ownable2StepUpgradeable {\n /**\n * @notice Constructs the GovernanceToken contract.\n *\n * @param _bridge Address of the StandardBridge contract on this network.\n * @param _remoteToken Address of the corresponding token on the remote chain.\n */\n constructor(\n address _bridge,\n address _remoteToken\n ) KromaMintableERC20(_bridge, _remoteToken, \"\", \"\") ERC20Permit(\"Kroma\") {\n _disableInitializers();\n }\n\n /**\n * @notice Initializer.\n *\n * @param _owner The owner of this contract.\n */\n function initialize(address _owner) public initializer {\n __Ownable2Step_init();\n transferOwnership(_owner);\n }\n\n /**\n * @notice Allows StandardBridge or the owner to mint tokens.\n *\n * @param _to Address to mint tokens to.\n * @param _amount Amount of tokens to mint.\n */\n function mint(address _to, uint256 _amount) external override {\n require(\n msg.sender == BRIDGE || msg.sender == owner(),\n \"GovernanceToken: only bridge or owner can mint\"\n );\n\n _mint(_to, _amount);\n }\n\n /**\n * @inheritdoc KromaMintableERC20\n */\n function burn(address _from, uint256 _amount) external override onlyBridge {\n _burn(_from, _amount);\n }\n\n /**\n * @inheritdoc ERC20\n */\n function name() public pure override returns (string memory) {\n return \"Kroma\";\n }\n\n /**\n * @inheritdoc ERC20\n */\n function symbol() public pure override returns (string memory) {\n return \"KRO\";\n }\n\n /**\n * @notice Callback called after a token transfer.\n *\n * @param from The account sending tokens.\n * @param to The account receiving tokens.\n * @param amount The amount of tokens being transferred.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20, ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n\n /**\n * @notice Internal mint function.\n *\n * @param account The account receiving minted tokens.\n * @param amount The amount of tokens to mint.\n */\n function _mint(address account, uint256 amount) internal override(ERC20, ERC20Votes) {\n super._mint(account, amount);\n emit Mint(account, amount);\n }\n\n /**\n * @notice Internal burn function.\n *\n * @param account The account that tokens will be burned from.\n * @param amount The amount of tokens that will be burned.\n */\n function _burn(address account, uint256 amount) internal override(ERC20, ERC20Votes) {\n super._burn(account, amount);\n emit Burn(account, amount);\n }\n\n /**\n * @notice Override function.\n */\n function _msgSender() internal view override(Context, ContextUpgradeable) returns (address) {\n return super._msgSender();\n }\n\n /**\n * @notice Override function.\n */\n function _msgData()\n internal\n view\n override(Context, ContextUpgradeable)\n returns (bytes calldata)\n {\n return super._msgData();\n }\n}\n" + }, + "contracts/governance/MintManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.15;\n\nimport { Ownable2Step } from \"@openzeppelin/contracts/access/Ownable2Step.sol\";\n\nimport { GovernanceToken } from \"./GovernanceToken.sol\";\n\n/**\n * @title MintManager\n * @notice MintManager issues mint cap amount of GovernanceToken at once (TGE) and distributes the\n * tokens to specified recipients.\n */\ncontract MintManager is Ownable2Step {\n /**\n * @notice The amount of tokens that can be minted.\n */\n uint256 public constant MINT_CAP = 1_000_000_000;\n\n /**\n * @notice The denominator of each recipient's share.\n */\n uint256 public constant SHARE_DENOMINATOR = 10 ** 5;\n\n /**\n * @notice The GovernanceToken that the MintManager can mint.\n */\n GovernanceToken public immutable GOVERNANCE_TOKEN;\n\n /**\n * @notice True when already minted on this chain. MintManager can mint only once on each chain.\n */\n bool public minted;\n\n /**\n * @notice A list of recipient addresses that will receive tokens to be distributed.\n */\n address[] public recipients;\n\n /**\n * @notice A mapping of the recipient's address to share.\n */\n mapping(address => uint256) public shareOf;\n\n /**\n * @notice Constructs the MintManager contract.\n *\n * @param _governanceToken The GovernanceToken this contract can mint tokens of.\n * @param _owner The owner of this contract.\n * @param _recipients List of the recipients.\n * @param _shares List of token distribution ratios for each recipient.\n */\n constructor(\n address _governanceToken,\n address _owner,\n address[] memory _recipients,\n uint256[] memory _shares\n ) {\n GOVERNANCE_TOKEN = GovernanceToken(_governanceToken);\n\n transferOwnership(_owner);\n\n require(_recipients.length == _shares.length, \"MintManager: invalid length of array\");\n\n uint256 totalShares = 0;\n for (uint256 i = 0; i < _recipients.length; i++) {\n address recipient = _recipients[i];\n require(recipient != address(0), \"MintManager: recipient address cannot be 0\");\n\n uint256 share = _shares[i];\n require(share != 0, \"MintManager: share cannot be 0\");\n\n if (shareOf[recipient] == 0) {\n recipients.push(recipient);\n }\n shareOf[recipient] += share;\n totalShares += share;\n }\n\n require(\n totalShares <= SHARE_DENOMINATOR,\n \"MintManager: max total share is equal or less than SHARE_DENOMINATOR\"\n );\n }\n\n /**\n * @notice Only the owner is allowed to mint mint cap amount of the GovernanceToken at once.\n */\n function mint() external onlyOwner {\n require(!minted, \"MintManager: already minted on this chain\");\n\n uint256 mintCap = MINT_CAP * 10 ** GOVERNANCE_TOKEN.decimals();\n\n uint256 totalAmount;\n for (uint256 i = 0; i < recipients.length; i++) {\n address recipient = recipients[i];\n uint256 share = shareOf[recipient];\n uint256 amount = (mintCap * share) / SHARE_DENOMINATOR;\n totalAmount += amount;\n }\n\n GOVERNANCE_TOKEN.mint(address(this), totalAmount);\n\n minted = true;\n }\n\n /**\n * @notice Only the owner is allowed to distribute the GovernanceToken to specified recipients.\n */\n function distribute() external onlyOwner {\n uint256 mintCap = MINT_CAP * 10 ** GOVERNANCE_TOKEN.decimals();\n\n for (uint256 i = 0; i < recipients.length; i++) {\n address recipient = recipients[i];\n uint256 share = shareOf[recipient];\n uint256 amount = (mintCap * share) / SHARE_DENOMINATOR;\n GOVERNANCE_TOKEN.transfer(recipient, amount);\n }\n }\n\n /**\n * @notice Only the owner is allowed to renounce the ownership of the GovernanceToken.\n */\n function renounceOwnershipOfToken() external onlyOwner {\n require(minted, \"MintManager: not minted before renounce ownership\");\n\n GOVERNANCE_TOKEN.renounceOwnership();\n }\n\n /**\n * @notice Only the owner is allowed to transfer the ownership of the GovernanceToken.\n *\n * @param newMintManager The new MintManager to own the GovernanceToken.\n */\n function transferOwnershipOfToken(address newMintManager) external onlyOwner {\n GOVERNANCE_TOKEN.transferOwnership(newMintManager);\n }\n\n /**\n * @notice Only the owner is allowed to accept the ownership of the GovernanceToken.\n */\n function acceptOwnershipOfToken() external onlyOwner {\n GOVERNANCE_TOKEN.acceptOwnership();\n }\n}\n" + }, + "contracts/universal/IKromaMintableERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport { IERC165 } from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\n/**\n * @title IKromaMintableERC20\n * @notice This interface is available on the KromaMintableERC20 contract. We declare it as a\n * separate interface so that it can be used in custom implementations of\n * KromaMintableERC20.\n */\ninterface IKromaMintableERC20 {\n function REMOTE_TOKEN() external view returns (address);\n\n function BRIDGE() external view returns (address);\n\n function mint(address _to, uint256 _amount) external;\n\n function burn(address _from, uint256 _amount) external;\n}\n" + }, + "contracts/universal/ISemver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title ISemver\n/// @notice ISemver is a simple contract for ensuring that contracts are\n/// versioned using semantic versioning.\ninterface ISemver {\n /// @notice Getter for the semantic version of the contract. This is not\n /// meant to be used onchain but instead meant to be used by offchain\n /// tooling.\n /// @return Semver contract version as a string.\n function version() external view returns (string memory);\n}\n" + }, + "contracts/universal/KromaMintableERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.15;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { IERC165 } from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\nimport { ISemver } from \"../universal/ISemver.sol\";\nimport { IKromaMintableERC20 } from \"./IKromaMintableERC20.sol\";\n\n/**\n * @title KromaMintableERC20\n * @notice KromaMintableERC20 is a standard extension of the base ERC20 token contract designed\n * to allow the StandardBridge contracts to mint and burn tokens. This makes it possible to\n * use a KromaMintableRC20 as the L2 representation of an L1 token, or vice-versa.\n * Designed to be backwards compatible with the older StandardL2ERC20 token which was only\n * meant for use on L2.\n */\ncontract KromaMintableERC20 is IKromaMintableERC20, ERC20, ISemver {\n /**\n * @notice Address of the corresponding version of this token on the remote chain.\n */\n address public immutable REMOTE_TOKEN;\n\n /**\n * @notice Address of the StandardBridge on this network.\n */\n address public immutable BRIDGE;\n\n /**\n * @notice Emitted whenever tokens are minted for an account.\n *\n * @param account Address of the account tokens are being minted for.\n * @param amount Amount of tokens minted.\n */\n event Mint(address indexed account, uint256 amount);\n\n /**\n * @notice Emitted whenever tokens are burned from an account.\n *\n * @param account Address of the account tokens are being burned from.\n * @param amount Amount of tokens burned.\n */\n event Burn(address indexed account, uint256 amount);\n\n /**\n * @notice A modifier that only allows the bridge to call\n */\n modifier onlyBridge() {\n require(msg.sender == BRIDGE, \"KromaMintableERC20: only bridge can mint and burn\");\n _;\n }\n\n /**\n * @notice Semantic version.\n * @custom:semver 1.0.0\n */\n string public constant version = \"1.0.0\";\n\n /**\n * @notice Constructs the KromaMintableERC20 contract.\n *\n * @param _bridge Address of the L2 standard bridge.\n * @param _remoteToken Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _bridge,\n address _remoteToken,\n string memory _name,\n string memory _symbol\n ) ERC20(_name, _symbol) {\n REMOTE_TOKEN = _remoteToken;\n BRIDGE = _bridge;\n }\n\n /**\n * @notice Allows the StandardBridge on this network to mint tokens.\n *\n * @param _to Address to mint tokens to.\n * @param _amount Amount of tokens to mint.\n */\n function mint(address _to, uint256 _amount)\n external\n virtual\n override(IKromaMintableERC20)\n onlyBridge\n {\n _mint(_to, _amount);\n emit Mint(_to, _amount);\n }\n\n /**\n * @notice Allows the StandardBridge on this network to burn tokens.\n *\n * @param _from Address to burn tokens from.\n * @param _amount Amount of tokens to burn.\n */\n function burn(address _from, uint256 _amount)\n external\n virtual\n override(IKromaMintableERC20)\n onlyBridge\n {\n _burn(_from, _amount);\n emit Burn(_from, _amount);\n }\n\n /**\n * @notice ERC165 interface check function.\n *\n * @param _interfaceId Interface ID to check.\n *\n * @return Whether or not the interface is supported by this contract.\n */\n function supportsInterface(bytes4 _interfaceId) external pure returns (bool) {\n bytes4 iface1 = type(IERC165).interfaceId;\n // Interface corresponding to the updated KromaMintableERC20 (this contract).\n bytes4 iface2 = type(IKromaMintableERC20).interfaceId;\n return _interfaceId == iface1 || _interfaceId == iface2;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/access/Ownable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _transferOwnership(_msgSender());\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/access/Ownable2Step.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./Ownable.sol\";\n\n/**\n * @dev Contract module which provides access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership} and {acceptOwnership}.\n *\n * This module is used through inheritance. It will make available all functions\n * from parent (Ownable).\n */\nabstract contract Ownable2Step is Ownable {\n address private _pendingOwner;\n\n event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Returns the address of the pending owner.\n */\n function pendingOwner() public view virtual returns (address) {\n return _pendingOwner;\n }\n\n /**\n * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual override onlyOwner {\n _pendingOwner = newOwner;\n emit OwnershipTransferStarted(owner(), newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual override {\n delete _pendingOwner;\n super._transferOwnership(newOwner);\n }\n\n /**\n * @dev The new owner accepts the ownership transfer.\n */\n function acceptOwnership() public virtual {\n address sender = _msgSender();\n require(pendingOwner() == sender, \"Ownable2Step: caller is not the new owner\");\n _transferOwnership(sender);\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (governance/utils/IVotes.sol)\npragma solidity ^0.8.0;\n\n/**\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\n *\n * _Available since v4.5._\n */\ninterface IVotes {\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Returns the current amount of votes that `account` has.\n */\n function getVotes(address account) external view returns (uint256);\n\n /**\n * @dev Returns the amount of votes that `account` had at a specific moment in the past. If the `clock()` is\n * configured to use block numbers, this will return the value at the end of the corresponding block.\n */\n function getPastVotes(address account, uint256 timepoint) external view returns (uint256);\n\n /**\n * @dev Returns the total supply of votes available at a specific moment in the past. If the `clock()` is\n * configured to use block numbers, this will return the value at the end of the corresponding block.\n *\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\n * vote.\n */\n function getPastTotalSupply(uint256 timepoint) external view returns (uint256);\n\n /**\n * @dev Returns the delegate that `account` has chosen.\n */\n function delegates(address account) external view returns (address);\n\n /**\n * @dev Delegates votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) external;\n\n /**\n * @dev Delegates votes from signer to `delegatee`.\n */\n function delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) external;\n}\n" + }, + "node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5267.sol)\n\npragma solidity ^0.8.0;\n\ninterface IERC5267 {\n /**\n * @dev MAY be emitted to signal that the domain could have changed.\n */\n event EIP712DomainChanged();\n\n /**\n * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712\n * signature.\n */\n function eip712Domain()\n external\n view\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n );\n}\n" + }, + "node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5805.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../governance/utils/IVotes.sol\";\nimport \"./IERC6372.sol\";\n\ninterface IERC5805 is IERC6372, IVotes {}\n" + }, + "node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC6372.sol)\n\npragma solidity ^0.8.0;\n\ninterface IERC6372 {\n /**\n * @dev Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting).\n */\n function clock() external view returns (uint48);\n\n /**\n * @dev Description of the clock\n */\n // solhint-disable-next-line func-name-mixedcase\n function CLOCK_MODE() external view returns (string memory);\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the default value returned by this function, unless\n * it's overridden.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(address from, address to, uint256 amount) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\n // decrementing then incrementing.\n _balances[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n unchecked {\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\n _balances[account] += amount;\n }\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n // Overflow not possible: amount <= accountBalance <= totalSupply.\n _totalSupply -= amount;\n }\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(address owner, address spender, uint256 amount) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20Permit.sol\";\nimport \"../ERC20.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\nimport \"../../../utils/cryptography/EIP712.sol\";\nimport \"../../../utils/Counters.sol\";\n\n/**\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * _Available since v3.4._\n */\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\n using Counters for Counters.Counter;\n\n mapping(address => Counters.Counter) private _nonces;\n\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private constant _PERMIT_TYPEHASH =\n keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n /**\n * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.\n * However, to ensure consistency with the upgradeable transpiler, we will continue\n * to reserve a slot.\n * @custom:oz-renamed-from _PERMIT_TYPEHASH\n */\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;\n\n /**\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n *\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\n */\n constructor(string memory name) EIP712(name, \"1\") {}\n\n /**\n * @dev See {IERC20Permit-permit}.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= deadline, \"ERC20Permit: expired deadline\");\n\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\n\n bytes32 hash = _hashTypedDataV4(structHash);\n\n address signer = ECDSA.recover(hash, v, r, s);\n require(signer == owner, \"ERC20Permit: invalid signature\");\n\n _approve(owner, spender, value);\n }\n\n /**\n * @dev See {IERC20Permit-nonces}.\n */\n function nonces(address owner) public view virtual override returns (uint256) {\n return _nonces[owner].current();\n }\n\n /**\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\n return _domainSeparatorV4();\n }\n\n /**\n * @dev \"Consume a nonce\": return the current value and increment.\n *\n * _Available since v4.1._\n */\n function _useNonce(address owner) internal virtual returns (uint256 current) {\n Counters.Counter storage nonce = _nonces[owner];\n current = nonce.current();\n nonce.increment();\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Votes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20Permit.sol\";\nimport \"../../../interfaces/IERC5805.sol\";\nimport \"../../../utils/math/Math.sol\";\nimport \"../../../utils/math/SafeCast.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is ERC20Permit, IERC5805 {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n /**\n * @dev Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting).\n */\n function clock() public view virtual override returns (uint48) {\n return SafeCast.toUint48(block.number);\n }\n\n /**\n * @dev Description of the clock\n */\n // solhint-disable-next-line func-name-mixedcase\n function CLOCK_MODE() public view virtual override returns (string memory) {\n // Check that the clock was not modified\n require(clock() == block.number, \"ERC20Votes: broken clock mode\");\n return \"mode=blocknumber&from=default\";\n }\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual override returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view virtual override returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n unchecked {\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `timepoint`.\n *\n * Requirements:\n *\n * - `timepoint` must be in the past\n */\n function getPastVotes(address account, uint256 timepoint) public view virtual override returns (uint256) {\n require(timepoint < clock(), \"ERC20Votes: future lookup\");\n return _checkpointsLookup(_checkpoints[account], timepoint);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `timepoint`. Note, this value is the sum of all balances.\n * It is NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `timepoint` must be in the past\n */\n function getPastTotalSupply(uint256 timepoint) public view virtual override returns (uint256) {\n require(timepoint < clock(), \"ERC20Votes: future lookup\");\n return _checkpointsLookup(_totalSupplyCheckpoints, timepoint);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 timepoint) private view returns (uint256) {\n // We run a binary search to look for the last (most recent) checkpoint taken before (or at) `timepoint`.\n //\n // Initially we check if the block is recent to narrow the search range.\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `timepoint`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `timepoint`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `timepoint`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `timepoint`, but it works out\n // the same.\n uint256 length = ckpts.length;\n\n uint256 low = 0;\n uint256 high = length;\n\n if (length > 5) {\n uint256 mid = length - Math.sqrt(length);\n if (_unsafeAccess(ckpts, mid).fromBlock > timepoint) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (_unsafeAccess(ckpts, mid).fromBlock > timepoint) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n unchecked {\n return high == 0 ? 0 : _unsafeAccess(ckpts, high - 1).votes;\n }\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual override {\n _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {IVotes-DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {IVotes-DelegateChanged} and {IVotes-DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(address src, address dst, uint256 amount) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n\n unchecked {\n Checkpoint memory oldCkpt = pos == 0 ? Checkpoint(0, 0) : _unsafeAccess(ckpts, pos - 1);\n\n oldWeight = oldCkpt.votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && oldCkpt.fromBlock == clock()) {\n _unsafeAccess(ckpts, pos - 1).votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(clock()), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n\n /**\n * @dev Access an element of the array without performing bounds check. The position is assumed to be within bounds.\n */\n function _unsafeAccess(Checkpoint[] storage ckpts, uint256 pos) private pure returns (Checkpoint storage result) {\n assembly {\n mstore(0, ckpts.slot)\n result.slot := add(keccak256(0, 0x20), pos)\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/Counters.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/ShortStrings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/ShortStrings.sol)\n\npragma solidity ^0.8.8;\n\nimport \"./StorageSlot.sol\";\n\n// | string | 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |\n// | length | 0x BB |\ntype ShortString is bytes32;\n\n/**\n * @dev This library provides functions to convert short memory strings\n * into a `ShortString` type that can be used as an immutable variable.\n *\n * Strings of arbitrary length can be optimized using this library if\n * they are short enough (up to 31 bytes) by packing them with their\n * length (1 byte) in a single EVM word (32 bytes). Additionally, a\n * fallback mechanism can be used for every other case.\n *\n * Usage example:\n *\n * ```solidity\n * contract Named {\n * using ShortStrings for *;\n *\n * ShortString private immutable _name;\n * string private _nameFallback;\n *\n * constructor(string memory contractName) {\n * _name = contractName.toShortStringWithFallback(_nameFallback);\n * }\n *\n * function name() external view returns (string memory) {\n * return _name.toStringWithFallback(_nameFallback);\n * }\n * }\n * ```\n */\nlibrary ShortStrings {\n // Used as an identifier for strings longer than 31 bytes.\n bytes32 private constant _FALLBACK_SENTINEL = 0x00000000000000000000000000000000000000000000000000000000000000FF;\n\n error StringTooLong(string str);\n error InvalidShortString();\n\n /**\n * @dev Encode a string of at most 31 chars into a `ShortString`.\n *\n * This will trigger a `StringTooLong` error is the input string is too long.\n */\n function toShortString(string memory str) internal pure returns (ShortString) {\n bytes memory bstr = bytes(str);\n if (bstr.length > 31) {\n revert StringTooLong(str);\n }\n return ShortString.wrap(bytes32(uint256(bytes32(bstr)) | bstr.length));\n }\n\n /**\n * @dev Decode a `ShortString` back to a \"normal\" string.\n */\n function toString(ShortString sstr) internal pure returns (string memory) {\n uint256 len = byteLength(sstr);\n // using `new string(len)` would work locally but is not memory safe.\n string memory str = new string(32);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(str, len)\n mstore(add(str, 0x20), sstr)\n }\n return str;\n }\n\n /**\n * @dev Return the length of a `ShortString`.\n */\n function byteLength(ShortString sstr) internal pure returns (uint256) {\n uint256 result = uint256(ShortString.unwrap(sstr)) & 0xFF;\n if (result > 31) {\n revert InvalidShortString();\n }\n return result;\n }\n\n /**\n * @dev Encode a string into a `ShortString`, or write it to storage if it is too long.\n */\n function toShortStringWithFallback(string memory value, string storage store) internal returns (ShortString) {\n if (bytes(value).length < 32) {\n return toShortString(value);\n } else {\n StorageSlot.getStringSlot(store).value = value;\n return ShortString.wrap(_FALLBACK_SENTINEL);\n }\n }\n\n /**\n * @dev Decode a string that was encoded to `ShortString` or written to storage using {setWithFallback}.\n */\n function toStringWithFallback(ShortString value, string storage store) internal pure returns (string memory) {\n if (ShortString.unwrap(value) != _FALLBACK_SENTINEL) {\n return toString(value);\n } else {\n return store;\n }\n }\n\n /**\n * @dev Return the length of a string that was encoded to `ShortString` or written to storage using {setWithFallback}.\n *\n * WARNING: This will return the \"byte length\" of the string. This may not reflect the actual length in terms of\n * actual characters as the UTF-8 encoding of a single character can span over multiple bytes.\n */\n function byteLengthWithFallback(ShortString value, string storage store) internal view returns (uint256) {\n if (ShortString.unwrap(value) != _FALLBACK_SENTINEL) {\n return byteLength(value);\n } else {\n return bytes(store).length;\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/StorageSlot.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n *\n * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._\n * _Available since v4.9 for `string`, `bytes`._\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n struct StringSlot {\n string value;\n }\n\n struct BytesSlot {\n bytes value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` with member `value` located at `slot`.\n */\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n */\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := store.slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` with member `value` located at `slot`.\n */\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n */\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := store.slot\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/Strings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toString(int256 value) internal pure returns (string memory) {\n return string(abi.encodePacked(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value))));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return keccak256(bytes(a)) == keccak256(bytes(b));\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.sol\";\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV // Deprecated in v4.8\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n /// @solidity memory-safe-assembly\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, \"\\x19Ethereum Signed Message:\\n32\")\n mstore(0x1c, hash)\n message := keccak256(0x00, 0x3c)\n }\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from `s`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n\", Strings.toString(s.length), s));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) {\n /// @solidity memory-safe-assembly\n assembly {\n let ptr := mload(0x40)\n mstore(ptr, \"\\x19\\x01\")\n mstore(add(ptr, 0x02), domainSeparator)\n mstore(add(ptr, 0x22), structHash)\n data := keccak256(ptr, 0x42)\n }\n }\n\n /**\n * @dev Returns an Ethereum Signed Data with intended validator, created from a\n * `validator` and `data` according to the version 0 of EIP-191.\n *\n * See {recover}.\n */\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x00\", validator, data));\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.8;\n\nimport \"./ECDSA.sol\";\nimport \"../ShortStrings.sol\";\nimport \"../../interfaces/IERC5267.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain\n * separator of the implementation contract. This will cause the `_domainSeparatorV4` function to always rebuild the\n * separator from the immutable values, which is cheaper than accessing a cached version in cold storage.\n *\n * _Available since v3.4._\n *\n * @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\n */\nabstract contract EIP712 is IERC5267 {\n using ShortStrings for *;\n\n bytes32 private constant _TYPE_HASH =\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\");\n\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _cachedDomainSeparator;\n uint256 private immutable _cachedChainId;\n address private immutable _cachedThis;\n\n bytes32 private immutable _hashedName;\n bytes32 private immutable _hashedVersion;\n\n ShortString private immutable _name;\n ShortString private immutable _version;\n string private _nameFallback;\n string private _versionFallback;\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n _name = name.toShortStringWithFallback(_nameFallback);\n _version = version.toShortStringWithFallback(_versionFallback);\n _hashedName = keccak256(bytes(name));\n _hashedVersion = keccak256(bytes(version));\n\n _cachedChainId = block.chainid;\n _cachedDomainSeparator = _buildDomainSeparator();\n _cachedThis = address(this);\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _cachedThis && block.chainid == _cachedChainId) {\n return _cachedDomainSeparator;\n } else {\n return _buildDomainSeparator();\n }\n }\n\n function _buildDomainSeparator() private view returns (bytes32) {\n return keccak256(abi.encode(_TYPE_HASH, _hashedName, _hashedVersion, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n\n /**\n * @dev See {EIP-5267}.\n *\n * _Available since v4.9._\n */\n function eip712Domain()\n public\n view\n virtual\n override\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n )\n {\n return (\n hex\"0f\", // 01111\n _name.toStringWithFallback(_nameFallback),\n _version.toStringWithFallback(_versionFallback),\n block.chainid,\n address(this),\n bytes32(0),\n new uint256[](0)\n );\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1, \"Math: mulDiv overflow\");\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10 ** 64) {\n value /= 10 ** 64;\n result += 64;\n }\n if (value >= 10 ** 32) {\n value /= 10 ** 32;\n result += 32;\n }\n if (value >= 10 ** 16) {\n value /= 10 ** 16;\n result += 16;\n }\n if (value >= 10 ** 8) {\n value /= 10 ** 8;\n result += 8;\n }\n if (value >= 10 ** 4) {\n value /= 10 ** 4;\n result += 4;\n }\n if (value >= 10 ** 2) {\n value /= 10 ** 2;\n result += 2;\n }\n if (value >= 10 ** 1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SafeCast.sol)\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n require(value <= type(uint248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n require(value <= type(uint240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n require(value <= type(uint232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.2._\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n require(value <= type(uint216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n require(value <= type(uint208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n require(value <= type(uint200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n require(value <= type(uint192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n require(value <= type(uint184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n require(value <= type(uint176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n require(value <= type(uint168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n require(value <= type(uint160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n require(value <= type(uint152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n require(value <= type(uint144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n require(value <= type(uint136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v2.5._\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n require(value <= type(uint120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n require(value <= type(uint112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n require(value <= type(uint104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.2._\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n require(value <= type(uint88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n require(value <= type(uint80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n require(value <= type(uint72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v2.5._\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n require(value <= type(uint56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n require(value <= type(uint48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n require(value <= type(uint40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v2.5._\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n require(value <= type(uint24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v2.5._\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v2.5._\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n *\n * _Available since v3.0._\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toInt248(int256 value) internal pure returns (int248 downcasted) {\n downcasted = int248(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 248 bits\");\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toInt240(int256 value) internal pure returns (int240 downcasted) {\n downcasted = int240(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 240 bits\");\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toInt232(int256 value) internal pure returns (int232 downcasted) {\n downcasted = int232(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 232 bits\");\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.7._\n */\n function toInt224(int256 value) internal pure returns (int224 downcasted) {\n downcasted = int224(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 224 bits\");\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toInt216(int256 value) internal pure returns (int216 downcasted) {\n downcasted = int216(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 216 bits\");\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toInt208(int256 value) internal pure returns (int208 downcasted) {\n downcasted = int208(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 208 bits\");\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toInt200(int256 value) internal pure returns (int200 downcasted) {\n downcasted = int200(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 200 bits\");\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toInt192(int256 value) internal pure returns (int192 downcasted) {\n downcasted = int192(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 192 bits\");\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toInt184(int256 value) internal pure returns (int184 downcasted) {\n downcasted = int184(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 184 bits\");\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toInt176(int256 value) internal pure returns (int176 downcasted) {\n downcasted = int176(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 176 bits\");\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toInt168(int256 value) internal pure returns (int168 downcasted) {\n downcasted = int168(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 168 bits\");\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toInt160(int256 value) internal pure returns (int160 downcasted) {\n downcasted = int160(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 160 bits\");\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toInt152(int256 value) internal pure returns (int152 downcasted) {\n downcasted = int152(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 152 bits\");\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toInt144(int256 value) internal pure returns (int144 downcasted) {\n downcasted = int144(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 144 bits\");\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toInt136(int256 value) internal pure returns (int136 downcasted) {\n downcasted = int136(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 136 bits\");\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128 downcasted) {\n downcasted = int128(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 128 bits\");\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toInt120(int256 value) internal pure returns (int120 downcasted) {\n downcasted = int120(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 120 bits\");\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toInt112(int256 value) internal pure returns (int112 downcasted) {\n downcasted = int112(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 112 bits\");\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toInt104(int256 value) internal pure returns (int104 downcasted) {\n downcasted = int104(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 104 bits\");\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.7._\n */\n function toInt96(int256 value) internal pure returns (int96 downcasted) {\n downcasted = int96(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 96 bits\");\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toInt88(int256 value) internal pure returns (int88 downcasted) {\n downcasted = int88(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 88 bits\");\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toInt80(int256 value) internal pure returns (int80 downcasted) {\n downcasted = int80(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 80 bits\");\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toInt72(int256 value) internal pure returns (int72 downcasted) {\n downcasted = int72(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 72 bits\");\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64 downcasted) {\n downcasted = int64(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 64 bits\");\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toInt56(int256 value) internal pure returns (int56 downcasted) {\n downcasted = int56(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 56 bits\");\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toInt48(int256 value) internal pure returns (int48 downcasted) {\n downcasted = int48(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 48 bits\");\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toInt40(int256 value) internal pure returns (int40 downcasted) {\n downcasted = int40(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 40 bits\");\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32 downcasted) {\n downcasted = int32(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 32 bits\");\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toInt24(int256 value) internal pure returns (int24 downcasted) {\n downcasted = int24(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 24 bits\");\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16 downcasted) {\n downcasted = int16(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 16 bits\");\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8 downcasted) {\n downcasted = int8(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 8 bits\");\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n *\n * _Available since v3.0._\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n /**\n * @dev Returns the largest of two signed numbers.\n */\n function max(int256 a, int256 b) internal pure returns (int256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two signed numbers.\n */\n function min(int256 a, int256 b) internal pure returns (int256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two signed numbers without overflow.\n * The result is rounded towards zero.\n */\n function average(int256 a, int256 b) internal pure returns (int256) {\n // Formula from the book \"Hacker's Delight\"\n int256 x = (a & b) + ((a ^ b) >> 1);\n return x + (int256(uint256(x) >> 255) & (a ^ b));\n }\n\n /**\n * @dev Returns the absolute unsigned value of a signed value.\n */\n function abs(int256 n) internal pure returns (uint256) {\n unchecked {\n // must be unchecked in order to support `n = type(int256).min`\n return uint256(n >= 0 ? n : -n);\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./OwnableUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership} and {acceptOwnership}.\n *\n * This module is used through inheritance. It will make available all functions\n * from parent (Ownable).\n */\nabstract contract Ownable2StepUpgradeable is Initializable, OwnableUpgradeable {\n function __Ownable2Step_init() internal onlyInitializing {\n __Ownable_init_unchained();\n }\n\n function __Ownable2Step_init_unchained() internal onlyInitializing {\n }\n address private _pendingOwner;\n\n event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Returns the address of the pending owner.\n */\n function pendingOwner() public view virtual returns (address) {\n return _pendingOwner;\n }\n\n /**\n * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual override onlyOwner {\n _pendingOwner = newOwner;\n emit OwnershipTransferStarted(owner(), newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual override {\n delete _pendingOwner;\n super._transferOwnership(newOwner);\n }\n\n /**\n * @dev The new owner accepts the ownership transfer.\n */\n function acceptOwnership() public virtual {\n address sender = _msgSender();\n require(pendingOwner() == sender, \"Ownable2Step: caller is not the new owner\");\n _transferOwnership(sender);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n function __Ownable_init() internal onlyInitializing {\n __Ownable_init_unchained();\n }\n\n function __Ownable_init_unchained() internal onlyInitializing {\n _transferOwnership(_msgSender());\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n * @custom:oz-retyped-from bool\n */\n uint8 private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint8 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts.\n *\n * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\n * constructor.\n *\n * Emits an {Initialized} event.\n */\n modifier initializer() {\n bool isTopLevelCall = !_initializing;\n require(\n (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\n \"Initializable: contract is already initialized\"\n );\n _initialized = 1;\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n * are added through upgrades and that require initialization.\n *\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n * cannot be nested. If one is invoked in the context of another, execution will revert.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n *\n * WARNING: setting the version to 255 will prevent any future reinitialization.\n *\n * Emits an {Initialized} event.\n */\n modifier reinitializer(uint8 version) {\n require(!_initializing && _initialized < version, \"Initializable: contract is already initialized\");\n _initialized = version;\n _initializing = true;\n _;\n _initializing = false;\n emit Initialized(version);\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n require(_initializing, \"Initializable: contract is not initializing\");\n _;\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n *\n * Emits an {Initialized} event the first time it is successfully executed.\n */\n function _disableInitializers() internal virtual {\n require(!_initializing, \"Initializable: contract is initializing\");\n if (_initialized != type(uint8).max) {\n _initialized = type(uint8).max;\n emit Initialized(type(uint8).max);\n }\n }\n\n /**\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\n */\n function _getInitializedVersion() internal view returns (uint8) {\n return _initialized;\n }\n\n /**\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n */\n function _isInitializing() internal view returns (bool) {\n return _initializing;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n *\n * Furthermore, `isContract` will also return true if the target contract within\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n * which only has an effect at the end of a transaction.\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal onlyInitializing {\n }\n\n function __Context_init_unchained() internal onlyInitializing {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[50] private __gap;\n}\n" + } + }, + "settings": { + "remappings": [ + "@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/", + "@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/", + "@rari-capital/solmate/=node_modules/@rari-capital/solmate/", + "forge-std/=node_modules/forge-std/src/", + "ds-test/=node_modules/ds-test/src/", + "hardhat-deploy/=node_modules/hardhat-deploy/", + "hardhat/=node_modules/hardhat/" + ], + "optimizer": { + "enabled": true, + "runs": 10000 + }, + "metadata": { + "useLiteralContent": false, + "bytecodeHash": "none" + }, + "outputSelection": { + "*": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + } + }, + "evmVersion": "london", + "viaIR": false, + "libraries": {} + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/sepolia/L1GovernanceToken.json b/packages/contracts/deployments/sepolia/L1GovernanceToken.json new file mode 100644 index 0000000000..90d01f5345 --- /dev/null +++ b/packages/contracts/deployments/sepolia/L1GovernanceToken.json @@ -0,0 +1,1272 @@ +{ + "address": "0x636E63F4ED43E396b2454560ab4E6a37581C6e90", + "abi": [ + { + "type": "constructor", + "inputs": [ + { + "name": "_bridge", + "type": "address", + "internalType": "address" + }, + { + "name": "_remoteToken", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "BRIDGE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "CLOCK_MODE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "DOMAIN_SEPARATOR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "REMOTE_TOKEN", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "acceptOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "allowance", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "spender", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "approve", + "inputs": [ + { + "name": "spender", + "type": "address", + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "balanceOf", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "burn", + "inputs": [ + { + "name": "_from", + "type": "address", + "internalType": "address" + }, + { + "name": "_amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "checkpoints", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + }, + { + "name": "pos", + "type": "uint32", + "internalType": "uint32" + } + ], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct ERC20Votes.Checkpoint", + "components": [ + { + "name": "fromBlock", + "type": "uint32", + "internalType": "uint32" + }, + { + "name": "votes", + "type": "uint224", + "internalType": "uint224" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "clock", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint48", + "internalType": "uint48" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "decimals", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint8", + "internalType": "uint8" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "decreaseAllowance", + "inputs": [ + { + "name": "spender", + "type": "address", + "internalType": "address" + }, + { + "name": "subtractedValue", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "delegate", + "inputs": [ + { + "name": "delegatee", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "delegateBySig", + "inputs": [ + { + "name": "delegatee", + "type": "address", + "internalType": "address" + }, + { + "name": "nonce", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "expiry", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "v", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "r", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "s", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "delegates", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "eip712Domain", + "inputs": [], + "outputs": [ + { + "name": "fields", + "type": "bytes1", + "internalType": "bytes1" + }, + { + "name": "name", + "type": "string", + "internalType": "string" + }, + { + "name": "version", + "type": "string", + "internalType": "string" + }, + { + "name": "chainId", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "verifyingContract", + "type": "address", + "internalType": "address" + }, + { + "name": "salt", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "extensions", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPastTotalSupply", + "inputs": [ + { + "name": "timepoint", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getPastVotes", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + }, + { + "name": "timepoint", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getVotes", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "increaseAllowance", + "inputs": [ + { + "name": "spender", + "type": "address", + "internalType": "address" + }, + { + "name": "addedValue", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "initialize", + "inputs": [ + { + "name": "_owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "mint", + "inputs": [ + { + "name": "_to", + "type": "address", + "internalType": "address" + }, + { + "name": "_amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "name", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "nonces", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "numCheckpoints", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint32", + "internalType": "uint32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "pendingOwner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "permit", + "inputs": [ + { + "name": "owner", + "type": "address", + "internalType": "address" + }, + { + "name": "spender", + "type": "address", + "internalType": "address" + }, + { + "name": "value", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "deadline", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "v", + "type": "uint8", + "internalType": "uint8" + }, + { + "name": "r", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "s", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "renounceOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "supportsInterface", + "inputs": [ + { + "name": "_interfaceId", + "type": "bytes4", + "internalType": "bytes4" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "symbol", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "totalSupply", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transfer", + "inputs": [ + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "transferFrom", + "inputs": [ + { + "name": "from", + "type": "address", + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "version", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "event", + "name": "Approval", + "inputs": [ + { + "name": "owner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "spender", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "value", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Burn", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "DelegateChanged", + "inputs": [ + { + "name": "delegator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "fromDelegate", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "toDelegate", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "DelegateVotesChanged", + "inputs": [ + { + "name": "delegate", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "previousBalance", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "newBalance", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "EIP712DomainChanged", + "inputs": [], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [ + { + "name": "version", + "type": "uint8", + "indexed": false, + "internalType": "uint8" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Mint", + "inputs": [ + { + "name": "account", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "amount", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferStarted", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Transfer", + "inputs": [ + { + "name": "from", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "to", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "value", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "InvalidShortString", + "inputs": [] + }, + { + "type": "error", + "name": "StringTooLong", + "inputs": [ + { + "name": "str", + "type": "string", + "internalType": "string" + } + ] + } + ], + "transactionHash": "0x7cb18ddb970e695480319e001ee00ae82ac0c86a6ae9d0d62177b071b2fbce8d", + "receipt": { + "to": null, + "from": "0xcc56801a72463d39903A4a4632E600289178F6bC", + "contractAddress": "0x636E63F4ED43E396b2454560ab4E6a37581C6e90", + "transactionIndex": 57, + "gasUsed": "2788963", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000008000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x4471af8c396b8a168f5f21c2da1a7f67e540d42d9e4fa20432a89074e992aa63", + "transactionHash": "0x7cb18ddb970e695480319e001ee00ae82ac0c86a6ae9d0d62177b071b2fbce8d", + "logs": [ + { + "transactionIndex": 57, + "blockNumber": 6243355, + "transactionHash": "0x7cb18ddb970e695480319e001ee00ae82ac0c86a6ae9d0d62177b071b2fbce8d", + "address": "0x636E63F4ED43E396b2454560ab4E6a37581C6e90", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", + "logIndex": 201, + "blockHash": "0x4471af8c396b8a168f5f21c2da1a7f67e540d42d9e4fa20432a89074e992aa63" + } + ], + "blockNumber": 6243355, + "cumulativeGasUsed": "10635391", + "status": 1, + "byzantium": true + }, + "args": [ + "0x38C9a0a694AA0f92c05238484C3a9bdE1e85ddE4", + "0x25500000d700bbE27104577CCcce8eAbCC96c8ad" + ], + "numDeployments": 1, + "solcInputHash": "1cc21f973aa4cfc73d832518987f54f8", + "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_bridge\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_remoteToken\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidShortString\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"str\",\"type\":\"string\"}],\"name\":\"StringTooLong\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Burn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"fromDelegate\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"toDelegate\",\"type\":\"address\"}],\"name\":\"DelegateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegate\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"previousBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"DelegateVotesChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EIP712DomainChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Mint\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BRIDGE\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"CLOCK_MODE\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"REMOTE_TOKEN\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"pos\",\"type\":\"uint32\"}],\"name\":\"checkpoints\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fromBlock\",\"type\":\"uint32\"},{\"internalType\":\"uint224\",\"name\":\"votes\",\"type\":\"uint224\"}],\"internalType\":\"struct ERC20Votes.Checkpoint\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"clock\",\"outputs\":[{\"internalType\":\"uint48\",\"name\":\"\",\"type\":\"uint48\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"delegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiry\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"delegateBySig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"delegates\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eip712Domain\",\"outputs\":[{\"internalType\":\"bytes1\",\"name\":\"fields\",\"type\":\"bytes1\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"verifyingContract\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"extensions\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"timepoint\",\"type\":\"uint256\"}],\"name\":\"getPastTotalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"timepoint\",\"type\":\"uint256\"}],\"name\":\"getPastVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"getVotes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"numCheckpoints\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"_interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"custom:proxied\":\"@title GovernanceToken\",\"kind\":\"dev\",\"methods\":{\"CLOCK_MODE()\":{\"details\":\"Description of the clock\"},\"DOMAIN_SEPARATOR()\":{\"details\":\"See {IERC20Permit-DOMAIN_SEPARATOR}.\"},\"acceptOwnership()\":{\"details\":\"The new owner accepts the ownership transfer.\"},\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"burn(address,uint256)\":{\"params\":{\"_amount\":\"Amount of tokens to burn.\",\"_from\":\"Address to burn tokens from.\"}},\"checkpoints(address,uint32)\":{\"details\":\"Get the `pos`-th checkpoint for `account`.\"},\"clock()\":{\"details\":\"Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting).\"},\"constructor\":{\"params\":{\"_bridge\":\"Address of the StandardBridge contract on this network.\",\"_remoteToken\":\"Address of the corresponding token on the remote chain.\"}},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"delegate(address)\":{\"details\":\"Delegate votes from the sender to `delegatee`.\"},\"delegateBySig(address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"Delegates votes from signer to `delegatee`\"},\"delegates(address)\":{\"details\":\"Get the address `account` is currently delegating to.\"},\"eip712Domain()\":{\"details\":\"See {EIP-5267}. _Available since v4.9._\"},\"getPastTotalSupply(uint256)\":{\"details\":\"Retrieve the `totalSupply` at the end of `timepoint`. Note, this value is the sum of all balances. It is NOT the sum of all the delegated votes! Requirements: - `timepoint` must be in the past\"},\"getPastVotes(address,uint256)\":{\"details\":\"Retrieve the number of votes for `account` at the end of `timepoint`. Requirements: - `timepoint` must be in the past\"},\"getVotes(address)\":{\"details\":\"Gets the current votes balance for `account`\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"initialize(address)\":{\"params\":{\"_owner\":\"The owner of this contract.\"}},\"mint(address,uint256)\":{\"params\":{\"_amount\":\"Amount of tokens to mint.\",\"_to\":\"Address to mint tokens to.\"}},\"name()\":{\"details\":\"Returns the name of the token.\"},\"nonces(address)\":{\"details\":\"See {IERC20Permit-nonces}.\"},\"numCheckpoints(address)\":{\"details\":\"Get number of checkpoints for `account`.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"pendingOwner()\":{\"details\":\"Returns the address of the pending owner.\"},\"permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\":{\"details\":\"See {IERC20Permit-permit}.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"supportsInterface(bytes4)\":{\"params\":{\"_interfaceId\":\"Interface ID to check.\"},\"returns\":{\"_0\":\"Whether or not the interface is supported by this contract.\"}},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"},\"transferOwnership(address)\":{\"details\":\"Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"events\":{\"Burn(address,uint256)\":{\"notice\":\"Emitted whenever tokens are burned from an account.\"},\"Mint(address,uint256)\":{\"notice\":\"Emitted whenever tokens are minted for an account.\"}},\"kind\":\"user\",\"methods\":{\"BRIDGE()\":{\"notice\":\"Address of the StandardBridge on this network.\"},\"REMOTE_TOKEN()\":{\"notice\":\"Address of the corresponding version of this token on the remote chain.\"},\"burn(address,uint256)\":{\"notice\":\"Allows the StandardBridge on this network to burn tokens.\"},\"constructor\":{\"notice\":\"Constructs the GovernanceToken contract.\"},\"initialize(address)\":{\"notice\":\"Initializer.\"},\"mint(address,uint256)\":{\"notice\":\"Allows StandardBridge or the owner to mint tokens.\"},\"supportsInterface(bytes4)\":{\"notice\":\"ERC165 interface check function.\"},\"version()\":{\"notice\":\"Semantic version.\"}},\"notice\":\"The KRO token used in governance, supporting voting and delegation. Implements EIP 2612 allowing signed approvals. `mint` function is only allowed to the owner or `Bridge`, and the total supply amount is minted at once (TGE). `Bridge` has the permission to `mint` and `burn`, for the purpose of bridging KRO to the remote chain.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/governance/GovernanceToken.sol\":\"GovernanceToken\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/\",\":@rari-capital/solmate/=node_modules/@rari-capital/solmate/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\",\":hardhat-deploy/=node_modules/hardhat-deploy/\",\":hardhat/=node_modules/hardhat/\"]},\"sources\":{\"contracts/governance/GovernanceToken.sol\":{\"keccak256\":\"0x98304239f5ca6cc0c68dedf47b31ec5ceaeb11fed78d007dc16afb72d6a152a5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6cffce351c0d797a1c46e2eb3355324c86693cd9d48cd291cc30f0badb1843b4\",\"dweb:/ipfs/QmajzzFw1GT51LH1VBKh378xxwSLXxs6erBvUVxzFVkeLj\"]},\"contracts/universal/IKromaMintableERC20.sol\":{\"keccak256\":\"0x1a95268117456ddb1e0a16eb2ba773b9540c7b8b9520e66d4d167ddc6ace6fcb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f93d2e6f5121a3dfe272e399d6774e0584d59a20c4f63db78e5a0b644d92fa59\",\"dweb:/ipfs/QmbwM7kCpmwZs348jCeNwF86H8SDBURsGCGCUCyoSS1ffy\"]},\"contracts/universal/ISemver.sol\":{\"keccak256\":\"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a\",\"dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR\"]},\"contracts/universal/KromaMintableERC20.sol\":{\"keccak256\":\"0x30dccac5fe2d7c75bbe1411004ad03c40afe6dce8c7d22a89abb783f74bd2674\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://de3f8062e170498d71069529cb83681b0acaeb41643892c092111b07df2895f6\",\"dweb:/ipfs/QmNsZa5vHYQ8eG3dQ7PjkfweXzxKc6nbDj9P455Mp1Waxx\"]},\"node_modules/@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\":{\"keccak256\":\"0x84efb8889801b0ac817324aff6acc691d07bbee816b671817132911d287a8c63\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ec6df2255fadc251ea905043c47bf55170ee6cb5d7ca8b5c8ed54c84eac9d09e\",\"dweb:/ipfs/QmaokWfuL59uarki5yoDGbPzh4cErzEfnAzfmesTNJNXE9\"]},\"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://99c8cb3cd19a44bbfb6612605affb7d8b06cee1f6aa9362a37a8672b4f7eeaf8\",\"dweb:/ipfs/QmasyxFDBUp7k5KFgfDWEzM8PYSKEq7GVznzMJ1VxVRF4B\"]},\"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f103ee2e4aecd37aac6ceefe670709cdd7613dee25fa2d4d9feaf7fc0aaa155e\",\"dweb:/ipfs/QmRiNZLoJk5k3HPMYGPGjZFd2ke1ZxjhJZkM45Ec9GH9hv\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://310136ad60820af4177a11a61d77a3686faf5fca4942b600e08fc940db38396b\",\"dweb:/ipfs/QmbCzMNSTL7Zi7M4UCSqBrkHtp4jjxUnGbkneCZKdR1qeq\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"keccak256\":\"0x1618ddebe73377660f6da71afcba35d5ac4c4600918b3a381d9c6f37eba613eb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://666c8d7c62478b55e082f1835275b7acfc1595491998df6d67183ff2c70eab96\",\"dweb:/ipfs/QmVXmnXfxNaLhoX283dqyKJ8DJbF5thUd9sMuRoFpNMwr7\"]},\"node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol\":{\"keccak256\":\"0xac6c2efc64baccbde4904ae18ed45139c9aa8cff96d6888344d1e4d2eb8b659f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6e416a280c610b6b7a5f158e4a41aacfaec01ef14d5d1de13b46be9e090265fc\",\"dweb:/ipfs/QmYZP2KrdyccBbhLZT42auhvBTMkwiwUS3V6HWb42rbwbG\"]},\"node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol\":{\"keccak256\":\"0xfc12b717f6a2cd0d67adc8700097d4464d37f18ce933d4fc9c948ab6aec35e80\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://82386e69ebe902a2edfd4f8a5ecbeaeb2e00f6cc6481a973729e974373fb492e\",\"dweb:/ipfs/QmSXg4wBMBd83mQvkekT1GsiRX2Qyv5gvrqzv5qJx2M7Kc\"]},\"node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol\":{\"keccak256\":\"0xcaea9aeda3816ba872358c828f4f01455c22ae48ced49c4c7d72bd74176c09b9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://16ff22d8df5aee94510ee43d361b6147caef164941a684cedcb75be44f351fe6\",\"dweb:/ipfs/QmaCCwMdHVdPApuEJHLZapSJyA7mp5dAugpma3VUzWGd8E\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0xa56ca923f70c1748830700250b19c61b70db9a683516dc5e216694a50445d99c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cac938788bc4be12101e59d45588b4e059579f4e61062e1cda8d6b06c0191b15\",\"dweb:/ipfs/QmV2JKCyjTVH3rkWNrfdJRhAT7tZ3usAN2XcnD4h53Mvih\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bd39944e8fc06be6dbe2dd1d8449b5336e23c6a7ba3e8e9ae5ae0f37f35283f5\",\"dweb:/ipfs/QmPV3FGYjVwvKSgAXKUN3r9T9GwniZz83CxBpM7vyj2G53\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol\":{\"keccak256\":\"0x36c00327e3f9afd929cc2721aaa111ab57eff78a630cc364b279ad576b899295\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f5bf927f4c8b71a5809be184c3107b915b0445ab2c4a33208331e5376692eb5a\",\"dweb:/ipfs/QmVXirsCY1sf4kodhbL6w3NWZkeZeaMuQB7M6DBAdZNqFE\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\":{\"keccak256\":\"0x4e560f86662b6f72ab76122fff53317677154f14bac4a80dbd46a54172b3abfa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ca5c2518d247417cb01164f04eff57b7e87b5346bc03478ada916f26117aa7fd\",\"dweb:/ipfs/QmVgK66XGZCiH9x4mhqejKUTujtu68DyE6KrYi6MPuaHRJ\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd\",\"dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\":{\"keccak256\":\"0xec63854014a5b4f2b3290ab9103a21bdf902a508d0f41a8573fea49e98bf571a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bc5b5dc12fbc4002f282eaa7a5f06d8310ed62c1c77c5770f6283e058454c39a\",\"dweb:/ipfs/Qme9rE2wS3yBuyJq9GgbmzbsBQsW2M2sVFqYYLw7bosGrv\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"node_modules/@openzeppelin/contracts/utils/Counters.sol\":{\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://59e1c62884d55b70f3ae5432b44bb3166ad71ae3acd19c57ab6ddc3c87c325ee\",\"dweb:/ipfs/QmezuXg5GK5oeA4F91EZhozBFekhq5TD966bHPH18cCqhu\"]},\"node_modules/@openzeppelin/contracts/utils/ShortStrings.sol\":{\"keccak256\":\"0xc0e310c163edf15db45d4ff938113ab357f94fa86e61ea8e790853c4d2e13256\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://04db5bc05dcb05ba1f6ca2dfbead17adc8a2e2f911aa80b05e7a36d9eaf96516\",\"dweb:/ipfs/QmVkfHZbXVBUPsTopueCn3qGJX8aEjahFF3Fn4NcygLNm5\"]},\"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xf09e68aa0dc6722a25bc46490e8d48ed864466d17313b8a0b254c36b54e49899\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e26daf81e2252dc1fe1ce0e4b55c2eb7c6d1ee84ae6558d1a9554432ea1d32da\",\"dweb:/ipfs/Qmb1UANWiWq5pCKbmHSu772hd4nt374dVaghGmwSVNuk8Q\"]},\"node_modules/@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b81d9ff6559ea5c47fc573e17ece6d9ba5d6839e213e6ebc3b4c5c8fe4199d7f\",\"dweb:/ipfs/QmPCW1bFisUzJkyjroY3yipwfism9RRCigCcK1hbXtVM8n\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0x809bc3edb4bcbef8263fa616c1b60ee0004b50a8a1bfa164d8f57fd31f520c58\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8b93a1e39a4a19eba1600b92c96f435442db88cac91e315c8291547a2a7bcfe2\",\"dweb:/ipfs/QmTm34KVe6uZBZwq8dZDNWwPcm24qBJdxqL3rPxBJ4LrMv\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol\":{\"keccak256\":\"0x8432884527a7ad91e6eed1cfc5a0811ae2073e5bca107bd0ca442e9236b03dbd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e3aa0eadab7aafcf91a95684765f778f64386f0368de88522ce873c21385278a\",\"dweb:/ipfs/QmPfaVAqWgH1QsT3dHVuL6jwMZbVKdoP8w1PvpiPT2FPWd\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f\",\"dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy\"]},\"node_modules/@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cc8841b3cd48ad125e2f46323c8bad3aa0e88e399ec62acb9e57efa7e7c8058c\",\"dweb:/ipfs/QmSqE4mXHA2BXW58deDbXE8MTcsL5JSKNDbm23sVQxRLPS\"]},\"node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x52a8cfb0f5239d11b457dcdd1b326992ef672714ca8da71a157255bddd13f3ad\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://495145362c7ff1c9ca88c58bbbbcb412e3c2004406647412394486552ff6c278\",\"dweb:/ipfs/QmNNCeng6d5eRPDn6tkWSQhjE39XWfQEfjA63rRwHmr1iH\"]},\"node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c50fcc459e49a9858b6d8ad5f911295cb7c9ab57567845a250bf0153f84a95c7\",\"dweb:/ipfs/QmcEW85JRzvDkQggxiBBLVAasXWdkhEysqypj9EaB6H2g6\"]}},\"version\":1}", + "bytecode": "0x6101a06040523480156200001257600080fd5b506040516200369838038062003698833981016040819052620000359162000321565b604051806040016040528060058152602001644b726f6d6160d81b81525080604051806040016040528060018152602001603160f81b8152508484604051806020016040528060008152506040518060200160405280600081525081818160039081620000a39190620003fe565b506004620000b28282620003fe565b505050506001600160a01b03918216608052501660a052620000e2826005620001ac602090811b620012fb17901c565b61016052620000ff816006620001ac602090811b620012fb17901c565b61018052815160208084019190912061012052815190820120610140524660e0526200018f6101205161014051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b60c0525050306101005250620001a4620001fc565b505062000547565b6000602083511015620001cc57620001c483620002be565b9050620001f6565b82620001e3836200030160201b6200132c1760201c565b90620001f09082620003fe565b5060ff90505b92915050565b600c54610100900460ff16156200026a5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b60648201526084015b60405180910390fd5b600c5460ff90811614620002bc57600c805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b600080829050601f81511115620002ec578260405163305a27a960e01b8152600401620002619190620004ca565b8051620002f98262000522565b179392505050565b90565b80516001600160a01b03811681146200031c57600080fd5b919050565b600080604083850312156200033557600080fd5b620003408362000304565b9150620003506020840162000304565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200038457607f821691505b602082108103620003a557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003f957600081815260208120601f850160051c81016020861015620003d45750805b601f850160051c820191505b81811015620003f557828155600101620003e0565b5050505b505050565b81516001600160401b038111156200041a576200041a62000359565b62000432816200042b84546200036f565b84620003ab565b602080601f8311600181146200046a5760008415620004515750858301515b600019600386901b1c1916600185901b178555620003f5565b600085815260208120601f198616915b828110156200049b578886015182559484019460019091019084016200047a565b5085821015620004ba5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208083528351808285015260005b81811015620004f957858101830151858201604001528201620004db565b818111156200050c576000604083870101525b50601f01601f1916929092016040019392505050565b80516020808301519190811015620003a55760001960209190910360031b1b16919050565b60805160a05160c05160e05161010051610120516101405161016051610180516130d2620005c66000396000610ad001526000610aa5015260006117e6015260006117be01526000611719015260006117430152600061176d0152600081816106110152818161085d0152610c69015260006102a901526130d26000f3fe608060405234801561001057600080fd5b50600436106102775760003560e01c806379ba509711610160578063a457c2d7116100d8578063dd62ed3e1161008c578063ee9a31a211610071578063ee9a31a21461060c578063f1127ed814610633578063f2fde38b1461068557600080fd5b8063dd62ed3e146105c2578063e30c3978146105fb57600080fd5b8063c3cda520116100bd578063c3cda52014610589578063c4d66de81461059c578063d505accf146105af57600080fd5b8063a457c2d714610563578063a9059cbb1461057657600080fd5b80638e539e8c1161012f57806395d89b411161011457806395d89b41146105045780639ab24eb01461053d5780639dc29fac1461055057600080fd5b80638e539e8c146104d257806391ddadf4146104e557600080fd5b806379ba50971461048b5780637ecebe001461049357806384b0196e146104a65780638da5cb5b146104c157600080fd5b80633a46b1a8116101f3578063587cde1e116101c25780636fcfff45116101a75780636fcfff451461043257806370a082311461045a578063715018a61461048357600080fd5b8063587cde1e146103f35780635c19a95c1461041f57600080fd5b80633a46b1a81461038757806340c10f191461039a5780634bf5d7e9146103af57806354fd4d50146103b757600080fd5b806318160ddd1161024a578063313ce5671161022f578063313ce5671461035d5780633644e5151461036c578063395093511461037457600080fd5b806318160ddd1461033857806323b872dd1461034a57600080fd5b806301ffc9a71461027c578063033964be146102a457806306fdde03146102e3578063095ea7b314610325575b600080fd5b61028f61028a366004612a65565b610698565b60405190151581526020015b60405180910390f35b6102cb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161029b565b60408051808201909152600581527f4b726f6d6100000000000000000000000000000000000000000000000000000060208201525b60405161029b9190612b12565b61028f610333366004612b41565b610738565b6002545b60405190815260200161029b565b61028f610358366004612b6b565b610752565b6040516012815260200161029b565b61033c610776565b61028f610382366004612b41565b610785565b61033c610395366004612b41565b6107c4565b6103ad6103a8366004612b41565b610852565b005b610318610913565b6103186040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6102cb610401366004612ba7565b6001600160a01b039081166000908152600960205260409020541690565b6103ad61042d366004612ba7565b6109ab565b610445610440366004612ba7565b6109b8565b60405163ffffffff909116815260200161029b565b61033c610468366004612ba7565b6001600160a01b031660009081526020819052604090205490565b6103ad6109da565b6103ad6109ee565b61033c6104a1366004612ba7565b610a79565b6104ae610a97565b60405161029b9796959493929190612bc2565b603f546001600160a01b03166102cb565b61033c6104e0366004612c74565b610b3c565b6104ed610ba7565b60405165ffffffffffff909116815260200161029b565b60408051808201909152600381527f4b524f00000000000000000000000000000000000000000000000000000000006020820152610318565b61033c61054b366004612ba7565b610bb2565b6103ad61055e366004612b41565b610c5e565b61028f610571366004612b41565b610d06565b61028f610584366004612b41565b610db0565b6103ad610597366004612c9e565b610dbe565b6103ad6105aa366004612ba7565b610ef4565b6103ad6105bd366004612cf6565b611075565b61033c6105d0366004612d60565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6071546001600160a01b03166102cb565b6102cb7f000000000000000000000000000000000000000000000000000000000000000081565b610646610641366004612d93565b6111d9565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16928101929092520161029b565b6103ad610693366004612ba7565b611272565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f30a0c5a9000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000841682148061073057507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b60003361074681858561132f565b60019150505b92915050565b600033610760858285611487565b61076b858585611519565b506001949350505050565b600061078061170c565b905090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919061074690829086906107bf908790612e02565b61132f565b60006107ce610ba7565b65ffffffffffff1682106108295760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20667574757265206c6f6f6b75700000000000000060448201526064015b60405180910390fd5b6001600160a01b0383166000908152600a6020526040902061084b9083611837565b9392505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108935750603f546001600160a01b031633145b6109055760405162461bcd60e51b815260206004820152602e60248201527f476f7665726e616e6365546f6b656e3a206f6e6c7920627269646765206f722060448201527f6f776e65722063616e206d696e740000000000000000000000000000000000006064820152608401610820565b61090f828261194a565b5050565b60604361091e610ba7565b65ffffffffffff16146109735760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a2062726f6b656e20636c6f636b206d6f64650000006044820152606401610820565b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b6109b5338261199b565b50565b6001600160a01b0381166000908152600a602052604081205461074c90611a2c565b6109e2611aac565b6109ec6000611b06565b565b60715433906001600160a01b03168114610a705760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610820565b6109b581611b06565b6001600160a01b03811660009081526007602052604081205461074c565b600060608082808083610acb7f00000000000000000000000000000000000000000000000000000000000000006005611b37565b610af67f00000000000000000000000000000000000000000000000000000000000000006006611b37565b604080516000808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6000610b46610ba7565b65ffffffffffff168210610b9c5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20667574757265206c6f6f6b7570000000000000006044820152606401610820565b61074c600b83611837565b600061078043611bdb565b6001600160a01b0381166000908152600a60205260408120548015610c36576001600160a01b0383166000908152600a6020526040902080546000198301908110610bff57610bff612e49565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610c39565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cfc5760405162461bcd60e51b815260206004820152603160248201527f4b726f6d614d696e7461626c6545524332303a206f6e6c79206272696467652060448201527f63616e206d696e7420616e64206275726e0000000000000000000000000000006064820152608401610820565b61090f8282611c59565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919083811015610da35760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610820565b61076b828686840361132f565b600033610746818585611519565b83421115610e0e5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610820565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610e8890610e809060a00160405160208183030381529060405280519060200120611c9e565b858585611ce6565b9050610e9381611d0e565b8614610ee15760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610820565b610eeb818861199b565b50505050505050565b600c54610100900460ff1615808015610f145750600c54600160ff909116105b80610f2e5750303b158015610f2e5750600c5460ff166001145b610fa05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610820565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610ffe57600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b611006611d36565b61100f82611272565b801561090f57600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b834211156110c55760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610820565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886110f48c611d0e565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061114f82611c9e565b9050600061115f82878787611ce6565b9050896001600160a01b0316816001600160a01b0316146111c25760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610820565b6111cd8a8a8a61132f565b50505050505050505050565b60408051808201909152600080825260208201526001600160a01b0383166000908152600a60205260409020805463ffffffff841690811061121d5761121d612e49565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b61127a611aac565b607180546001600160a01b0383167fffffffffffffffffffffffff000000000000000000000000000000000000000090911681179091556112c3603f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60006020835110156113175761131083611dbb565b905061074c565b816113228482612f13565b5060ff905061074c565b90565b6001600160a01b0383166113aa5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166114265760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461151357818110156115065760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610820565b611513848484840361132f565b50505050565b6001600160a01b0383166115955760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166116115760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b038316600090815260208190526040902054818110156116a05760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611513848484611e17565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561176557507f000000000000000000000000000000000000000000000000000000000000000046145b1561178f57507f000000000000000000000000000000000000000000000000000000000000000090565b610780604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b81546000908181600581111561189157600061185284611e22565b61185c9085612ff1565b600088815260209020909150869082015463ffffffff1611156118815780915061188f565b61188c816001612e02565b92505b505b808210156118de5760006118a58383611f0a565b600088815260209020909150869082015463ffffffff1611156118ca578091506118d8565b6118d5816001612e02565b92505b50611891565b801561191f576000868152602090208101600019015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611922565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169695505050505050565b6119548282611f25565b816001600160a01b03167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161198f91815260200190565b60405180910390a25050565b6001600160a01b038281166000818152600960208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611513828483611fd1565b600063ffffffff821115611aa85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610820565b5090565b603f546001600160a01b031633146109ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610820565b607180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556109b58161210e565b606060ff8314611b4a5761131083612178565b818054611b5690612e78565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8290612e78565b8015611bcf5780601f10611ba457610100808354040283529160200191611bcf565b820191906000526020600020905b815481529060010190602001808311611bb257829003601f168201915b5050505050905061074c565b600065ffffffffffff821115611aa85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201527f38206269747300000000000000000000000000000000000000000000000000006064820152608401610820565b611c6382826121b7565b816001600160a01b03167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161198f91815260200190565b600061074c611cab61170c565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6000806000611cf7878787876121cf565b91509150611d04816122b1565b5095945050505050565b6001600160a01b03811660009081526007602052604090208054600181018255905b50919050565b600c54610100900460ff16611db35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610820565b6109ec612416565b600080829050601f81511115611dff57826040517f305a27a90000000000000000000000000000000000000000000000000000000081526004016108209190612b12565b8051611e0a82613008565b179392505050565b505050565b611e1283838361249c565b600081600003611e3457506000919050565b60006001611e41846124ce565b901c6001901b90506001818481611e5a57611e5a61302c565b048201901c90506001818481611e7257611e7261302c565b048201901c90506001818481611e8a57611e8a61302c565b048201901c90506001818481611ea257611ea261302c565b048201901c90506001818481611eba57611eba61302c565b048201901c90506001818481611ed257611ed261302c565b048201901c90506001818481611eea57611eea61302c565b048201901c905061084b81828581611f0457611f0461302c565b04612562565b6000611f19600284841861305b565b61084b90848416612e02565b611f2f8282612578565b6002547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1015611fc35760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610820565b611513600b61263f8361264b565b816001600160a01b0316836001600160a01b031614158015611ff35750600081115b15611e12576001600160a01b03831615612081576001600160a01b0383166000908152600a60205260408120819061202e906128148561264b565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612076929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611e12576001600160a01b0382166000908152600a6020526040812081906120b79061263f8561264b565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516120ff929190918252602082015260400190565b60405180910390a25050505050565b603f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060600061218583612820565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b6121c18282612861565b611513600b6128148361264b565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561220657506000905060036122a8565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561225a573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b0381166122a1576000600192509250506122a8565b9150600090505b94509492505050565b60008160048111156122c5576122c5613096565b036122cd5750565b60018160048111156122e1576122e1613096565b0361232e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610820565b600281600481111561234257612342613096565b0361238f5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610820565b60038160048111156123a3576123a3613096565b036109b55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610820565b600c54610100900460ff166124935760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610820565b6109ec33611b06565b6001600160a01b03838116600090815260096020526040808220548584168352912054611e1292918216911683611fd1565b600080608083901c156124e357608092831c92015b604083901c156124f557604092831c92015b602083901c1561250757602092831c92015b601083901c1561251957601092831c92015b600883901c1561252b57600892831c92015b600483901c1561253d57600492831c92015b600283901c1561254f57600292831c92015b600183901c1561074c5760010192915050565b6000818310612571578161084b565b5090919050565b6001600160a01b0382166125ce5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610820565b80600260008282546125e09190612e02565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361090f60008383611e17565b600061084b8284612e02565b825460009081908181156126ad5760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660208201526126c2565b60408051808201909152600080825260208201525b905080602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1693506126f784868863ffffffff16565b9250600082118015612721575061270c610ba7565b65ffffffffffff16816000015163ffffffff16145b1561277b5761272f836129d1565b60008881526020902083016000190180547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092166401000000000263ffffffff90921691909117905561280a565b86604051806040016040528061279f612792610ba7565b65ffffffffffff16611a2c565b63ffffffff1681526020016127b3866129d1565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b600061084b8284612ff1565b600060ff8216601f81111561074c576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166128dd5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166000908152602081905260409020548181101561296c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611e1283600084611e17565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821115611aa85760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610820565b600060208284031215612a7757600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461084b57600080fd5b6000815180845260005b81811015612acd57602081850181015186830182015201612ab1565b81811115612adf576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061084b6020830184612aa7565b80356001600160a01b0381168114612b3c57600080fd5b919050565b60008060408385031215612b5457600080fd5b612b5d83612b25565b946020939093013593505050565b600080600060608486031215612b8057600080fd5b612b8984612b25565b9250612b9760208501612b25565b9150604084013590509250925092565b600060208284031215612bb957600080fd5b61084b82612b25565b7fff00000000000000000000000000000000000000000000000000000000000000881681526000602060e081840152612bfe60e084018a612aa7565b8381036040850152612c10818a612aa7565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b81811015612c6257835183529284019291840191600101612c46565b50909c9b505050505050505050505050565b600060208284031215612c8657600080fd5b5035919050565b803560ff81168114612b3c57600080fd5b60008060008060008060c08789031215612cb757600080fd5b612cc087612b25565b95506020870135945060408701359350612cdc60608801612c8d565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a031215612d1157600080fd5b612d1a88612b25565b9650612d2860208901612b25565b95506040880135945060608801359350612d4460808901612c8d565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612d7357600080fd5b612d7c83612b25565b9150612d8a60208401612b25565b90509250929050565b60008060408385031215612da657600080fd5b612daf83612b25565b9150602083013563ffffffff81168114612dc857600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612e1557612e15612dd3565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c90821680612e8c57607f821691505b602082108103611d30577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f821115611e1257600081815260208120601f850160051c81016020861015612eec5750805b601f850160051c820191505b81811015612f0b57828155600101612ef8565b505050505050565b815167ffffffffffffffff811115612f2d57612f2d612e1a565b612f4181612f3b8454612e78565b84612ec5565b602080601f831160018114612f765760008415612f5e5750858301515b600019600386901b1c1916600185901b178555612f0b565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015612fc357888601518255948401946001909101908401612fa4565b5085821015612fe15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008282101561300357613003612dd3565b500390565b80516020808301519190811015611d305760001960209190910360031b1b16919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613091577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102775760003560e01c806379ba509711610160578063a457c2d7116100d8578063dd62ed3e1161008c578063ee9a31a211610071578063ee9a31a21461060c578063f1127ed814610633578063f2fde38b1461068557600080fd5b8063dd62ed3e146105c2578063e30c3978146105fb57600080fd5b8063c3cda520116100bd578063c3cda52014610589578063c4d66de81461059c578063d505accf146105af57600080fd5b8063a457c2d714610563578063a9059cbb1461057657600080fd5b80638e539e8c1161012f57806395d89b411161011457806395d89b41146105045780639ab24eb01461053d5780639dc29fac1461055057600080fd5b80638e539e8c146104d257806391ddadf4146104e557600080fd5b806379ba50971461048b5780637ecebe001461049357806384b0196e146104a65780638da5cb5b146104c157600080fd5b80633a46b1a8116101f3578063587cde1e116101c25780636fcfff45116101a75780636fcfff451461043257806370a082311461045a578063715018a61461048357600080fd5b8063587cde1e146103f35780635c19a95c1461041f57600080fd5b80633a46b1a81461038757806340c10f191461039a5780634bf5d7e9146103af57806354fd4d50146103b757600080fd5b806318160ddd1161024a578063313ce5671161022f578063313ce5671461035d5780633644e5151461036c578063395093511461037457600080fd5b806318160ddd1461033857806323b872dd1461034a57600080fd5b806301ffc9a71461027c578063033964be146102a457806306fdde03146102e3578063095ea7b314610325575b600080fd5b61028f61028a366004612a65565b610698565b60405190151581526020015b60405180910390f35b6102cb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161029b565b60408051808201909152600581527f4b726f6d6100000000000000000000000000000000000000000000000000000060208201525b60405161029b9190612b12565b61028f610333366004612b41565b610738565b6002545b60405190815260200161029b565b61028f610358366004612b6b565b610752565b6040516012815260200161029b565b61033c610776565b61028f610382366004612b41565b610785565b61033c610395366004612b41565b6107c4565b6103ad6103a8366004612b41565b610852565b005b610318610913565b6103186040518060400160405280600581526020017f312e302e3000000000000000000000000000000000000000000000000000000081525081565b6102cb610401366004612ba7565b6001600160a01b039081166000908152600960205260409020541690565b6103ad61042d366004612ba7565b6109ab565b610445610440366004612ba7565b6109b8565b60405163ffffffff909116815260200161029b565b61033c610468366004612ba7565b6001600160a01b031660009081526020819052604090205490565b6103ad6109da565b6103ad6109ee565b61033c6104a1366004612ba7565b610a79565b6104ae610a97565b60405161029b9796959493929190612bc2565b603f546001600160a01b03166102cb565b61033c6104e0366004612c74565b610b3c565b6104ed610ba7565b60405165ffffffffffff909116815260200161029b565b60408051808201909152600381527f4b524f00000000000000000000000000000000000000000000000000000000006020820152610318565b61033c61054b366004612ba7565b610bb2565b6103ad61055e366004612b41565b610c5e565b61028f610571366004612b41565b610d06565b61028f610584366004612b41565b610db0565b6103ad610597366004612c9e565b610dbe565b6103ad6105aa366004612ba7565b610ef4565b6103ad6105bd366004612cf6565b611075565b61033c6105d0366004612d60565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6071546001600160a01b03166102cb565b6102cb7f000000000000000000000000000000000000000000000000000000000000000081565b610646610641366004612d93565b6111d9565b60408051825163ffffffff1681526020928301517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16928101929092520161029b565b6103ad610693366004612ba7565b611272565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007f30a0c5a9000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000841682148061073057507fffffffff00000000000000000000000000000000000000000000000000000000848116908216145b949350505050565b60003361074681858561132f565b60019150505b92915050565b600033610760858285611487565b61076b858585611519565b506001949350505050565b600061078061170c565b905090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919061074690829086906107bf908790612e02565b61132f565b60006107ce610ba7565b65ffffffffffff1682106108295760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20667574757265206c6f6f6b75700000000000000060448201526064015b60405180910390fd5b6001600160a01b0383166000908152600a6020526040902061084b9083611837565b9392505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806108935750603f546001600160a01b031633145b6109055760405162461bcd60e51b815260206004820152602e60248201527f476f7665726e616e6365546f6b656e3a206f6e6c7920627269646765206f722060448201527f6f776e65722063616e206d696e740000000000000000000000000000000000006064820152608401610820565b61090f828261194a565b5050565b60604361091e610ba7565b65ffffffffffff16146109735760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a2062726f6b656e20636c6f636b206d6f64650000006044820152606401610820565b5060408051808201909152601d81527f6d6f64653d626c6f636b6e756d6265722666726f6d3d64656661756c74000000602082015290565b6109b5338261199b565b50565b6001600160a01b0381166000908152600a602052604081205461074c90611a2c565b6109e2611aac565b6109ec6000611b06565b565b60715433906001600160a01b03168114610a705760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610820565b6109b581611b06565b6001600160a01b03811660009081526007602052604081205461074c565b600060608082808083610acb7f00000000000000000000000000000000000000000000000000000000000000006005611b37565b610af67f00000000000000000000000000000000000000000000000000000000000000006006611b37565b604080516000808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6000610b46610ba7565b65ffffffffffff168210610b9c5760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20667574757265206c6f6f6b7570000000000000006044820152606401610820565b61074c600b83611837565b600061078043611bdb565b6001600160a01b0381166000908152600a60205260408120548015610c36576001600160a01b0383166000908152600a6020526040902080546000198301908110610bff57610bff612e49565b60009182526020909120015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610c39565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169392505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cfc5760405162461bcd60e51b815260206004820152603160248201527f4b726f6d614d696e7461626c6545524332303a206f6e6c79206272696467652060448201527f63616e206d696e7420616e64206275726e0000000000000000000000000000006064820152608401610820565b61090f8282611c59565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919083811015610da35760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610820565b61076b828686840361132f565b600033610746818585611519565b83421115610e0e5760405162461bcd60e51b815260206004820152601d60248201527f4552433230566f7465733a207369676e617475726520657870697265640000006044820152606401610820565b604080517fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60208201526001600160a01b038816918101919091526060810186905260808101859052600090610e8890610e809060a00160405160208183030381529060405280519060200120611c9e565b858585611ce6565b9050610e9381611d0e565b8614610ee15760405162461bcd60e51b815260206004820152601960248201527f4552433230566f7465733a20696e76616c6964206e6f6e6365000000000000006044820152606401610820565b610eeb818861199b565b50505050505050565b600c54610100900460ff1615808015610f145750600c54600160ff909116105b80610f2e5750303b158015610f2e5750600c5460ff166001145b610fa05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610820565b600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610ffe57600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b611006611d36565b61100f82611272565b801561090f57600c80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050565b834211156110c55760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610820565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98888886110f48c611d0e565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e001604051602081830303815290604052805190602001209050600061114f82611c9e565b9050600061115f82878787611ce6565b9050896001600160a01b0316816001600160a01b0316146111c25760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610820565b6111cd8a8a8a61132f565b50505050505050505050565b60408051808201909152600080825260208201526001600160a01b0383166000908152600a60205260409020805463ffffffff841690811061121d5761121d612e49565b60009182526020918290206040805180820190915291015463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16918101919091529392505050565b61127a611aac565b607180546001600160a01b0383167fffffffffffffffffffffffff000000000000000000000000000000000000000090911681179091556112c3603f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b60006020835110156113175761131083611dbb565b905061074c565b816113228482612f13565b5060ff905061074c565b90565b6001600160a01b0383166113aa5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166114265760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461151357818110156115065760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610820565b611513848484840361132f565b50505050565b6001600160a01b0383166115955760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166116115760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b038316600090815260208190526040902054818110156116a05760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611513848484611e17565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561176557507f000000000000000000000000000000000000000000000000000000000000000046145b1561178f57507f000000000000000000000000000000000000000000000000000000000000000090565b610780604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a082015260009060c00160405160208183030381529060405280519060200120905090565b81546000908181600581111561189157600061185284611e22565b61185c9085612ff1565b600088815260209020909150869082015463ffffffff1611156118815780915061188f565b61188c816001612e02565b92505b505b808210156118de5760006118a58383611f0a565b600088815260209020909150869082015463ffffffff1611156118ca578091506118d8565b6118d5816001612e02565b92505b50611891565b801561191f576000868152602090208101600019015464010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611922565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169695505050505050565b6119548282611f25565b816001600160a01b03167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405161198f91815260200190565b60405180910390a25050565b6001600160a01b038281166000818152600960208181526040808420805485845282862054949093528787167fffffffffffffffffffffffff00000000000000000000000000000000000000008416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a4611513828483611fd1565b600063ffffffff821115611aa85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201527f32206269747300000000000000000000000000000000000000000000000000006064820152608401610820565b5090565b603f546001600160a01b031633146109ec5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610820565b607180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556109b58161210e565b606060ff8314611b4a5761131083612178565b818054611b5690612e78565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8290612e78565b8015611bcf5780601f10611ba457610100808354040283529160200191611bcf565b820191906000526020600020905b815481529060010190602001808311611bb257829003601f168201915b5050505050905061074c565b600065ffffffffffff821115611aa85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203460448201527f38206269747300000000000000000000000000000000000000000000000000006064820152608401610820565b611c6382826121b7565b816001600160a01b03167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58260405161198f91815260200190565b600061074c611cab61170c565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b6000806000611cf7878787876121cf565b91509150611d04816122b1565b5095945050505050565b6001600160a01b03811660009081526007602052604090208054600181018255905b50919050565b600c54610100900460ff16611db35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610820565b6109ec612416565b600080829050601f81511115611dff57826040517f305a27a90000000000000000000000000000000000000000000000000000000081526004016108209190612b12565b8051611e0a82613008565b179392505050565b505050565b611e1283838361249c565b600081600003611e3457506000919050565b60006001611e41846124ce565b901c6001901b90506001818481611e5a57611e5a61302c565b048201901c90506001818481611e7257611e7261302c565b048201901c90506001818481611e8a57611e8a61302c565b048201901c90506001818481611ea257611ea261302c565b048201901c90506001818481611eba57611eba61302c565b048201901c90506001818481611ed257611ed261302c565b048201901c90506001818481611eea57611eea61302c565b048201901c905061084b81828581611f0457611f0461302c565b04612562565b6000611f19600284841861305b565b61084b90848416612e02565b611f2f8282612578565b6002547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1015611fc35760405162461bcd60e51b815260206004820152603060248201527f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60448201527f766572666c6f77696e6720766f746573000000000000000000000000000000006064820152608401610820565b611513600b61263f8361264b565b816001600160a01b0316836001600160a01b031614158015611ff35750600081115b15611e12576001600160a01b03831615612081576001600160a01b0383166000908152600a60205260408120819061202e906128148561264b565b91509150846001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612076929190918252602082015260400190565b60405180910390a250505b6001600160a01b03821615611e12576001600160a01b0382166000908152600a6020526040812081906120b79061263f8561264b565b91509150836001600160a01b03167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a72483836040516120ff929190918252602082015260400190565b60405180910390a25050505050565b603f80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6060600061218583612820565b604080516020808252818301909252919250600091906020820181803683375050509182525060208101929092525090565b6121c18282612861565b611513600b6128148361264b565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561220657506000905060036122a8565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561225a573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001519150506001600160a01b0381166122a1576000600192509250506122a8565b9150600090505b94509492505050565b60008160048111156122c5576122c5613096565b036122cd5750565b60018160048111156122e1576122e1613096565b0361232e5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610820565b600281600481111561234257612342613096565b0361238f5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610820565b60038160048111156123a3576123a3613096565b036109b55760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610820565b600c54610100900460ff166124935760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610820565b6109ec33611b06565b6001600160a01b03838116600090815260096020526040808220548584168352912054611e1292918216911683611fd1565b600080608083901c156124e357608092831c92015b604083901c156124f557604092831c92015b602083901c1561250757602092831c92015b601083901c1561251957601092831c92015b600883901c1561252b57600892831c92015b600483901c1561253d57600492831c92015b600283901c1561254f57600292831c92015b600183901c1561074c5760010192915050565b6000818310612571578161084b565b5090919050565b6001600160a01b0382166125ce5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610820565b80600260008282546125e09190612e02565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a361090f60008383611e17565b600061084b8284612e02565b825460009081908181156126ad5760008781526020902082016000190160408051808201909152905463ffffffff8116825264010000000090047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660208201526126c2565b60408051808201909152600080825260208201525b905080602001517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1693506126f784868863ffffffff16565b9250600082118015612721575061270c610ba7565b65ffffffffffff16816000015163ffffffff16145b1561277b5761272f836129d1565b60008881526020902083016000190180547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092166401000000000263ffffffff90921691909117905561280a565b86604051806040016040528061279f612792610ba7565b65ffffffffffff16611a2c565b63ffffffff1681526020016127b3866129d1565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90811690915282546001810184556000938452602093849020835194909301519091166401000000000263ffffffff909316929092179101555b5050935093915050565b600061084b8284612ff1565b600060ff8216601f81111561074c576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166128dd5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0382166000908152602081905260409020548181101561296c5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152608401610820565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3611e1283600084611e17565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff821115611aa85760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201527f32342062697473000000000000000000000000000000000000000000000000006064820152608401610820565b600060208284031215612a7757600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461084b57600080fd5b6000815180845260005b81811015612acd57602081850181015186830182015201612ab1565b81811115612adf576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061084b6020830184612aa7565b80356001600160a01b0381168114612b3c57600080fd5b919050565b60008060408385031215612b5457600080fd5b612b5d83612b25565b946020939093013593505050565b600080600060608486031215612b8057600080fd5b612b8984612b25565b9250612b9760208501612b25565b9150604084013590509250925092565b600060208284031215612bb957600080fd5b61084b82612b25565b7fff00000000000000000000000000000000000000000000000000000000000000881681526000602060e081840152612bfe60e084018a612aa7565b8381036040850152612c10818a612aa7565b606085018990526001600160a01b038816608086015260a0850187905284810360c0860152855180825283870192509083019060005b81811015612c6257835183529284019291840191600101612c46565b50909c9b505050505050505050505050565b600060208284031215612c8657600080fd5b5035919050565b803560ff81168114612b3c57600080fd5b60008060008060008060c08789031215612cb757600080fd5b612cc087612b25565b95506020870135945060408701359350612cdc60608801612c8d565b92506080870135915060a087013590509295509295509295565b600080600080600080600060e0888a031215612d1157600080fd5b612d1a88612b25565b9650612d2860208901612b25565b95506040880135945060608801359350612d4460808901612c8d565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612d7357600080fd5b612d7c83612b25565b9150612d8a60208401612b25565b90509250929050565b60008060408385031215612da657600080fd5b612daf83612b25565b9150602083013563ffffffff81168114612dc857600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612e1557612e15612dd3565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600181811c90821680612e8c57607f821691505b602082108103611d30577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b601f821115611e1257600081815260208120601f850160051c81016020861015612eec5750805b601f850160051c820191505b81811015612f0b57828155600101612ef8565b505050505050565b815167ffffffffffffffff811115612f2d57612f2d612e1a565b612f4181612f3b8454612e78565b84612ec5565b602080601f831160018114612f765760008415612f5e5750858301515b600019600386901b1c1916600185901b178555612f0b565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015612fc357888601518255948401946001909101908401612fa4565b5085821015612fe15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008282101561300357613003612dd3565b500390565b80516020808301519190811015611d305760001960209190910360031b1b16919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613091577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c634300080f000a", + "devdoc": {}, + "userdoc": {}, + "storageLayout": { + "storage": [ + { + "astId": 1333, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_balances", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 1339, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_allowances", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_mapping(t_address,t_uint256))" + }, + { + "astId": 1341, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_totalSupply", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 1343, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_name", + "offset": 0, + "slot": "3", + "type": "t_string_storage" + }, + { + "astId": 1345, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_symbol", + "offset": 0, + "slot": "4", + "type": "t_string_storage" + }, + { + "astId": 3999, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_nameFallback", + "offset": 0, + "slot": "5", + "type": "t_string_storage" + }, + { + "astId": 4001, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_versionFallback", + "offset": 0, + "slot": "6", + "type": "t_string_storage" + }, + { + "astId": 2005, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_nonces", + "offset": 0, + "slot": "7", + "type": "t_mapping(t_address,t_struct(Counter)2977_storage)" + }, + { + "astId": 2013, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_PERMIT_TYPEHASH_DEPRECATED_SLOT", + "offset": 0, + "slot": "8", + "type": "t_bytes32" + }, + { + "astId": 2180, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_delegates", + "offset": 0, + "slot": "9", + "type": "t_mapping(t_address,t_address)" + }, + { + "astId": 2186, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_checkpoints", + "offset": 0, + "slot": "10", + "type": "t_mapping(t_address,t_array(t_struct(Checkpoint)2171_storage)dyn_storage)" + }, + { + "astId": 2190, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_totalSupplyCheckpoints", + "offset": 0, + "slot": "11", + "type": "t_array(t_struct(Checkpoint)2171_storage)dyn_storage" + }, + { + "astId": 656, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_initialized", + "offset": 0, + "slot": "12", + "type": "t_uint8" + }, + { + "astId": 659, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_initializing", + "offset": 1, + "slot": "12", + "type": "t_bool" + }, + { + "astId": 1189, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "__gap", + "offset": 0, + "slot": "13", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 528, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_owner", + "offset": 0, + "slot": "63", + "type": "t_address" + }, + { + "astId": 648, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "__gap", + "offset": 0, + "slot": "64", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 437, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_pendingOwner", + "offset": 0, + "slot": "113", + "type": "t_address" + }, + { + "astId": 516, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "__gap", + "offset": 0, + "slot": "114", + "type": "t_array(t_uint256)49_storage" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_struct(Checkpoint)2171_storage)dyn_storage": { + "encoding": "dynamic_array", + "label": "struct ERC20Votes.Checkpoint[]", + "numberOfBytes": "32", + "base": "t_struct(Checkpoint)2171_storage" + }, + "t_array(t_uint256)49_storage": { + "encoding": "inplace", + "label": "uint256[49]", + "numberOfBytes": "1568", + "base": "t_uint256" + }, + "t_array(t_uint256)50_storage": { + "encoding": "inplace", + "label": "uint256[50]", + "numberOfBytes": "1600", + "base": "t_uint256" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_address)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => address)", + "numberOfBytes": "32", + "value": "t_address" + }, + "t_mapping(t_address,t_array(t_struct(Checkpoint)2171_storage)dyn_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => struct ERC20Votes.Checkpoint[])", + "numberOfBytes": "32", + "value": "t_array(t_struct(Checkpoint)2171_storage)dyn_storage" + }, + "t_mapping(t_address,t_mapping(t_address,t_uint256))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => uint256))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_uint256)" + }, + "t_mapping(t_address,t_struct(Counter)2977_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => struct Counters.Counter)", + "numberOfBytes": "32", + "value": "t_struct(Counter)2977_storage" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(Checkpoint)2171_storage": { + "encoding": "inplace", + "label": "struct ERC20Votes.Checkpoint", + "numberOfBytes": "32", + "members": [ + { + "astId": 2168, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "fromBlock", + "offset": 0, + "slot": "0", + "type": "t_uint32" + }, + { + "astId": 2170, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "votes", + "offset": 4, + "slot": "0", + "type": "t_uint224" + } + ] + }, + "t_struct(Counter)2977_storage": { + "encoding": "inplace", + "label": "struct Counters.Counter", + "numberOfBytes": "32", + "members": [ + { + "astId": 2976, + "contract": "contracts/governance/GovernanceToken.sol:GovernanceToken", + "label": "_value", + "offset": 0, + "slot": "0", + "type": "t_uint256" + } + ] + }, + "t_uint224": { + "encoding": "inplace", + "label": "uint224", + "numberOfBytes": "28" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint32": { + "encoding": "inplace", + "label": "uint32", + "numberOfBytes": "4" + }, + "t_uint8": { + "encoding": "inplace", + "label": "uint8", + "numberOfBytes": "1" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/sepolia/L1GovernanceTokenProxy.json b/packages/contracts/deployments/sepolia/L1GovernanceTokenProxy.json new file mode 100644 index 0000000000..c62ea0fc6d --- /dev/null +++ b/packages/contracts/deployments/sepolia/L1GovernanceTokenProxy.json @@ -0,0 +1,152 @@ +{ + "address": "0x25500000d700bbE27104577CCcce8eAbCC96c8ad", + "abi": [ + { + "type": "constructor", + "payable": false, + "inputs": [ + { + "type": "address", + "name": "_admin" + } + ] + }, + { + "type": "function", + "name": "admin", + "constant": false, + "payable": false, + "inputs": [], + "outputs": [ + { + "type": "address" + } + ] + }, + { + "type": "function", + "name": "changeAdmin", + "constant": false, + "payable": false, + "inputs": [ + { + "type": "address", + "name": "_admin" + } + ], + "outputs": [] + }, + { + "type": "function", + "name": "implementation", + "constant": false, + "payable": false, + "inputs": [], + "outputs": [ + { + "type": "address" + } + ] + }, + { + "type": "function", + "name": "upgradeTo", + "constant": false, + "payable": false, + "inputs": [ + { + "type": "address", + "name": "_implementation" + } + ], + "outputs": [] + }, + { + "type": "function", + "name": "upgradeToAndCall", + "constant": false, + "stateMutability": "payable", + "payable": true, + "inputs": [ + { + "type": "address", + "name": "_implementation" + }, + { + "type": "bytes", + "name": "_data" + } + ], + "outputs": [ + { + "type": "bytes" + } + ] + }, + { + "type": "event", + "anonymous": false, + "name": "AdminChanged", + "inputs": [ + { + "type": "address", + "name": "previousAdmin", + "indexed": false + }, + { + "type": "address", + "name": "newAdmin", + "indexed": false + } + ] + }, + { + "type": "event", + "anonymous": false, + "name": "Upgraded", + "inputs": [ + { + "type": "address", + "name": "implementation", + "indexed": true + } + ] + } + ], + "transactionHash": "0x8add347ec1a8abb9cac1ff7f3d7ffd1a20d20616f6b7da659d541110d495b964", + "receipt": { + "to": "0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2", + "from": "0xcc56801a72463d39903A4a4632E600289178F6bC", + "contractAddress": null, + "transactionIndex": 106, + "gasUsed": "528796", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000400000000000000000000000000000004000000000000000000000000000000000000000000000000000000", + "blockHash": "0xda6a76e0ee2ef56dc90dbb2f0e02648487fbb45317aa4c5da147c8aefab81788", + "transactionHash": "0x8add347ec1a8abb9cac1ff7f3d7ffd1a20d20616f6b7da659d541110d495b964", + "logs": [ + { + "transactionIndex": 106, + "blockNumber": 6243249, + "transactionHash": "0x8add347ec1a8abb9cac1ff7f3d7ffd1a20d20616f6b7da659d541110d495b964", + "address": "0x25500000d700bbE27104577CCcce8eAbCC96c8ad", + "topics": [ + "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000cc56801a72463d39903a4a4632e600289178f6bc", + "logIndex": 155, + "blockHash": "0xda6a76e0ee2ef56dc90dbb2f0e02648487fbb45317aa4c5da147c8aefab81788" + } + ], + "blockNumber": 6243249, + "cumulativeGasUsed": "11605726", + "status": 1, + "byzantium": true + }, + "args": [ + "0xcc56801a72463d39903A4a4632E600289178F6bC" + ], + "numDeployments": 1, + "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_admin\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_admin\",\"type\":\"address\"}],\"name\":\"changeAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_implementation\",\"type\":\"address\"}],\"name\":\"upgradeTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_implementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"events\":{\"AdminChanged(address,address)\":{\"params\":{\"newAdmin\":\"The new owner of the contract\",\"previousAdmin\":\"The previous owner of the contract\"}},\"Upgraded(address)\":{\"params\":{\"implementation\":\"The address of the implementation contract\"}}},\"kind\":\"dev\",\"methods\":{\"admin()\":{\"returns\":{\"_0\":\"Owner address.\"}},\"changeAdmin(address)\":{\"params\":{\"_admin\":\"New owner of the proxy contract.\"}},\"constructor\":{\"params\":{\"_admin\":\"Address of the initial contract admin. Admin as the ability to access the transparent proxy interface.\"}},\"implementation()\":{\"returns\":{\"_0\":\"Implementation address.\"}},\"upgradeTo(address)\":{\"params\":{\"_implementation\":\"Address of the implementation contract.\"}},\"upgradeToAndCall(address,bytes)\":{\"params\":{\"_data\":\"Calldata to delegatecall the new implementation with.\",\"_implementation\":\"Address of the implementation contract.\"}}},\"title\":\"Proxy\",\"version\":1},\"userdoc\":{\"events\":{\"AdminChanged(address,address)\":{\"notice\":\"An event that is emitted each time the owner is upgraded. This event is part of the EIP-1967 specification.\"},\"Upgraded(address)\":{\"notice\":\"An event that is emitted each time the implementation is changed. This event is part of the EIP-1967 specification.\"}},\"kind\":\"user\",\"methods\":{\"admin()\":{\"notice\":\"Gets the owner of the proxy contract.\"},\"changeAdmin(address)\":{\"notice\":\"Changes the owner of the proxy contract. Only callable by the owner.\"},\"constructor\":{\"notice\":\"Sets the initial admin during contract deployment. Admin address is stored at the EIP-1967 admin storage slot so that accidental storage collision with the implementation is not possible.\"},\"implementation()\":{\"notice\":\"Queries the implementation address.\"},\"upgradeTo(address)\":{\"notice\":\"Set the implementation contract address. The code at the given address will execute when this contract is called.\"},\"upgradeToAndCall(address,bytes)\":{\"notice\":\"Set the implementation and call a function in a single transaction. Useful to ensure atomic execution of initialization-based upgrades.\"}},\"notice\":\"Proxy is a transparent proxy that passes through the call if the caller is the owner or if the caller is address(0), meaning that the call originated from an off-chain simulation.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/universal/Proxy.sol\":\"Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/\",\":@rari-capital/solmate/=node_modules/@rari-capital/solmate/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\",\":hardhat-deploy/=node_modules/hardhat-deploy/\",\":hardhat/=node_modules/hardhat/\"]},\"sources\":{\"contracts/universal/Proxy.sol\":{\"keccak256\":\"0xe7b6a14774f21622e1c287faf730c5fbc69f75b73942ee2586ec0c3b07dfe573\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6874d44c7dab7ce269ec546b762f3fd101f73daedb0f247a19116be868643ddf\",\"dweb:/ipfs/QmPwUj5LneorU5bwryiCVcdpH3WTXBRqxsXUfQsJJgX4Gt\"]}},\"version\":1}", + "bytecode": "0x608060405234801561001057600080fd5b5060405161091838038061091883398101604081905261002f916100b2565b6100388161003e565b506100e2565b60006100566000805160206108f88339815191525490565b6000805160206108f8833981519152839055604080516001600160a01b038084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b6000602082840312156100c457600080fd5b81516001600160a01b03811681146100db57600080fd5b9392505050565b610807806100f16000396000f3fe60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103", + "deployedBytecode": "0x60806040526004361061005e5760003560e01c80635c60da1b116100435780635c60da1b146100be5780638f283970146100f8578063f851a440146101185761006d565b80633659cfe6146100755780634f1ef286146100955761006d565b3661006d5761006b61012d565b005b61006b61012d565b34801561008157600080fd5b5061006b6100903660046106d9565b610224565b6100a86100a33660046106f4565b610296565b6040516100b59190610777565b60405180910390f35b3480156100ca57600080fd5b506100d3610419565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100b5565b34801561010457600080fd5b5061006b6101133660046106d9565b6104b0565b34801561012457600080fd5b506100d3610517565b60006101577f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610201576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e8061021e573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061027d575033155b1561028e5761028b816105a3565b50565b61028b61012d565b60606102c07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102f7575033155b1561040a57610305846105a3565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161032f9291906107ea565b600060405180830381855af49150503d806000811461036a576040519150601f19603f3d011682016040523d82523d6000602084013e61036f565b606091505b509150915081610401576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c65640000000000000060648201526084016101f8565b91506104129050565b61041261012d565b9392505050565b60006104437fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061047a575033155b156104a557507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b6104ad61012d565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610509575033155b1561028e5761028b8161060b565b60006105417fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610578575033155b156104a557507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006106357fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff811681146106d457600080fd5b919050565b6000602082840312156106eb57600080fd5b610412826106b0565b60008060006040848603121561070957600080fd5b610712846106b0565b9250602084013567ffffffffffffffff8082111561072f57600080fd5b818601915086601f83011261074357600080fd5b81358181111561075257600080fd5b87602082850101111561076457600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b818110156107a457858101830151858201604001528201610788565b818111156107b6576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea164736f6c634300080f000a" +} \ No newline at end of file diff --git a/packages/contracts/deployments/sepolia/L1MintManager.json b/packages/contracts/deployments/sepolia/L1MintManager.json new file mode 100644 index 0000000000..0ef672d051 --- /dev/null +++ b/packages/contracts/deployments/sepolia/L1MintManager.json @@ -0,0 +1,389 @@ +{ + "address": "0x35bDDC8dE48590769838B27fce99BA1bA79332c2", + "abi": [ + { + "type": "constructor", + "inputs": [ + { + "name": "_governanceToken", + "type": "address", + "internalType": "address" + }, + { + "name": "_owner", + "type": "address", + "internalType": "address" + }, + { + "name": "_recipients", + "type": "address[]", + "internalType": "address[]" + }, + { + "name": "_shares", + "type": "uint256[]", + "internalType": "uint256[]" + } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "GOVERNANCE_TOKEN", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "contract GovernanceToken" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "MINT_CAP", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "SHARE_DENOMINATOR", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "acceptOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "acceptOwnershipOfToken", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "distribute", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "mint", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "minted", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "pendingOwner", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "recipients", + "inputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "renounceOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "renounceOwnershipOfToken", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "shareOf", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [ + { + "name": "newOwner", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "transferOwnershipOfToken", + "inputs": [ + { + "name": "newMintManager", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "OwnershipTransferStarted", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { + "name": "previousOwner", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "newOwner", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + } + ], + "transactionHash": "0x67322eb44a537c5530412976ed27246b42914c0ae67dfba3839f570809b7d395", + "receipt": { + "to": null, + "from": "0xcc56801a72463d39903A4a4632E600289178F6bC", + "contractAddress": "0x35bDDC8dE48590769838B27fce99BA1bA79332c2", + "transactionIndex": 130, + "gasUsed": "1046195", + "logsBloom": "0x00000000000000000000000000000000200000000000000000800000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000080020000000000010000000800000800000000000000000000000000400000000000080000000000000000000400000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000020000002000000000000000008000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000004000000000", + "blockHash": "0xf32e3c3cd439235fa0445347915fd8ed97f91676a52d0513cc9bea94186c4d4f", + "transactionHash": "0x67322eb44a537c5530412976ed27246b42914c0ae67dfba3839f570809b7d395", + "logs": [ + { + "transactionIndex": 130, + "blockNumber": 6243353, + "transactionHash": "0x67322eb44a537c5530412976ed27246b42914c0ae67dfba3839f570809b7d395", + "address": "0x35bDDC8dE48590769838B27fce99BA1bA79332c2", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000cc56801a72463d39903a4a4632e600289178f6bc" + ], + "data": "0x", + "logIndex": 171, + "blockHash": "0xf32e3c3cd439235fa0445347915fd8ed97f91676a52d0513cc9bea94186c4d4f" + }, + { + "transactionIndex": 130, + "blockNumber": 6243353, + "transactionHash": "0x67322eb44a537c5530412976ed27246b42914c0ae67dfba3839f570809b7d395", + "address": "0x35bDDC8dE48590769838B27fce99BA1bA79332c2", + "topics": [ + "0x38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e22700", + "0x000000000000000000000000cc56801a72463d39903a4a4632e600289178f6bc", + "0x00000000000000000000000080e695eceb5bea3b1788c4dfb40b72afc59f60d8" + ], + "data": "0x", + "logIndex": 172, + "blockHash": "0xf32e3c3cd439235fa0445347915fd8ed97f91676a52d0513cc9bea94186c4d4f" + } + ], + "blockNumber": 6243353, + "cumulativeGasUsed": "13492172", + "status": 1, + "byzantium": true + }, + "args": [ + "0x25500000d700bbE27104577CCcce8eAbCC96c8ad", + "0x80e695eceb5bea3b1788c4dfb40b72afc59f60d8", + [ + "0xc2da150ecfaa2e275577203bb177dd4de4a2536e" + ], + [ + 5200 + ] + ], + "numDeployments": 1, + "solcInputHash": "37a0cebac478897ae0c20446c8a2494a", + "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_governanceToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"_recipients\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_shares\",\"type\":\"uint256[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferStarted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"GOVERNANCE_TOKEN\",\"outputs\":[{\"internalType\":\"contract GovernanceToken\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINT_CAP\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SHARE_DENOMINATOR\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnershipOfToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"distribute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"recipients\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnershipOfToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"shareOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newMintManager\",\"type\":\"address\"}],\"name\":\"transferOwnershipOfToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"acceptOwnership()\":{\"details\":\"The new owner accepts the ownership transfer.\"},\"constructor\":{\"params\":{\"_governanceToken\":\"The GovernanceToken this contract can mint tokens of.\",\"_owner\":\"The owner of this contract.\",\"_recipients\":\"List of the recipients.\",\"_shares\":\"List of token distribution ratios for each recipient.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"pendingOwner()\":{\"details\":\"Returns the address of the pending owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner.\"},\"transferOwnershipOfToken(address)\":{\"params\":{\"newMintManager\":\"The new MintManager to own the GovernanceToken.\"}}},\"title\":\"MintManager\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"GOVERNANCE_TOKEN()\":{\"notice\":\"The GovernanceToken that the MintManager can mint.\"},\"MINT_CAP()\":{\"notice\":\"The amount of tokens that can be minted.\"},\"SHARE_DENOMINATOR()\":{\"notice\":\"The denominator of each recipient's share.\"},\"acceptOwnershipOfToken()\":{\"notice\":\"Only the owner is allowed to accept the ownership of the GovernanceToken.\"},\"constructor\":{\"notice\":\"Constructs the MintManager contract.\"},\"distribute()\":{\"notice\":\"Only the owner is allowed to distribute the GovernanceToken to specified recipients.\"},\"mint()\":{\"notice\":\"Only the owner is allowed to mint mint cap amount of the GovernanceToken at once.\"},\"minted()\":{\"notice\":\"True when already minted on this chain. MintManager can mint only once on each chain.\"},\"recipients(uint256)\":{\"notice\":\"A list of recipient addresses that will receive tokens to be distributed.\"},\"renounceOwnershipOfToken()\":{\"notice\":\"Only the owner is allowed to renounce the ownership of the GovernanceToken.\"},\"shareOf(address)\":{\"notice\":\"A mapping of the recipient's address to share.\"},\"transferOwnershipOfToken(address)\":{\"notice\":\"Only the owner is allowed to transfer the ownership of the GovernanceToken.\"}},\"notice\":\"MintManager issues mint cap amount of GovernanceToken at once (TGE) and distributes the tokens to specified recipients.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/governance/MintManager.sol\":\"MintManager\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[\":@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/\",\":@rari-capital/solmate/=node_modules/@rari-capital/solmate/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\",\":hardhat-deploy/=node_modules/hardhat-deploy/\",\":hardhat/=node_modules/hardhat/\"]},\"sources\":{\"contracts/governance/GovernanceToken.sol\":{\"keccak256\":\"0x98304239f5ca6cc0c68dedf47b31ec5ceaeb11fed78d007dc16afb72d6a152a5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6cffce351c0d797a1c46e2eb3355324c86693cd9d48cd291cc30f0badb1843b4\",\"dweb:/ipfs/QmajzzFw1GT51LH1VBKh378xxwSLXxs6erBvUVxzFVkeLj\"]},\"contracts/governance/MintManager.sol\":{\"keccak256\":\"0xadda6a066e4b12ff23e7ff1cb4fdad43106b1b1e44389ea24453fccb0e5c71c8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2ea61e95d9edbf73c56b92dea9b75f66bb76354cff61547df52efa41cd95d07b\",\"dweb:/ipfs/QmRBpLcAHeDBpV8dLgtRaBdA6BzBU6CJmgyoSHCwK8U5cW\"]},\"contracts/universal/IKromaMintableERC20.sol\":{\"keccak256\":\"0x1a95268117456ddb1e0a16eb2ba773b9540c7b8b9520e66d4d167ddc6ace6fcb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f93d2e6f5121a3dfe272e399d6774e0584d59a20c4f63db78e5a0b644d92fa59\",\"dweb:/ipfs/QmbwM7kCpmwZs348jCeNwF86H8SDBURsGCGCUCyoSS1ffy\"]},\"contracts/universal/ISemver.sol\":{\"keccak256\":\"0xba34562a8026f59886d2e07d1d58d90b9691d00e0788c6263cef6c22740cab44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0826f998632f83c103c3085bf2e872db79a69022b6d2e0444c83a64ca5283c2a\",\"dweb:/ipfs/QmcJ7PNqkAfKqbjFGRordtAg1v9DvcBSKvdTkVvciLyvQR\"]},\"contracts/universal/KromaMintableERC20.sol\":{\"keccak256\":\"0x30dccac5fe2d7c75bbe1411004ad03c40afe6dce8c7d22a89abb783f74bd2674\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://de3f8062e170498d71069529cb83681b0acaeb41643892c092111b07df2895f6\",\"dweb:/ipfs/QmNsZa5vHYQ8eG3dQ7PjkfweXzxKc6nbDj9P455Mp1Waxx\"]},\"node_modules/@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\":{\"keccak256\":\"0x84efb8889801b0ac817324aff6acc691d07bbee816b671817132911d287a8c63\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ec6df2255fadc251ea905043c47bf55170ee6cb5d7ca8b5c8ed54c84eac9d09e\",\"dweb:/ipfs/QmaokWfuL59uarki5yoDGbPzh4cErzEfnAzfmesTNJNXE9\"]},\"node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0x4075622496acc77fd6d4de4cc30a8577a744d5c75afad33fdeacf1704d6eda98\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://99c8cb3cd19a44bbfb6612605affb7d8b06cee1f6aa9362a37a8672b4f7eeaf8\",\"dweb:/ipfs/QmasyxFDBUp7k5KFgfDWEzM8PYSKEq7GVznzMJ1VxVRF4B\"]},\"node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f103ee2e4aecd37aac6ceefe670709cdd7613dee25fa2d4d9feaf7fc0aaa155e\",\"dweb:/ipfs/QmRiNZLoJk5k3HPMYGPGjZFd2ke1ZxjhJZkM45Ec9GH9hv\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://310136ad60820af4177a11a61d77a3686faf5fca4942b600e08fc940db38396b\",\"dweb:/ipfs/QmbCzMNSTL7Zi7M4UCSqBrkHtp4jjxUnGbkneCZKdR1qeq\"]},\"node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d6520943ea55fdf5f0bafb39ed909f64de17051bc954ff3e88c9e5621412c79c\",\"dweb:/ipfs/QmWZ4rAKTQbNG2HxGs46AcTXShsVytKeLs7CUCdCSv5N7a\"]},\"node_modules/@openzeppelin/contracts/access/Ownable.sol\":{\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fc980984badf3984b6303b377711220e067722bbd6a135b24669ff5069ef9f32\",\"dweb:/ipfs/QmPHXMSXj99XjSVM21YsY6aNtLLjLVXDbyN76J5HQYvvrz\"]},\"node_modules/@openzeppelin/contracts/access/Ownable2Step.sol\":{\"keccak256\":\"0xde231558366826d7cb61725af8147965a61c53b77a352cc8c9af38fc5a92ac3c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1fd55624076bf61d44af5ff351919e32dda748567acfbdd6ba3d6c7be61c758e\",\"dweb:/ipfs/QmSki4dTrf4GPm7MTpG3fk8mC7rnjwd2zMomLp6jLuF63Q\"]},\"node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol\":{\"keccak256\":\"0x1618ddebe73377660f6da71afcba35d5ac4c4600918b3a381d9c6f37eba613eb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://666c8d7c62478b55e082f1835275b7acfc1595491998df6d67183ff2c70eab96\",\"dweb:/ipfs/QmVXmnXfxNaLhoX283dqyKJ8DJbF5thUd9sMuRoFpNMwr7\"]},\"node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol\":{\"keccak256\":\"0xac6c2efc64baccbde4904ae18ed45139c9aa8cff96d6888344d1e4d2eb8b659f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6e416a280c610b6b7a5f158e4a41aacfaec01ef14d5d1de13b46be9e090265fc\",\"dweb:/ipfs/QmYZP2KrdyccBbhLZT42auhvBTMkwiwUS3V6HWb42rbwbG\"]},\"node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol\":{\"keccak256\":\"0xfc12b717f6a2cd0d67adc8700097d4464d37f18ce933d4fc9c948ab6aec35e80\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://82386e69ebe902a2edfd4f8a5ecbeaeb2e00f6cc6481a973729e974373fb492e\",\"dweb:/ipfs/QmSXg4wBMBd83mQvkekT1GsiRX2Qyv5gvrqzv5qJx2M7Kc\"]},\"node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol\":{\"keccak256\":\"0xcaea9aeda3816ba872358c828f4f01455c22ae48ced49c4c7d72bd74176c09b9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://16ff22d8df5aee94510ee43d361b6147caef164941a684cedcb75be44f351fe6\",\"dweb:/ipfs/QmaCCwMdHVdPApuEJHLZapSJyA7mp5dAugpma3VUzWGd8E\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0xa56ca923f70c1748830700250b19c61b70db9a683516dc5e216694a50445d99c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cac938788bc4be12101e59d45588b4e059579f4e61062e1cda8d6b06c0191b15\",\"dweb:/ipfs/QmV2JKCyjTVH3rkWNrfdJRhAT7tZ3usAN2XcnD4h53Mvih\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bd39944e8fc06be6dbe2dd1d8449b5336e23c6a7ba3e8e9ae5ae0f37f35283f5\",\"dweb:/ipfs/QmPV3FGYjVwvKSgAXKUN3r9T9GwniZz83CxBpM7vyj2G53\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol\":{\"keccak256\":\"0x36c00327e3f9afd929cc2721aaa111ab57eff78a630cc364b279ad576b899295\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f5bf927f4c8b71a5809be184c3107b915b0445ab2c4a33208331e5376692eb5a\",\"dweb:/ipfs/QmVXirsCY1sf4kodhbL6w3NWZkeZeaMuQB7M6DBAdZNqFE\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\":{\"keccak256\":\"0x4e560f86662b6f72ab76122fff53317677154f14bac4a80dbd46a54172b3abfa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ca5c2518d247417cb01164f04eff57b7e87b5346bc03478ada916f26117aa7fd\",\"dweb:/ipfs/QmVgK66XGZCiH9x4mhqejKUTujtu68DyE6KrYi6MPuaHRJ\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5a376d3dda2cb70536c0a45c208b29b34ac560c4cb4f513a42079f96ba47d2dd\",\"dweb:/ipfs/QmZQg6gn1sUpM8wHzwNvSnihumUCAhxD119MpXeKp8B9s8\"]},\"node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol\":{\"keccak256\":\"0xec63854014a5b4f2b3290ab9103a21bdf902a508d0f41a8573fea49e98bf571a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bc5b5dc12fbc4002f282eaa7a5f06d8310ed62c1c77c5770f6283e058454c39a\",\"dweb:/ipfs/Qme9rE2wS3yBuyJq9GgbmzbsBQsW2M2sVFqYYLw7bosGrv\"]},\"node_modules/@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"node_modules/@openzeppelin/contracts/utils/Counters.sol\":{\"keccak256\":\"0xf0018c2440fbe238dd3a8732fa8e17a0f9dce84d31451dc8a32f6d62b349c9f1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://59e1c62884d55b70f3ae5432b44bb3166ad71ae3acd19c57ab6ddc3c87c325ee\",\"dweb:/ipfs/QmezuXg5GK5oeA4F91EZhozBFekhq5TD966bHPH18cCqhu\"]},\"node_modules/@openzeppelin/contracts/utils/ShortStrings.sol\":{\"keccak256\":\"0xc0e310c163edf15db45d4ff938113ab357f94fa86e61ea8e790853c4d2e13256\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://04db5bc05dcb05ba1f6ca2dfbead17adc8a2e2f911aa80b05e7a36d9eaf96516\",\"dweb:/ipfs/QmVkfHZbXVBUPsTopueCn3qGJX8aEjahFF3Fn4NcygLNm5\"]},\"node_modules/@openzeppelin/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xf09e68aa0dc6722a25bc46490e8d48ed864466d17313b8a0b254c36b54e49899\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e26daf81e2252dc1fe1ce0e4b55c2eb7c6d1ee84ae6558d1a9554432ea1d32da\",\"dweb:/ipfs/Qmb1UANWiWq5pCKbmHSu772hd4nt374dVaghGmwSVNuk8Q\"]},\"node_modules/@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b81d9ff6559ea5c47fc573e17ece6d9ba5d6839e213e6ebc3b4c5c8fe4199d7f\",\"dweb:/ipfs/QmPCW1bFisUzJkyjroY3yipwfism9RRCigCcK1hbXtVM8n\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"keccak256\":\"0x809bc3edb4bcbef8263fa616c1b60ee0004b50a8a1bfa164d8f57fd31f520c58\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8b93a1e39a4a19eba1600b92c96f435442db88cac91e315c8291547a2a7bcfe2\",\"dweb:/ipfs/QmTm34KVe6uZBZwq8dZDNWwPcm24qBJdxqL3rPxBJ4LrMv\"]},\"node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol\":{\"keccak256\":\"0x8432884527a7ad91e6eed1cfc5a0811ae2073e5bca107bd0ca442e9236b03dbd\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e3aa0eadab7aafcf91a95684765f778f64386f0368de88522ce873c21385278a\",\"dweb:/ipfs/QmPfaVAqWgH1QsT3dHVuL6jwMZbVKdoP8w1PvpiPT2FPWd\"]},\"node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://be161e54f24e5c6fae81a12db1a8ae87bc5ae1b0ddc805d82a1440a68455088f\",\"dweb:/ipfs/QmP7C3CHdY9urF4dEMb9wmsp1wMxHF6nhA2yQE5SKiPAdy\"]},\"node_modules/@openzeppelin/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cc8841b3cd48ad125e2f46323c8bad3aa0e88e399ec62acb9e57efa7e7c8058c\",\"dweb:/ipfs/QmSqE4mXHA2BXW58deDbXE8MTcsL5JSKNDbm23sVQxRLPS\"]},\"node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x52a8cfb0f5239d11b457dcdd1b326992ef672714ca8da71a157255bddd13f3ad\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://495145362c7ff1c9ca88c58bbbbcb412e3c2004406647412394486552ff6c278\",\"dweb:/ipfs/QmNNCeng6d5eRPDn6tkWSQhjE39XWfQEfjA63rRwHmr1iH\"]},\"node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c50fcc459e49a9858b6d8ad5f911295cb7c9ab57567845a250bf0153f84a95c7\",\"dweb:/ipfs/QmcEW85JRzvDkQggxiBBLVAasXWdkhEysqypj9EaB6H2g6\"]}},\"version\":1}", + "bytecode": "0x60a06040523480156200001157600080fd5b506040516200169338038062001693833981016040819052620000349162000574565b6200003f336200032a565b6001600160a01b038416608052620000578362000354565b8051825114620000ba5760405162461bcd60e51b8152602060048201526024808201527f4d696e744d616e616765723a20696e76616c6964206c656e677468206f6620616044820152637272617960e01b60648201526084015b60405180910390fd5b6000805b835181101562000295576000848281518110620000df57620000df6200066a565b6020026020010151905060006001600160a01b0316816001600160a01b031603620001605760405162461bcd60e51b815260206004820152602a60248201527f4d696e744d616e616765723a20726563697069656e74206164647265737320636044820152690616e6e6f7420626520360b41b6064820152608401620000b1565b60008483815181106200017757620001776200066a565b6020026020010151905080600003620001d35760405162461bcd60e51b815260206004820152601e60248201527f4d696e744d616e616765723a2073686172652063616e6e6f74206265203000006044820152606401620000b1565b6001600160a01b03821660009081526003602052604081205490036200023f57600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319166001600160a01b0384161790555b6001600160a01b038216600090815260036020526040812080548392906200026990849062000696565b909155506200027b9050818562000696565b9350505080806200028c90620006b1565b915050620000be565b50620186a08111156200031f5760405162461bcd60e51b8152602060048201526044602482018190527f4d696e744d616e616765723a206d617820746f74616c20736861726520697320908201527f657175616c206f72206c657373207468616e2053484152455f44454e4f4d494e60648201526320aa27a960e11b608482015260a401620000b1565b5050505050620006cd565b600180546001600160a01b03191690556200035181620003c7602090811b62000b5317901c565b50565b6200035e62000417565b600180546001600160a01b0319166001600160a01b0383169081179091556200038f6000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b03163314620004735760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620000b1565b565b80516001600160a01b03811681146200048d57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620004d357620004d362000492565b604052919050565b60006001600160401b03821115620004f757620004f762000492565b5060051b60200190565b600082601f8301126200051357600080fd5b815160206200052c6200052683620004db565b620004a8565b82815260059290921b840181019181810190868411156200054c57600080fd5b8286015b8481101562000569578051835291830191830162000550565b509695505050505050565b600080600080608085870312156200058b57600080fd5b620005968562000475565b93506020620005a781870162000475565b60408701519094506001600160401b0380821115620005c557600080fd5b818801915088601f830112620005da57600080fd5b8151620005eb6200052682620004db565b81815260059190911b8301840190848101908b8311156200060b57600080fd5b938501935b828510156200063457620006248562000475565b8252938501939085019062000610565b60608b015190975094505050808311156200064e57600080fd5b50506200065e8782880162000501565b91505092959194509250565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115620006ac57620006ac62000680565b500190565b600060018201620006c657620006c662000680565b5060010190565b608051610f796200071a6000396000818161014f01528181610331015281816104a3015281816105610152818161062e0152818161080a015281816108b30152610a190152610f796000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80637eb1184511610097578063d1bc76a111610066578063d1bc76a114610229578063e30c39781461023c578063e4fc6b6d1461025a578063f2fde38b1461026257600080fd5b80637eb11845146101ee5780638da5cb5b146101f857806398f1312e14610216578063baee5ed41461022157600080fd5b8063457c3977116100d3578063457c3977146101965780634f02c420146101a9578063715018a6146101de57806379ba5097146101e657600080fd5b80631249c58b1461010557806321e5e2c41461010f57806328df3f18146101425780632efd46d61461014a575b600080fd5b61010d610275565b005b61012f61011d366004610c7a565b60036020526000908152604090205481565b6040519081526020015b60405180910390f35b61010d610557565b6101717f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610139565b61010d6101a4366004610c7a565b6105e1565b6001546101ce9074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610139565b61010d61068d565b61010d6106a1565b61012f620186a081565b60005473ffffffffffffffffffffffffffffffffffffffff16610171565b61012f633b9aca0081565b61010d610756565b610171610237366004610cb7565b610870565b60015473ffffffffffffffffffffffffffffffffffffffff16610171565b61010d6108a7565b61010d610270366004610c7a565b610aa3565b61027d610bc8565b60015474010000000000000000000000000000000000000000900460ff161561032d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4d696e744d616e616765723a20616c7265616479206d696e746564206f6e207460448201527f68697320636861696e000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561039a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103be9190610cd0565b6103c990600a610e44565b6103d790633b9aca00610e53565b90506000805b60025481101561046d576000600282815481106103fc576103fc610e90565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168083526003909152604082205490925090620186a061043f8388610e53565b6104499190610ebf565b90506104558186610efa565b9450505050808061046590610f12565b9150506103dd565b506040517f40c10f19000000000000000000000000000000000000000000000000000000008152306004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906340c10f1990604401600060405180830381600087803b1580156104fc57600080fd5b505af1158015610510573d6000803e3d6000fd5b5050600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905550505050565b61055f610bc8565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379ba50976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105c757600080fd5b505af11580156105db573d6000803e3d6000fd5b50505050565b6105e9610bc8565b6040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063f2fde38b90602401600060405180830381600087803b15801561067257600080fd5b505af1158015610686573d6000803e3d6000fd5b5050505050565b610695610bc8565b61069f6000610c49565b565b600154339073ffffffffffffffffffffffffffffffffffffffff16811461074a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610324565b61075381610c49565b50565b61075e610bc8565b60015474010000000000000000000000000000000000000000900460ff16610808576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4d696e744d616e616765723a206e6f74206d696e746564206265666f7265207260448201527f656e6f756e6365206f776e6572736869700000000000000000000000000000006064820152608401610324565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663715018a66040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105c757600080fd5b6002818154811061088057600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b6108af610bc8565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561091c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109409190610cd0565b61094b90600a610e44565b61095990633b9aca00610e53565b905060005b600254811015610a9f5760006002828154811061097d5761097d610e90565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168083526003909152604082205490925090620186a06109c08387610e53565b6109ca9190610ebf565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af1158015610a64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a889190610f4a565b505050508080610a9790610f12565b91505061095e565b5050565b610aab610bc8565b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009091168117909155610b0e60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461069f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610324565b600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905561075381610b53565b600060208284031215610c8c57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610cb057600080fd5b9392505050565b600060208284031215610cc957600080fd5b5035919050565b600060208284031215610ce257600080fd5b815160ff81168114610cb057600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b80851115610d7b57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610d6157610d61610cf3565b80851615610d6e57918102915b93841c9390800290610d27565b509250929050565b600082610d9257506001610e3e565b81610d9f57506000610e3e565b8160018114610db55760028114610dbf57610ddb565b6001915050610e3e565b60ff841115610dd057610dd0610cf3565b50506001821b610e3e565b5060208310610133831016604e8410600b8410161715610dfe575081810a610e3e565b610e088383610d22565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610e3a57610e3a610cf3565b0290505b92915050565b6000610cb060ff841683610d83565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610e8b57610e8b610cf3565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082610ef5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008219821115610f0d57610f0d610cf3565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610f4357610f43610cf3565b5060010190565b600060208284031215610f5c57600080fd5b81518015158114610cb057600080fdfea164736f6c634300080f000a", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101005760003560e01c80637eb1184511610097578063d1bc76a111610066578063d1bc76a114610229578063e30c39781461023c578063e4fc6b6d1461025a578063f2fde38b1461026257600080fd5b80637eb11845146101ee5780638da5cb5b146101f857806398f1312e14610216578063baee5ed41461022157600080fd5b8063457c3977116100d3578063457c3977146101965780634f02c420146101a9578063715018a6146101de57806379ba5097146101e657600080fd5b80631249c58b1461010557806321e5e2c41461010f57806328df3f18146101425780632efd46d61461014a575b600080fd5b61010d610275565b005b61012f61011d366004610c7a565b60036020526000908152604090205481565b6040519081526020015b60405180910390f35b61010d610557565b6101717f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610139565b61010d6101a4366004610c7a565b6105e1565b6001546101ce9074010000000000000000000000000000000000000000900460ff1681565b6040519015158152602001610139565b61010d61068d565b61010d6106a1565b61012f620186a081565b60005473ffffffffffffffffffffffffffffffffffffffff16610171565b61012f633b9aca0081565b61010d610756565b610171610237366004610cb7565b610870565b60015473ffffffffffffffffffffffffffffffffffffffff16610171565b61010d6108a7565b61010d610270366004610c7a565b610aa3565b61027d610bc8565b60015474010000000000000000000000000000000000000000900460ff161561032d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4d696e744d616e616765723a20616c7265616479206d696e746564206f6e207460448201527f68697320636861696e000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561039a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103be9190610cd0565b6103c990600a610e44565b6103d790633b9aca00610e53565b90506000805b60025481101561046d576000600282815481106103fc576103fc610e90565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168083526003909152604082205490925090620186a061043f8388610e53565b6104499190610ebf565b90506104558186610efa565b9450505050808061046590610f12565b9150506103dd565b506040517f40c10f19000000000000000000000000000000000000000000000000000000008152306004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906340c10f1990604401600060405180830381600087803b1580156104fc57600080fd5b505af1158015610510573d6000803e3d6000fd5b5050600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905550505050565b61055f610bc8565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166379ba50976040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105c757600080fd5b505af11580156105db573d6000803e3d6000fd5b50505050565b6105e9610bc8565b6040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063f2fde38b90602401600060405180830381600087803b15801561067257600080fd5b505af1158015610686573d6000803e3d6000fd5b5050505050565b610695610bc8565b61069f6000610c49565b565b600154339073ffffffffffffffffffffffffffffffffffffffff16811461074a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e657200000000000000000000000000000000000000000000006064820152608401610324565b61075381610c49565b50565b61075e610bc8565b60015474010000000000000000000000000000000000000000900460ff16610808576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4d696e744d616e616765723a206e6f74206d696e746564206265666f7265207260448201527f656e6f756e6365206f776e6572736869700000000000000000000000000000006064820152608401610324565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663715018a66040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105c757600080fd5b6002818154811061088057600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b6108af610bc8565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561091c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109409190610cd0565b61094b90600a610e44565b61095990633b9aca00610e53565b905060005b600254811015610a9f5760006002828154811061097d5761097d610e90565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168083526003909152604082205490925090620186a06109c08387610e53565b6109ca9190610ebf565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af1158015610a64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a889190610f4a565b505050508080610a9790610f12565b91505061095e565b5050565b610aab610bc8565b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff00000000000000000000000000000000000000009091168117909155610b0e60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461069f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610324565b600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905561075381610b53565b600060208284031215610c8c57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610cb057600080fd5b9392505050565b600060208284031215610cc957600080fd5b5035919050565b600060208284031215610ce257600080fd5b815160ff81168114610cb057600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600181815b80851115610d7b57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610d6157610d61610cf3565b80851615610d6e57918102915b93841c9390800290610d27565b509250929050565b600082610d9257506001610e3e565b81610d9f57506000610e3e565b8160018114610db55760028114610dbf57610ddb565b6001915050610e3e565b60ff841115610dd057610dd0610cf3565b50506001821b610e3e565b5060208310610133831016604e8410600b8410161715610dfe575081810a610e3e565b610e088383610d22565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115610e3a57610e3a610cf3565b0290505b92915050565b6000610cb060ff841683610d83565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615610e8b57610e8b610cf3565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082610ef5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008219821115610f0d57610f0d610cf3565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610f4357610f43610cf3565b5060010190565b600060208284031215610f5c57600080fd5b81518015158114610cb057600080fdfea164736f6c634300080f000a", + "devdoc": {}, + "userdoc": {}, + "storageLayout": { + "storage": [ + { + "astId": 1524, + "contract": "contracts/governance/MintManager.sol:MintManager", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 1637, + "contract": "contracts/governance/MintManager.sol:MintManager", + "label": "_pendingOwner", + "offset": 0, + "slot": "1", + "type": "t_address" + }, + { + "astId": 240, + "contract": "contracts/governance/MintManager.sol:MintManager", + "label": "minted", + "offset": 20, + "slot": "1", + "type": "t_bool" + }, + { + "astId": 244, + "contract": "contracts/governance/MintManager.sol:MintManager", + "label": "recipients", + "offset": 0, + "slot": "2", + "type": "t_array(t_address)dyn_storage" + }, + { + "astId": 249, + "contract": "contracts/governance/MintManager.sol:MintManager", + "label": "shareOf", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_uint256)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_address)dyn_storage": { + "encoding": "dynamic_array", + "label": "address[]", + "numberOfBytes": "32", + "base": "t_address" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/sepolia/solcInputs/1cc21f973aa4cfc73d832518987f54f8.json b/packages/contracts/deployments/sepolia/solcInputs/1cc21f973aa4cfc73d832518987f54f8.json new file mode 100644 index 0000000000..2cc08a7522 --- /dev/null +++ b/packages/contracts/deployments/sepolia/solcInputs/1cc21f973aa4cfc73d832518987f54f8.json @@ -0,0 +1,132 @@ +{ + "language": "Solidity", + "sources": { + "contracts/governance/GovernanceToken.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.15;\n\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\";\nimport \"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\";\n\nimport { KromaMintableERC20 } from \"../universal/KromaMintableERC20.sol\";\n\n/**\n * @custom:proxied\n * @title GovernanceToken\n * @notice The KRO token used in governance, supporting voting and delegation. Implements\n * EIP 2612 allowing signed approvals. `mint` function is only allowed to the owner or\n * `Bridge`, and the total supply amount is minted at once (TGE). `Bridge` has the\n * permission to `mint` and `burn`, for the purpose of bridging KRO to the remote chain.\n */\ncontract GovernanceToken is KromaMintableERC20, ERC20Votes, Ownable2StepUpgradeable {\n /**\n * @notice Constructs the GovernanceToken contract.\n *\n * @param _bridge Address of the StandardBridge contract on this network.\n * @param _remoteToken Address of the corresponding token on the remote chain.\n */\n constructor(\n address _bridge,\n address _remoteToken\n ) KromaMintableERC20(_bridge, _remoteToken, \"\", \"\") ERC20Permit(\"Kroma\") {\n _disableInitializers();\n }\n\n /**\n * @notice Initializer.\n *\n * @param _owner The owner of this contract.\n */\n function initialize(address _owner) public initializer {\n __Ownable2Step_init();\n transferOwnership(_owner);\n }\n\n /**\n * @notice Allows StandardBridge or the owner to mint tokens.\n *\n * @param _to Address to mint tokens to.\n * @param _amount Amount of tokens to mint.\n */\n function mint(address _to, uint256 _amount) external override {\n require(\n msg.sender == BRIDGE || msg.sender == owner(),\n \"GovernanceToken: only bridge or owner can mint\"\n );\n\n _mint(_to, _amount);\n }\n\n /**\n * @inheritdoc KromaMintableERC20\n */\n function burn(address _from, uint256 _amount) external override onlyBridge {\n _burn(_from, _amount);\n }\n\n /**\n * @inheritdoc ERC20\n */\n function name() public pure override returns (string memory) {\n return \"Kroma\";\n }\n\n /**\n * @inheritdoc ERC20\n */\n function symbol() public pure override returns (string memory) {\n return \"KRO\";\n }\n\n /**\n * @notice Callback called after a token transfer.\n *\n * @param from The account sending tokens.\n * @param to The account receiving tokens.\n * @param amount The amount of tokens being transferred.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20, ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n\n /**\n * @notice Internal mint function.\n *\n * @param account The account receiving minted tokens.\n * @param amount The amount of tokens to mint.\n */\n function _mint(address account, uint256 amount) internal override(ERC20, ERC20Votes) {\n super._mint(account, amount);\n emit Mint(account, amount);\n }\n\n /**\n * @notice Internal burn function.\n *\n * @param account The account that tokens will be burned from.\n * @param amount The amount of tokens that will be burned.\n */\n function _burn(address account, uint256 amount) internal override(ERC20, ERC20Votes) {\n super._burn(account, amount);\n emit Burn(account, amount);\n }\n\n /**\n * @notice Override function.\n */\n function _msgSender() internal view override(Context, ContextUpgradeable) returns (address) {\n return super._msgSender();\n }\n\n /**\n * @notice Override function.\n */\n function _msgData()\n internal\n view\n override(Context, ContextUpgradeable)\n returns (bytes calldata)\n {\n return super._msgData();\n }\n}\n" + }, + "contracts/universal/IKromaMintableERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport { IERC165 } from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\n/**\n * @title IKromaMintableERC20\n * @notice This interface is available on the KromaMintableERC20 contract. We declare it as a\n * separate interface so that it can be used in custom implementations of\n * KromaMintableERC20.\n */\ninterface IKromaMintableERC20 {\n function REMOTE_TOKEN() external view returns (address);\n\n function BRIDGE() external view returns (address);\n\n function mint(address _to, uint256 _amount) external;\n\n function burn(address _from, uint256 _amount) external;\n}\n" + }, + "contracts/universal/ISemver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title ISemver\n/// @notice ISemver is a simple contract for ensuring that contracts are\n/// versioned using semantic versioning.\ninterface ISemver {\n /// @notice Getter for the semantic version of the contract. This is not\n /// meant to be used onchain but instead meant to be used by offchain\n /// tooling.\n /// @return Semver contract version as a string.\n function version() external view returns (string memory);\n}\n" + }, + "contracts/universal/KromaMintableERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.15;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { IERC165 } from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\nimport { ISemver } from \"../universal/ISemver.sol\";\nimport { IKromaMintableERC20 } from \"./IKromaMintableERC20.sol\";\n\n/**\n * @title KromaMintableERC20\n * @notice KromaMintableERC20 is a standard extension of the base ERC20 token contract designed\n * to allow the StandardBridge contracts to mint and burn tokens. This makes it possible to\n * use a KromaMintableRC20 as the L2 representation of an L1 token, or vice-versa.\n * Designed to be backwards compatible with the older StandardL2ERC20 token which was only\n * meant for use on L2.\n */\ncontract KromaMintableERC20 is IKromaMintableERC20, ERC20, ISemver {\n /**\n * @notice Address of the corresponding version of this token on the remote chain.\n */\n address public immutable REMOTE_TOKEN;\n\n /**\n * @notice Address of the StandardBridge on this network.\n */\n address public immutable BRIDGE;\n\n /**\n * @notice Emitted whenever tokens are minted for an account.\n *\n * @param account Address of the account tokens are being minted for.\n * @param amount Amount of tokens minted.\n */\n event Mint(address indexed account, uint256 amount);\n\n /**\n * @notice Emitted whenever tokens are burned from an account.\n *\n * @param account Address of the account tokens are being burned from.\n * @param amount Amount of tokens burned.\n */\n event Burn(address indexed account, uint256 amount);\n\n /**\n * @notice A modifier that only allows the bridge to call\n */\n modifier onlyBridge() {\n require(msg.sender == BRIDGE, \"KromaMintableERC20: only bridge can mint and burn\");\n _;\n }\n\n /**\n * @notice Semantic version.\n * @custom:semver 1.0.0\n */\n string public constant version = \"1.0.0\";\n\n /**\n * @notice Constructs the KromaMintableERC20 contract.\n *\n * @param _bridge Address of the L2 standard bridge.\n * @param _remoteToken Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _bridge,\n address _remoteToken,\n string memory _name,\n string memory _symbol\n ) ERC20(_name, _symbol) {\n REMOTE_TOKEN = _remoteToken;\n BRIDGE = _bridge;\n }\n\n /**\n * @notice Allows the StandardBridge on this network to mint tokens.\n *\n * @param _to Address to mint tokens to.\n * @param _amount Amount of tokens to mint.\n */\n function mint(address _to, uint256 _amount)\n external\n virtual\n override(IKromaMintableERC20)\n onlyBridge\n {\n _mint(_to, _amount);\n emit Mint(_to, _amount);\n }\n\n /**\n * @notice Allows the StandardBridge on this network to burn tokens.\n *\n * @param _from Address to burn tokens from.\n * @param _amount Amount of tokens to burn.\n */\n function burn(address _from, uint256 _amount)\n external\n virtual\n override(IKromaMintableERC20)\n onlyBridge\n {\n _burn(_from, _amount);\n emit Burn(_from, _amount);\n }\n\n /**\n * @notice ERC165 interface check function.\n *\n * @param _interfaceId Interface ID to check.\n *\n * @return Whether or not the interface is supported by this contract.\n */\n function supportsInterface(bytes4 _interfaceId) external pure returns (bool) {\n bytes4 iface1 = type(IERC165).interfaceId;\n // Interface corresponding to the updated KromaMintableERC20 (this contract).\n bytes4 iface2 = type(IKromaMintableERC20).interfaceId;\n return _interfaceId == iface1 || _interfaceId == iface2;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (governance/utils/IVotes.sol)\npragma solidity ^0.8.0;\n\n/**\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\n *\n * _Available since v4.5._\n */\ninterface IVotes {\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Returns the current amount of votes that `account` has.\n */\n function getVotes(address account) external view returns (uint256);\n\n /**\n * @dev Returns the amount of votes that `account` had at a specific moment in the past. If the `clock()` is\n * configured to use block numbers, this will return the value at the end of the corresponding block.\n */\n function getPastVotes(address account, uint256 timepoint) external view returns (uint256);\n\n /**\n * @dev Returns the total supply of votes available at a specific moment in the past. If the `clock()` is\n * configured to use block numbers, this will return the value at the end of the corresponding block.\n *\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\n * vote.\n */\n function getPastTotalSupply(uint256 timepoint) external view returns (uint256);\n\n /**\n * @dev Returns the delegate that `account` has chosen.\n */\n function delegates(address account) external view returns (address);\n\n /**\n * @dev Delegates votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) external;\n\n /**\n * @dev Delegates votes from signer to `delegatee`.\n */\n function delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) external;\n}\n" + }, + "node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5267.sol)\n\npragma solidity ^0.8.0;\n\ninterface IERC5267 {\n /**\n * @dev MAY be emitted to signal that the domain could have changed.\n */\n event EIP712DomainChanged();\n\n /**\n * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712\n * signature.\n */\n function eip712Domain()\n external\n view\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n );\n}\n" + }, + "node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5805.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../governance/utils/IVotes.sol\";\nimport \"./IERC6372.sol\";\n\ninterface IERC5805 is IERC6372, IVotes {}\n" + }, + "node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC6372.sol)\n\npragma solidity ^0.8.0;\n\ninterface IERC6372 {\n /**\n * @dev Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting).\n */\n function clock() external view returns (uint48);\n\n /**\n * @dev Description of the clock\n */\n // solhint-disable-next-line func-name-mixedcase\n function CLOCK_MODE() external view returns (string memory);\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the default value returned by this function, unless\n * it's overridden.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(address from, address to, uint256 amount) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\n // decrementing then incrementing.\n _balances[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n unchecked {\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\n _balances[account] += amount;\n }\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n // Overflow not possible: amount <= accountBalance <= totalSupply.\n _totalSupply -= amount;\n }\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(address owner, address spender, uint256 amount) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20Permit.sol\";\nimport \"../ERC20.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\nimport \"../../../utils/cryptography/EIP712.sol\";\nimport \"../../../utils/Counters.sol\";\n\n/**\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * _Available since v3.4._\n */\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\n using Counters for Counters.Counter;\n\n mapping(address => Counters.Counter) private _nonces;\n\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private constant _PERMIT_TYPEHASH =\n keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n /**\n * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.\n * However, to ensure consistency with the upgradeable transpiler, we will continue\n * to reserve a slot.\n * @custom:oz-renamed-from _PERMIT_TYPEHASH\n */\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;\n\n /**\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n *\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\n */\n constructor(string memory name) EIP712(name, \"1\") {}\n\n /**\n * @dev See {IERC20Permit-permit}.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= deadline, \"ERC20Permit: expired deadline\");\n\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\n\n bytes32 hash = _hashTypedDataV4(structHash);\n\n address signer = ECDSA.recover(hash, v, r, s);\n require(signer == owner, \"ERC20Permit: invalid signature\");\n\n _approve(owner, spender, value);\n }\n\n /**\n * @dev See {IERC20Permit-nonces}.\n */\n function nonces(address owner) public view virtual override returns (uint256) {\n return _nonces[owner].current();\n }\n\n /**\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\n return _domainSeparatorV4();\n }\n\n /**\n * @dev \"Consume a nonce\": return the current value and increment.\n *\n * _Available since v4.1._\n */\n function _useNonce(address owner) internal virtual returns (uint256 current) {\n Counters.Counter storage nonce = _nonces[owner];\n current = nonce.current();\n nonce.increment();\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Votes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20Permit.sol\";\nimport \"../../../interfaces/IERC5805.sol\";\nimport \"../../../utils/math/Math.sol\";\nimport \"../../../utils/math/SafeCast.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is ERC20Permit, IERC5805 {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n /**\n * @dev Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting).\n */\n function clock() public view virtual override returns (uint48) {\n return SafeCast.toUint48(block.number);\n }\n\n /**\n * @dev Description of the clock\n */\n // solhint-disable-next-line func-name-mixedcase\n function CLOCK_MODE() public view virtual override returns (string memory) {\n // Check that the clock was not modified\n require(clock() == block.number, \"ERC20Votes: broken clock mode\");\n return \"mode=blocknumber&from=default\";\n }\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual override returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view virtual override returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n unchecked {\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `timepoint`.\n *\n * Requirements:\n *\n * - `timepoint` must be in the past\n */\n function getPastVotes(address account, uint256 timepoint) public view virtual override returns (uint256) {\n require(timepoint < clock(), \"ERC20Votes: future lookup\");\n return _checkpointsLookup(_checkpoints[account], timepoint);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `timepoint`. Note, this value is the sum of all balances.\n * It is NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `timepoint` must be in the past\n */\n function getPastTotalSupply(uint256 timepoint) public view virtual override returns (uint256) {\n require(timepoint < clock(), \"ERC20Votes: future lookup\");\n return _checkpointsLookup(_totalSupplyCheckpoints, timepoint);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 timepoint) private view returns (uint256) {\n // We run a binary search to look for the last (most recent) checkpoint taken before (or at) `timepoint`.\n //\n // Initially we check if the block is recent to narrow the search range.\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `timepoint`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `timepoint`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `timepoint`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `timepoint`, but it works out\n // the same.\n uint256 length = ckpts.length;\n\n uint256 low = 0;\n uint256 high = length;\n\n if (length > 5) {\n uint256 mid = length - Math.sqrt(length);\n if (_unsafeAccess(ckpts, mid).fromBlock > timepoint) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (_unsafeAccess(ckpts, mid).fromBlock > timepoint) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n unchecked {\n return high == 0 ? 0 : _unsafeAccess(ckpts, high - 1).votes;\n }\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual override {\n _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {IVotes-DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {IVotes-DelegateChanged} and {IVotes-DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(address src, address dst, uint256 amount) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n\n unchecked {\n Checkpoint memory oldCkpt = pos == 0 ? Checkpoint(0, 0) : _unsafeAccess(ckpts, pos - 1);\n\n oldWeight = oldCkpt.votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && oldCkpt.fromBlock == clock()) {\n _unsafeAccess(ckpts, pos - 1).votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(clock()), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n\n /**\n * @dev Access an element of the array without performing bounds check. The position is assumed to be within bounds.\n */\n function _unsafeAccess(Checkpoint[] storage ckpts, uint256 pos) private pure returns (Checkpoint storage result) {\n assembly {\n mstore(0, ckpts.slot)\n result.slot := add(keccak256(0, 0x20), pos)\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/Counters.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/ShortStrings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/ShortStrings.sol)\n\npragma solidity ^0.8.8;\n\nimport \"./StorageSlot.sol\";\n\n// | string | 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |\n// | length | 0x BB |\ntype ShortString is bytes32;\n\n/**\n * @dev This library provides functions to convert short memory strings\n * into a `ShortString` type that can be used as an immutable variable.\n *\n * Strings of arbitrary length can be optimized using this library if\n * they are short enough (up to 31 bytes) by packing them with their\n * length (1 byte) in a single EVM word (32 bytes). Additionally, a\n * fallback mechanism can be used for every other case.\n *\n * Usage example:\n *\n * ```solidity\n * contract Named {\n * using ShortStrings for *;\n *\n * ShortString private immutable _name;\n * string private _nameFallback;\n *\n * constructor(string memory contractName) {\n * _name = contractName.toShortStringWithFallback(_nameFallback);\n * }\n *\n * function name() external view returns (string memory) {\n * return _name.toStringWithFallback(_nameFallback);\n * }\n * }\n * ```\n */\nlibrary ShortStrings {\n // Used as an identifier for strings longer than 31 bytes.\n bytes32 private constant _FALLBACK_SENTINEL = 0x00000000000000000000000000000000000000000000000000000000000000FF;\n\n error StringTooLong(string str);\n error InvalidShortString();\n\n /**\n * @dev Encode a string of at most 31 chars into a `ShortString`.\n *\n * This will trigger a `StringTooLong` error is the input string is too long.\n */\n function toShortString(string memory str) internal pure returns (ShortString) {\n bytes memory bstr = bytes(str);\n if (bstr.length > 31) {\n revert StringTooLong(str);\n }\n return ShortString.wrap(bytes32(uint256(bytes32(bstr)) | bstr.length));\n }\n\n /**\n * @dev Decode a `ShortString` back to a \"normal\" string.\n */\n function toString(ShortString sstr) internal pure returns (string memory) {\n uint256 len = byteLength(sstr);\n // using `new string(len)` would work locally but is not memory safe.\n string memory str = new string(32);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(str, len)\n mstore(add(str, 0x20), sstr)\n }\n return str;\n }\n\n /**\n * @dev Return the length of a `ShortString`.\n */\n function byteLength(ShortString sstr) internal pure returns (uint256) {\n uint256 result = uint256(ShortString.unwrap(sstr)) & 0xFF;\n if (result > 31) {\n revert InvalidShortString();\n }\n return result;\n }\n\n /**\n * @dev Encode a string into a `ShortString`, or write it to storage if it is too long.\n */\n function toShortStringWithFallback(string memory value, string storage store) internal returns (ShortString) {\n if (bytes(value).length < 32) {\n return toShortString(value);\n } else {\n StorageSlot.getStringSlot(store).value = value;\n return ShortString.wrap(_FALLBACK_SENTINEL);\n }\n }\n\n /**\n * @dev Decode a string that was encoded to `ShortString` or written to storage using {setWithFallback}.\n */\n function toStringWithFallback(ShortString value, string storage store) internal pure returns (string memory) {\n if (ShortString.unwrap(value) != _FALLBACK_SENTINEL) {\n return toString(value);\n } else {\n return store;\n }\n }\n\n /**\n * @dev Return the length of a string that was encoded to `ShortString` or written to storage using {setWithFallback}.\n *\n * WARNING: This will return the \"byte length\" of the string. This may not reflect the actual length in terms of\n * actual characters as the UTF-8 encoding of a single character can span over multiple bytes.\n */\n function byteLengthWithFallback(ShortString value, string storage store) internal view returns (uint256) {\n if (ShortString.unwrap(value) != _FALLBACK_SENTINEL) {\n return byteLength(value);\n } else {\n return bytes(store).length;\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/StorageSlot.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n *\n * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._\n * _Available since v4.9 for `string`, `bytes`._\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n struct StringSlot {\n string value;\n }\n\n struct BytesSlot {\n bytes value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` with member `value` located at `slot`.\n */\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n */\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := store.slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` with member `value` located at `slot`.\n */\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n */\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := store.slot\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/Strings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toString(int256 value) internal pure returns (string memory) {\n return string(abi.encodePacked(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value))));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return keccak256(bytes(a)) == keccak256(bytes(b));\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.sol\";\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV // Deprecated in v4.8\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n /// @solidity memory-safe-assembly\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, \"\\x19Ethereum Signed Message:\\n32\")\n mstore(0x1c, hash)\n message := keccak256(0x00, 0x3c)\n }\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from `s`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n\", Strings.toString(s.length), s));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) {\n /// @solidity memory-safe-assembly\n assembly {\n let ptr := mload(0x40)\n mstore(ptr, \"\\x19\\x01\")\n mstore(add(ptr, 0x02), domainSeparator)\n mstore(add(ptr, 0x22), structHash)\n data := keccak256(ptr, 0x42)\n }\n }\n\n /**\n * @dev Returns an Ethereum Signed Data with intended validator, created from a\n * `validator` and `data` according to the version 0 of EIP-191.\n *\n * See {recover}.\n */\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x00\", validator, data));\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.8;\n\nimport \"./ECDSA.sol\";\nimport \"../ShortStrings.sol\";\nimport \"../../interfaces/IERC5267.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain\n * separator of the implementation contract. This will cause the `_domainSeparatorV4` function to always rebuild the\n * separator from the immutable values, which is cheaper than accessing a cached version in cold storage.\n *\n * _Available since v3.4._\n *\n * @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\n */\nabstract contract EIP712 is IERC5267 {\n using ShortStrings for *;\n\n bytes32 private constant _TYPE_HASH =\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\");\n\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _cachedDomainSeparator;\n uint256 private immutable _cachedChainId;\n address private immutable _cachedThis;\n\n bytes32 private immutable _hashedName;\n bytes32 private immutable _hashedVersion;\n\n ShortString private immutable _name;\n ShortString private immutable _version;\n string private _nameFallback;\n string private _versionFallback;\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n _name = name.toShortStringWithFallback(_nameFallback);\n _version = version.toShortStringWithFallback(_versionFallback);\n _hashedName = keccak256(bytes(name));\n _hashedVersion = keccak256(bytes(version));\n\n _cachedChainId = block.chainid;\n _cachedDomainSeparator = _buildDomainSeparator();\n _cachedThis = address(this);\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _cachedThis && block.chainid == _cachedChainId) {\n return _cachedDomainSeparator;\n } else {\n return _buildDomainSeparator();\n }\n }\n\n function _buildDomainSeparator() private view returns (bytes32) {\n return keccak256(abi.encode(_TYPE_HASH, _hashedName, _hashedVersion, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n\n /**\n * @dev See {EIP-5267}.\n *\n * _Available since v4.9._\n */\n function eip712Domain()\n public\n view\n virtual\n override\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n )\n {\n return (\n hex\"0f\", // 01111\n _name.toStringWithFallback(_nameFallback),\n _version.toStringWithFallback(_versionFallback),\n block.chainid,\n address(this),\n bytes32(0),\n new uint256[](0)\n );\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1, \"Math: mulDiv overflow\");\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10 ** 64) {\n value /= 10 ** 64;\n result += 64;\n }\n if (value >= 10 ** 32) {\n value /= 10 ** 32;\n result += 32;\n }\n if (value >= 10 ** 16) {\n value /= 10 ** 16;\n result += 16;\n }\n if (value >= 10 ** 8) {\n value /= 10 ** 8;\n result += 8;\n }\n if (value >= 10 ** 4) {\n value /= 10 ** 4;\n result += 4;\n }\n if (value >= 10 ** 2) {\n value /= 10 ** 2;\n result += 2;\n }\n if (value >= 10 ** 1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SafeCast.sol)\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n require(value <= type(uint248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n require(value <= type(uint240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n require(value <= type(uint232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.2._\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n require(value <= type(uint216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n require(value <= type(uint208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n require(value <= type(uint200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n require(value <= type(uint192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n require(value <= type(uint184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n require(value <= type(uint176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n require(value <= type(uint168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n require(value <= type(uint160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n require(value <= type(uint152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n require(value <= type(uint144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n require(value <= type(uint136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v2.5._\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n require(value <= type(uint120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n require(value <= type(uint112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n require(value <= type(uint104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.2._\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n require(value <= type(uint88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n require(value <= type(uint80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n require(value <= type(uint72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v2.5._\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n require(value <= type(uint56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n require(value <= type(uint48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n require(value <= type(uint40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v2.5._\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n require(value <= type(uint24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v2.5._\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v2.5._\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n *\n * _Available since v3.0._\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toInt248(int256 value) internal pure returns (int248 downcasted) {\n downcasted = int248(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 248 bits\");\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toInt240(int256 value) internal pure returns (int240 downcasted) {\n downcasted = int240(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 240 bits\");\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toInt232(int256 value) internal pure returns (int232 downcasted) {\n downcasted = int232(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 232 bits\");\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.7._\n */\n function toInt224(int256 value) internal pure returns (int224 downcasted) {\n downcasted = int224(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 224 bits\");\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toInt216(int256 value) internal pure returns (int216 downcasted) {\n downcasted = int216(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 216 bits\");\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toInt208(int256 value) internal pure returns (int208 downcasted) {\n downcasted = int208(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 208 bits\");\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toInt200(int256 value) internal pure returns (int200 downcasted) {\n downcasted = int200(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 200 bits\");\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toInt192(int256 value) internal pure returns (int192 downcasted) {\n downcasted = int192(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 192 bits\");\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toInt184(int256 value) internal pure returns (int184 downcasted) {\n downcasted = int184(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 184 bits\");\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toInt176(int256 value) internal pure returns (int176 downcasted) {\n downcasted = int176(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 176 bits\");\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toInt168(int256 value) internal pure returns (int168 downcasted) {\n downcasted = int168(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 168 bits\");\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toInt160(int256 value) internal pure returns (int160 downcasted) {\n downcasted = int160(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 160 bits\");\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toInt152(int256 value) internal pure returns (int152 downcasted) {\n downcasted = int152(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 152 bits\");\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toInt144(int256 value) internal pure returns (int144 downcasted) {\n downcasted = int144(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 144 bits\");\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toInt136(int256 value) internal pure returns (int136 downcasted) {\n downcasted = int136(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 136 bits\");\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128 downcasted) {\n downcasted = int128(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 128 bits\");\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toInt120(int256 value) internal pure returns (int120 downcasted) {\n downcasted = int120(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 120 bits\");\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toInt112(int256 value) internal pure returns (int112 downcasted) {\n downcasted = int112(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 112 bits\");\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toInt104(int256 value) internal pure returns (int104 downcasted) {\n downcasted = int104(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 104 bits\");\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.7._\n */\n function toInt96(int256 value) internal pure returns (int96 downcasted) {\n downcasted = int96(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 96 bits\");\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toInt88(int256 value) internal pure returns (int88 downcasted) {\n downcasted = int88(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 88 bits\");\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toInt80(int256 value) internal pure returns (int80 downcasted) {\n downcasted = int80(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 80 bits\");\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toInt72(int256 value) internal pure returns (int72 downcasted) {\n downcasted = int72(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 72 bits\");\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64 downcasted) {\n downcasted = int64(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 64 bits\");\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toInt56(int256 value) internal pure returns (int56 downcasted) {\n downcasted = int56(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 56 bits\");\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toInt48(int256 value) internal pure returns (int48 downcasted) {\n downcasted = int48(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 48 bits\");\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toInt40(int256 value) internal pure returns (int40 downcasted) {\n downcasted = int40(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 40 bits\");\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32 downcasted) {\n downcasted = int32(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 32 bits\");\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toInt24(int256 value) internal pure returns (int24 downcasted) {\n downcasted = int24(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 24 bits\");\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16 downcasted) {\n downcasted = int16(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 16 bits\");\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8 downcasted) {\n downcasted = int8(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 8 bits\");\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n *\n * _Available since v3.0._\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n /**\n * @dev Returns the largest of two signed numbers.\n */\n function max(int256 a, int256 b) internal pure returns (int256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two signed numbers.\n */\n function min(int256 a, int256 b) internal pure returns (int256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two signed numbers without overflow.\n * The result is rounded towards zero.\n */\n function average(int256 a, int256 b) internal pure returns (int256) {\n // Formula from the book \"Hacker's Delight\"\n int256 x = (a & b) + ((a ^ b) >> 1);\n return x + (int256(uint256(x) >> 255) & (a ^ b));\n }\n\n /**\n * @dev Returns the absolute unsigned value of a signed value.\n */\n function abs(int256 n) internal pure returns (uint256) {\n unchecked {\n // must be unchecked in order to support `n = type(int256).min`\n return uint256(n >= 0 ? n : -n);\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./OwnableUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership} and {acceptOwnership}.\n *\n * This module is used through inheritance. It will make available all functions\n * from parent (Ownable).\n */\nabstract contract Ownable2StepUpgradeable is Initializable, OwnableUpgradeable {\n function __Ownable2Step_init() internal onlyInitializing {\n __Ownable_init_unchained();\n }\n\n function __Ownable2Step_init_unchained() internal onlyInitializing {\n }\n address private _pendingOwner;\n\n event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Returns the address of the pending owner.\n */\n function pendingOwner() public view virtual returns (address) {\n return _pendingOwner;\n }\n\n /**\n * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual override onlyOwner {\n _pendingOwner = newOwner;\n emit OwnershipTransferStarted(owner(), newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual override {\n delete _pendingOwner;\n super._transferOwnership(newOwner);\n }\n\n /**\n * @dev The new owner accepts the ownership transfer.\n */\n function acceptOwnership() public virtual {\n address sender = _msgSender();\n require(pendingOwner() == sender, \"Ownable2Step: caller is not the new owner\");\n _transferOwnership(sender);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n function __Ownable_init() internal onlyInitializing {\n __Ownable_init_unchained();\n }\n\n function __Ownable_init_unchained() internal onlyInitializing {\n _transferOwnership(_msgSender());\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n * @custom:oz-retyped-from bool\n */\n uint8 private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint8 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts.\n *\n * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\n * constructor.\n *\n * Emits an {Initialized} event.\n */\n modifier initializer() {\n bool isTopLevelCall = !_initializing;\n require(\n (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\n \"Initializable: contract is already initialized\"\n );\n _initialized = 1;\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n * are added through upgrades and that require initialization.\n *\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n * cannot be nested. If one is invoked in the context of another, execution will revert.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n *\n * WARNING: setting the version to 255 will prevent any future reinitialization.\n *\n * Emits an {Initialized} event.\n */\n modifier reinitializer(uint8 version) {\n require(!_initializing && _initialized < version, \"Initializable: contract is already initialized\");\n _initialized = version;\n _initializing = true;\n _;\n _initializing = false;\n emit Initialized(version);\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n require(_initializing, \"Initializable: contract is not initializing\");\n _;\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n *\n * Emits an {Initialized} event the first time it is successfully executed.\n */\n function _disableInitializers() internal virtual {\n require(!_initializing, \"Initializable: contract is initializing\");\n if (_initialized != type(uint8).max) {\n _initialized = type(uint8).max;\n emit Initialized(type(uint8).max);\n }\n }\n\n /**\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\n */\n function _getInitializedVersion() internal view returns (uint8) {\n return _initialized;\n }\n\n /**\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n */\n function _isInitializing() internal view returns (bool) {\n return _initializing;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n *\n * Furthermore, `isContract` will also return true if the target contract within\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n * which only has an effect at the end of a transaction.\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal onlyInitializing {\n }\n\n function __Context_init_unchained() internal onlyInitializing {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[50] private __gap;\n}\n" + } + }, + "settings": { + "remappings": [ + "@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/", + "@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/", + "@rari-capital/solmate/=node_modules/@rari-capital/solmate/", + "forge-std/=node_modules/forge-std/src/", + "ds-test/=node_modules/ds-test/src/", + "hardhat-deploy/=node_modules/hardhat-deploy/", + "hardhat/=node_modules/hardhat/" + ], + "optimizer": { + "enabled": true, + "runs": 10000 + }, + "metadata": { + "useLiteralContent": false, + "bytecodeHash": "none" + }, + "outputSelection": { + "*": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + } + }, + "evmVersion": "london", + "viaIR": false, + "libraries": {} + } +} \ No newline at end of file diff --git a/packages/contracts/deployments/sepolia/solcInputs/37a0cebac478897ae0c20446c8a2494a.json b/packages/contracts/deployments/sepolia/solcInputs/37a0cebac478897ae0c20446c8a2494a.json new file mode 100644 index 0000000000..2469337c2c --- /dev/null +++ b/packages/contracts/deployments/sepolia/solcInputs/37a0cebac478897ae0c20446c8a2494a.json @@ -0,0 +1,141 @@ +{ + "language": "Solidity", + "sources": { + "contracts/governance/GovernanceToken.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.15;\n\nimport \"@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol\";\nimport \"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\";\n\nimport { KromaMintableERC20 } from \"../universal/KromaMintableERC20.sol\";\n\n/**\n * @custom:proxied\n * @title GovernanceToken\n * @notice The KRO token used in governance, supporting voting and delegation. Implements\n * EIP 2612 allowing signed approvals. `mint` function is only allowed to the owner or\n * `Bridge`, and the total supply amount is minted at once (TGE). `Bridge` has the\n * permission to `mint` and `burn`, for the purpose of bridging KRO to the remote chain.\n */\ncontract GovernanceToken is KromaMintableERC20, ERC20Votes, Ownable2StepUpgradeable {\n /**\n * @notice Constructs the GovernanceToken contract.\n *\n * @param _bridge Address of the StandardBridge contract on this network.\n * @param _remoteToken Address of the corresponding token on the remote chain.\n */\n constructor(\n address _bridge,\n address _remoteToken\n ) KromaMintableERC20(_bridge, _remoteToken, \"\", \"\") ERC20Permit(\"Kroma\") {\n _disableInitializers();\n }\n\n /**\n * @notice Initializer.\n *\n * @param _owner The owner of this contract.\n */\n function initialize(address _owner) public initializer {\n __Ownable2Step_init();\n transferOwnership(_owner);\n }\n\n /**\n * @notice Allows StandardBridge or the owner to mint tokens.\n *\n * @param _to Address to mint tokens to.\n * @param _amount Amount of tokens to mint.\n */\n function mint(address _to, uint256 _amount) external override {\n require(\n msg.sender == BRIDGE || msg.sender == owner(),\n \"GovernanceToken: only bridge or owner can mint\"\n );\n\n _mint(_to, _amount);\n }\n\n /**\n * @inheritdoc KromaMintableERC20\n */\n function burn(address _from, uint256 _amount) external override onlyBridge {\n _burn(_from, _amount);\n }\n\n /**\n * @inheritdoc ERC20\n */\n function name() public pure override returns (string memory) {\n return \"Kroma\";\n }\n\n /**\n * @inheritdoc ERC20\n */\n function symbol() public pure override returns (string memory) {\n return \"KRO\";\n }\n\n /**\n * @notice Callback called after a token transfer.\n *\n * @param from The account sending tokens.\n * @param to The account receiving tokens.\n * @param amount The amount of tokens being transferred.\n */\n function _afterTokenTransfer(\n address from,\n address to,\n uint256 amount\n ) internal override(ERC20, ERC20Votes) {\n super._afterTokenTransfer(from, to, amount);\n }\n\n /**\n * @notice Internal mint function.\n *\n * @param account The account receiving minted tokens.\n * @param amount The amount of tokens to mint.\n */\n function _mint(address account, uint256 amount) internal override(ERC20, ERC20Votes) {\n super._mint(account, amount);\n emit Mint(account, amount);\n }\n\n /**\n * @notice Internal burn function.\n *\n * @param account The account that tokens will be burned from.\n * @param amount The amount of tokens that will be burned.\n */\n function _burn(address account, uint256 amount) internal override(ERC20, ERC20Votes) {\n super._burn(account, amount);\n emit Burn(account, amount);\n }\n\n /**\n * @notice Override function.\n */\n function _msgSender() internal view override(Context, ContextUpgradeable) returns (address) {\n return super._msgSender();\n }\n\n /**\n * @notice Override function.\n */\n function _msgData()\n internal\n view\n override(Context, ContextUpgradeable)\n returns (bytes calldata)\n {\n return super._msgData();\n }\n}\n" + }, + "contracts/governance/MintManager.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.15;\n\nimport { Ownable2Step } from \"@openzeppelin/contracts/access/Ownable2Step.sol\";\n\nimport { GovernanceToken } from \"./GovernanceToken.sol\";\n\n/**\n * @title MintManager\n * @notice MintManager issues mint cap amount of GovernanceToken at once (TGE) and distributes the\n * tokens to specified recipients.\n */\ncontract MintManager is Ownable2Step {\n /**\n * @notice The amount of tokens that can be minted.\n */\n uint256 public constant MINT_CAP = 1_000_000_000;\n\n /**\n * @notice The denominator of each recipient's share.\n */\n uint256 public constant SHARE_DENOMINATOR = 10 ** 5;\n\n /**\n * @notice The GovernanceToken that the MintManager can mint.\n */\n GovernanceToken public immutable GOVERNANCE_TOKEN;\n\n /**\n * @notice True when already minted on this chain. MintManager can mint only once on each chain.\n */\n bool public minted;\n\n /**\n * @notice A list of recipient addresses that will receive tokens to be distributed.\n */\n address[] public recipients;\n\n /**\n * @notice A mapping of the recipient's address to share.\n */\n mapping(address => uint256) public shareOf;\n\n /**\n * @notice Constructs the MintManager contract.\n *\n * @param _governanceToken The GovernanceToken this contract can mint tokens of.\n * @param _owner The owner of this contract.\n * @param _recipients List of the recipients.\n * @param _shares List of token distribution ratios for each recipient.\n */\n constructor(\n address _governanceToken,\n address _owner,\n address[] memory _recipients,\n uint256[] memory _shares\n ) {\n GOVERNANCE_TOKEN = GovernanceToken(_governanceToken);\n\n transferOwnership(_owner);\n\n require(_recipients.length == _shares.length, \"MintManager: invalid length of array\");\n\n uint256 totalShares = 0;\n for (uint256 i = 0; i < _recipients.length; i++) {\n address recipient = _recipients[i];\n require(recipient != address(0), \"MintManager: recipient address cannot be 0\");\n\n uint256 share = _shares[i];\n require(share != 0, \"MintManager: share cannot be 0\");\n\n if (shareOf[recipient] == 0) {\n recipients.push(recipient);\n }\n shareOf[recipient] += share;\n totalShares += share;\n }\n\n require(\n totalShares <= SHARE_DENOMINATOR,\n \"MintManager: max total share is equal or less than SHARE_DENOMINATOR\"\n );\n }\n\n /**\n * @notice Only the owner is allowed to mint mint cap amount of the GovernanceToken at once.\n */\n function mint() external onlyOwner {\n require(!minted, \"MintManager: already minted on this chain\");\n\n uint256 mintCap = MINT_CAP * 10 ** GOVERNANCE_TOKEN.decimals();\n\n uint256 totalAmount;\n for (uint256 i = 0; i < recipients.length; i++) {\n address recipient = recipients[i];\n uint256 share = shareOf[recipient];\n uint256 amount = (mintCap * share) / SHARE_DENOMINATOR;\n totalAmount += amount;\n }\n\n GOVERNANCE_TOKEN.mint(address(this), totalAmount);\n\n minted = true;\n }\n\n /**\n * @notice Only the owner is allowed to distribute the GovernanceToken to specified recipients.\n */\n function distribute() external onlyOwner {\n uint256 mintCap = MINT_CAP * 10 ** GOVERNANCE_TOKEN.decimals();\n\n for (uint256 i = 0; i < recipients.length; i++) {\n address recipient = recipients[i];\n uint256 share = shareOf[recipient];\n uint256 amount = (mintCap * share) / SHARE_DENOMINATOR;\n GOVERNANCE_TOKEN.transfer(recipient, amount);\n }\n }\n\n /**\n * @notice Only the owner is allowed to renounce the ownership of the GovernanceToken.\n */\n function renounceOwnershipOfToken() external onlyOwner {\n require(minted, \"MintManager: not minted before renounce ownership\");\n\n GOVERNANCE_TOKEN.renounceOwnership();\n }\n\n /**\n * @notice Only the owner is allowed to transfer the ownership of the GovernanceToken.\n *\n * @param newMintManager The new MintManager to own the GovernanceToken.\n */\n function transferOwnershipOfToken(address newMintManager) external onlyOwner {\n GOVERNANCE_TOKEN.transferOwnership(newMintManager);\n }\n\n /**\n * @notice Only the owner is allowed to accept the ownership of the GovernanceToken.\n */\n function acceptOwnershipOfToken() external onlyOwner {\n GOVERNANCE_TOKEN.acceptOwnership();\n }\n}\n" + }, + "contracts/universal/IKromaMintableERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport { IERC165 } from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\n/**\n * @title IKromaMintableERC20\n * @notice This interface is available on the KromaMintableERC20 contract. We declare it as a\n * separate interface so that it can be used in custom implementations of\n * KromaMintableERC20.\n */\ninterface IKromaMintableERC20 {\n function REMOTE_TOKEN() external view returns (address);\n\n function BRIDGE() external view returns (address);\n\n function mint(address _to, uint256 _amount) external;\n\n function burn(address _from, uint256 _amount) external;\n}\n" + }, + "contracts/universal/ISemver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @title ISemver\n/// @notice ISemver is a simple contract for ensuring that contracts are\n/// versioned using semantic versioning.\ninterface ISemver {\n /// @notice Getter for the semantic version of the contract. This is not\n /// meant to be used onchain but instead meant to be used by offchain\n /// tooling.\n /// @return Semver contract version as a string.\n function version() external view returns (string memory);\n}\n" + }, + "contracts/universal/KromaMintableERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.15;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { IERC165 } from \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\nimport { ISemver } from \"../universal/ISemver.sol\";\nimport { IKromaMintableERC20 } from \"./IKromaMintableERC20.sol\";\n\n/**\n * @title KromaMintableERC20\n * @notice KromaMintableERC20 is a standard extension of the base ERC20 token contract designed\n * to allow the StandardBridge contracts to mint and burn tokens. This makes it possible to\n * use a KromaMintableRC20 as the L2 representation of an L1 token, or vice-versa.\n * Designed to be backwards compatible with the older StandardL2ERC20 token which was only\n * meant for use on L2.\n */\ncontract KromaMintableERC20 is IKromaMintableERC20, ERC20, ISemver {\n /**\n * @notice Address of the corresponding version of this token on the remote chain.\n */\n address public immutable REMOTE_TOKEN;\n\n /**\n * @notice Address of the StandardBridge on this network.\n */\n address public immutable BRIDGE;\n\n /**\n * @notice Emitted whenever tokens are minted for an account.\n *\n * @param account Address of the account tokens are being minted for.\n * @param amount Amount of tokens minted.\n */\n event Mint(address indexed account, uint256 amount);\n\n /**\n * @notice Emitted whenever tokens are burned from an account.\n *\n * @param account Address of the account tokens are being burned from.\n * @param amount Amount of tokens burned.\n */\n event Burn(address indexed account, uint256 amount);\n\n /**\n * @notice A modifier that only allows the bridge to call\n */\n modifier onlyBridge() {\n require(msg.sender == BRIDGE, \"KromaMintableERC20: only bridge can mint and burn\");\n _;\n }\n\n /**\n * @notice Semantic version.\n * @custom:semver 1.0.0\n */\n string public constant version = \"1.0.0\";\n\n /**\n * @notice Constructs the KromaMintableERC20 contract.\n *\n * @param _bridge Address of the L2 standard bridge.\n * @param _remoteToken Address of the corresponding L1 token.\n * @param _name ERC20 name.\n * @param _symbol ERC20 symbol.\n */\n constructor(\n address _bridge,\n address _remoteToken,\n string memory _name,\n string memory _symbol\n ) ERC20(_name, _symbol) {\n REMOTE_TOKEN = _remoteToken;\n BRIDGE = _bridge;\n }\n\n /**\n * @notice Allows the StandardBridge on this network to mint tokens.\n *\n * @param _to Address to mint tokens to.\n * @param _amount Amount of tokens to mint.\n */\n function mint(address _to, uint256 _amount)\n external\n virtual\n override(IKromaMintableERC20)\n onlyBridge\n {\n _mint(_to, _amount);\n emit Mint(_to, _amount);\n }\n\n /**\n * @notice Allows the StandardBridge on this network to burn tokens.\n *\n * @param _from Address to burn tokens from.\n * @param _amount Amount of tokens to burn.\n */\n function burn(address _from, uint256 _amount)\n external\n virtual\n override(IKromaMintableERC20)\n onlyBridge\n {\n _burn(_from, _amount);\n emit Burn(_from, _amount);\n }\n\n /**\n * @notice ERC165 interface check function.\n *\n * @param _interfaceId Interface ID to check.\n *\n * @return Whether or not the interface is supported by this contract.\n */\n function supportsInterface(bytes4 _interfaceId) external pure returns (bool) {\n bytes4 iface1 = type(IERC165).interfaceId;\n // Interface corresponding to the updated KromaMintableERC20 (this contract).\n bytes4 iface2 = type(IKromaMintableERC20).interfaceId;\n return _interfaceId == iface1 || _interfaceId == iface2;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/access/Ownable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _transferOwnership(_msgSender());\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/access/Ownable2Step.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./Ownable.sol\";\n\n/**\n * @dev Contract module which provides access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership} and {acceptOwnership}.\n *\n * This module is used through inheritance. It will make available all functions\n * from parent (Ownable).\n */\nabstract contract Ownable2Step is Ownable {\n address private _pendingOwner;\n\n event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Returns the address of the pending owner.\n */\n function pendingOwner() public view virtual returns (address) {\n return _pendingOwner;\n }\n\n /**\n * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual override onlyOwner {\n _pendingOwner = newOwner;\n emit OwnershipTransferStarted(owner(), newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual override {\n delete _pendingOwner;\n super._transferOwnership(newOwner);\n }\n\n /**\n * @dev The new owner accepts the ownership transfer.\n */\n function acceptOwnership() public virtual {\n address sender = _msgSender();\n require(pendingOwner() == sender, \"Ownable2Step: caller is not the new owner\");\n _transferOwnership(sender);\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/governance/utils/IVotes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (governance/utils/IVotes.sol)\npragma solidity ^0.8.0;\n\n/**\n * @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.\n *\n * _Available since v4.5._\n */\ninterface IVotes {\n /**\n * @dev Emitted when an account changes their delegate.\n */\n event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);\n\n /**\n * @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.\n */\n event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);\n\n /**\n * @dev Returns the current amount of votes that `account` has.\n */\n function getVotes(address account) external view returns (uint256);\n\n /**\n * @dev Returns the amount of votes that `account` had at a specific moment in the past. If the `clock()` is\n * configured to use block numbers, this will return the value at the end of the corresponding block.\n */\n function getPastVotes(address account, uint256 timepoint) external view returns (uint256);\n\n /**\n * @dev Returns the total supply of votes available at a specific moment in the past. If the `clock()` is\n * configured to use block numbers, this will return the value at the end of the corresponding block.\n *\n * NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.\n * Votes that have not been delegated are still part of total supply, even though they would not participate in a\n * vote.\n */\n function getPastTotalSupply(uint256 timepoint) external view returns (uint256);\n\n /**\n * @dev Returns the delegate that `account` has chosen.\n */\n function delegates(address account) external view returns (address);\n\n /**\n * @dev Delegates votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) external;\n\n /**\n * @dev Delegates votes from signer to `delegatee`.\n */\n function delegateBySig(address delegatee, uint256 nonce, uint256 expiry, uint8 v, bytes32 r, bytes32 s) external;\n}\n" + }, + "node_modules/@openzeppelin/contracts/interfaces/IERC5267.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5267.sol)\n\npragma solidity ^0.8.0;\n\ninterface IERC5267 {\n /**\n * @dev MAY be emitted to signal that the domain could have changed.\n */\n event EIP712DomainChanged();\n\n /**\n * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712\n * signature.\n */\n function eip712Domain()\n external\n view\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n );\n}\n" + }, + "node_modules/@openzeppelin/contracts/interfaces/IERC5805.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC5805.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../governance/utils/IVotes.sol\";\nimport \"./IERC6372.sol\";\n\ninterface IERC5805 is IERC6372, IVotes {}\n" + }, + "node_modules/@openzeppelin/contracts/interfaces/IERC6372.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC6372.sol)\n\npragma solidity ^0.8.0;\n\ninterface IERC6372 {\n /**\n * @dev Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting).\n */\n function clock() external view returns (uint48);\n\n /**\n * @dev Description of the clock\n */\n // solhint-disable-next-line func-name-mixedcase\n function CLOCK_MODE() external view returns (string memory);\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the default value returned by this function, unless\n * it's overridden.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(address from, address to, uint256 amount) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\n // decrementing then incrementing.\n _balances[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n unchecked {\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\n _balances[account] += amount;\n }\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n // Overflow not possible: amount <= accountBalance <= totalSupply.\n _totalSupply -= amount;\n }\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(address owner, address spender, uint256 amount) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20Permit.sol\";\nimport \"../ERC20.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\nimport \"../../../utils/cryptography/EIP712.sol\";\nimport \"../../../utils/Counters.sol\";\n\n/**\n * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n *\n * _Available since v3.4._\n */\nabstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {\n using Counters for Counters.Counter;\n\n mapping(address => Counters.Counter) private _nonces;\n\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private constant _PERMIT_TYPEHASH =\n keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n /**\n * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.\n * However, to ensure consistency with the upgradeable transpiler, we will continue\n * to reserve a slot.\n * @custom:oz-renamed-from _PERMIT_TYPEHASH\n */\n // solhint-disable-next-line var-name-mixedcase\n bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;\n\n /**\n * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `\"1\"`.\n *\n * It's a good idea to use the same `name` that is defined as the ERC20 token name.\n */\n constructor(string memory name) EIP712(name, \"1\") {}\n\n /**\n * @dev See {IERC20Permit-permit}.\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= deadline, \"ERC20Permit: expired deadline\");\n\n bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));\n\n bytes32 hash = _hashTypedDataV4(structHash);\n\n address signer = ECDSA.recover(hash, v, r, s);\n require(signer == owner, \"ERC20Permit: invalid signature\");\n\n _approve(owner, spender, value);\n }\n\n /**\n * @dev See {IERC20Permit-nonces}.\n */\n function nonces(address owner) public view virtual override returns (uint256) {\n return _nonces[owner].current();\n }\n\n /**\n * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view override returns (bytes32) {\n return _domainSeparatorV4();\n }\n\n /**\n * @dev \"Consume a nonce\": return the current value and increment.\n *\n * _Available since v4.1._\n */\n function _useNonce(address owner) internal virtual returns (uint256 current) {\n Counters.Counter storage nonce = _nonces[owner];\n current = nonce.current();\n nonce.increment();\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/ERC20Votes.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./ERC20Permit.sol\";\nimport \"../../../interfaces/IERC5805.sol\";\nimport \"../../../utils/math/Math.sol\";\nimport \"../../../utils/math/SafeCast.sol\";\nimport \"../../../utils/cryptography/ECDSA.sol\";\n\n/**\n * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,\n * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.\n *\n * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.\n *\n * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either\n * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting\n * power can be queried through the public accessors {getVotes} and {getPastVotes}.\n *\n * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it\n * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.\n *\n * _Available since v4.2._\n */\nabstract contract ERC20Votes is ERC20Permit, IERC5805 {\n struct Checkpoint {\n uint32 fromBlock;\n uint224 votes;\n }\n\n bytes32 private constant _DELEGATION_TYPEHASH =\n keccak256(\"Delegation(address delegatee,uint256 nonce,uint256 expiry)\");\n\n mapping(address => address) private _delegates;\n mapping(address => Checkpoint[]) private _checkpoints;\n Checkpoint[] private _totalSupplyCheckpoints;\n\n /**\n * @dev Clock used for flagging checkpoints. Can be overridden to implement timestamp based checkpoints (and voting).\n */\n function clock() public view virtual override returns (uint48) {\n return SafeCast.toUint48(block.number);\n }\n\n /**\n * @dev Description of the clock\n */\n // solhint-disable-next-line func-name-mixedcase\n function CLOCK_MODE() public view virtual override returns (string memory) {\n // Check that the clock was not modified\n require(clock() == block.number, \"ERC20Votes: broken clock mode\");\n return \"mode=blocknumber&from=default\";\n }\n\n /**\n * @dev Get the `pos`-th checkpoint for `account`.\n */\n function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {\n return _checkpoints[account][pos];\n }\n\n /**\n * @dev Get number of checkpoints for `account`.\n */\n function numCheckpoints(address account) public view virtual returns (uint32) {\n return SafeCast.toUint32(_checkpoints[account].length);\n }\n\n /**\n * @dev Get the address `account` is currently delegating to.\n */\n function delegates(address account) public view virtual override returns (address) {\n return _delegates[account];\n }\n\n /**\n * @dev Gets the current votes balance for `account`\n */\n function getVotes(address account) public view virtual override returns (uint256) {\n uint256 pos = _checkpoints[account].length;\n unchecked {\n return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;\n }\n }\n\n /**\n * @dev Retrieve the number of votes for `account` at the end of `timepoint`.\n *\n * Requirements:\n *\n * - `timepoint` must be in the past\n */\n function getPastVotes(address account, uint256 timepoint) public view virtual override returns (uint256) {\n require(timepoint < clock(), \"ERC20Votes: future lookup\");\n return _checkpointsLookup(_checkpoints[account], timepoint);\n }\n\n /**\n * @dev Retrieve the `totalSupply` at the end of `timepoint`. Note, this value is the sum of all balances.\n * It is NOT the sum of all the delegated votes!\n *\n * Requirements:\n *\n * - `timepoint` must be in the past\n */\n function getPastTotalSupply(uint256 timepoint) public view virtual override returns (uint256) {\n require(timepoint < clock(), \"ERC20Votes: future lookup\");\n return _checkpointsLookup(_totalSupplyCheckpoints, timepoint);\n }\n\n /**\n * @dev Lookup a value in a list of (sorted) checkpoints.\n */\n function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 timepoint) private view returns (uint256) {\n // We run a binary search to look for the last (most recent) checkpoint taken before (or at) `timepoint`.\n //\n // Initially we check if the block is recent to narrow the search range.\n // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).\n // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.\n // - If the middle checkpoint is after `timepoint`, we look in [low, mid)\n // - If the middle checkpoint is before or equal to `timepoint`, we look in [mid+1, high)\n // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not\n // out of bounds (in which case we're looking too far in the past and the result is 0).\n // Note that if the latest checkpoint available is exactly for `timepoint`, we end up with an index that is\n // past the end of the array, so we technically don't find a checkpoint after `timepoint`, but it works out\n // the same.\n uint256 length = ckpts.length;\n\n uint256 low = 0;\n uint256 high = length;\n\n if (length > 5) {\n uint256 mid = length - Math.sqrt(length);\n if (_unsafeAccess(ckpts, mid).fromBlock > timepoint) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n while (low < high) {\n uint256 mid = Math.average(low, high);\n if (_unsafeAccess(ckpts, mid).fromBlock > timepoint) {\n high = mid;\n } else {\n low = mid + 1;\n }\n }\n\n unchecked {\n return high == 0 ? 0 : _unsafeAccess(ckpts, high - 1).votes;\n }\n }\n\n /**\n * @dev Delegate votes from the sender to `delegatee`.\n */\n function delegate(address delegatee) public virtual override {\n _delegate(_msgSender(), delegatee);\n }\n\n /**\n * @dev Delegates votes from signer to `delegatee`\n */\n function delegateBySig(\n address delegatee,\n uint256 nonce,\n uint256 expiry,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) public virtual override {\n require(block.timestamp <= expiry, \"ERC20Votes: signature expired\");\n address signer = ECDSA.recover(\n _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),\n v,\n r,\n s\n );\n require(nonce == _useNonce(signer), \"ERC20Votes: invalid nonce\");\n _delegate(signer, delegatee);\n }\n\n /**\n * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).\n */\n function _maxSupply() internal view virtual returns (uint224) {\n return type(uint224).max;\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been increased.\n */\n function _mint(address account, uint256 amount) internal virtual override {\n super._mint(account, amount);\n require(totalSupply() <= _maxSupply(), \"ERC20Votes: total supply risks overflowing votes\");\n\n _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);\n }\n\n /**\n * @dev Snapshots the totalSupply after it has been decreased.\n */\n function _burn(address account, uint256 amount) internal virtual override {\n super._burn(account, amount);\n\n _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);\n }\n\n /**\n * @dev Move voting power when tokens are transferred.\n *\n * Emits a {IVotes-DelegateVotesChanged} event.\n */\n function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual override {\n super._afterTokenTransfer(from, to, amount);\n\n _moveVotingPower(delegates(from), delegates(to), amount);\n }\n\n /**\n * @dev Change delegation for `delegator` to `delegatee`.\n *\n * Emits events {IVotes-DelegateChanged} and {IVotes-DelegateVotesChanged}.\n */\n function _delegate(address delegator, address delegatee) internal virtual {\n address currentDelegate = delegates(delegator);\n uint256 delegatorBalance = balanceOf(delegator);\n _delegates[delegator] = delegatee;\n\n emit DelegateChanged(delegator, currentDelegate, delegatee);\n\n _moveVotingPower(currentDelegate, delegatee, delegatorBalance);\n }\n\n function _moveVotingPower(address src, address dst, uint256 amount) private {\n if (src != dst && amount > 0) {\n if (src != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);\n emit DelegateVotesChanged(src, oldWeight, newWeight);\n }\n\n if (dst != address(0)) {\n (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);\n emit DelegateVotesChanged(dst, oldWeight, newWeight);\n }\n }\n }\n\n function _writeCheckpoint(\n Checkpoint[] storage ckpts,\n function(uint256, uint256) view returns (uint256) op,\n uint256 delta\n ) private returns (uint256 oldWeight, uint256 newWeight) {\n uint256 pos = ckpts.length;\n\n unchecked {\n Checkpoint memory oldCkpt = pos == 0 ? Checkpoint(0, 0) : _unsafeAccess(ckpts, pos - 1);\n\n oldWeight = oldCkpt.votes;\n newWeight = op(oldWeight, delta);\n\n if (pos > 0 && oldCkpt.fromBlock == clock()) {\n _unsafeAccess(ckpts, pos - 1).votes = SafeCast.toUint224(newWeight);\n } else {\n ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(clock()), votes: SafeCast.toUint224(newWeight)}));\n }\n }\n }\n\n function _add(uint256 a, uint256 b) private pure returns (uint256) {\n return a + b;\n }\n\n function _subtract(uint256 a, uint256 b) private pure returns (uint256) {\n return a - b;\n }\n\n /**\n * @dev Access an element of the array without performing bounds check. The position is assumed to be within bounds.\n */\n function _unsafeAccess(Checkpoint[] storage ckpts, uint256 pos) private pure returns (Checkpoint storage result) {\n assembly {\n mstore(0, ckpts.slot)\n result.slot := add(keccak256(0, 0x20), pos)\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" + }, + "node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in\n * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].\n *\n * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by\n * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't\n * need to send a transaction, and thus is not required to hold Ether at all.\n */\ninterface IERC20Permit {\n /**\n * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,\n * given ``owner``'s signed approval.\n *\n * IMPORTANT: The same issues {IERC20-approve} has related to transaction\n * ordering also apply here.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `deadline` must be a timestamp in the future.\n * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`\n * over the EIP712-formatted function arguments.\n * - the signature must use ``owner``'s current nonce (see {nonces}).\n *\n * For more information on the signature format, see the\n * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP\n * section].\n */\n function permit(\n address owner,\n address spender,\n uint256 value,\n uint256 deadline,\n uint8 v,\n bytes32 r,\n bytes32 s\n ) external;\n\n /**\n * @dev Returns the current nonce for `owner`. This value must be\n * included whenever a signature is generated for {permit}.\n *\n * Every successful call to {permit} increases ``owner``'s nonce by one. This\n * prevents a signature from being used multiple times.\n */\n function nonces(address owner) external view returns (uint256);\n\n /**\n * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.\n */\n // solhint-disable-next-line func-name-mixedcase\n function DOMAIN_SEPARATOR() external view returns (bytes32);\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/Counters.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @title Counters\n * @author Matt Condon (@shrugs)\n * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number\n * of elements in a mapping, issuing ERC721 ids, or counting request ids.\n *\n * Include with `using Counters for Counters.Counter;`\n */\nlibrary Counters {\n struct Counter {\n // This variable should never be directly accessed by users of the library: interactions must be restricted to\n // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add\n // this feature: see https://github.com/ethereum/solidity/issues/4637\n uint256 _value; // default: 0\n }\n\n function current(Counter storage counter) internal view returns (uint256) {\n return counter._value;\n }\n\n function increment(Counter storage counter) internal {\n unchecked {\n counter._value += 1;\n }\n }\n\n function decrement(Counter storage counter) internal {\n uint256 value = counter._value;\n require(value > 0, \"Counter: decrement overflow\");\n unchecked {\n counter._value = value - 1;\n }\n }\n\n function reset(Counter storage counter) internal {\n counter._value = 0;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/ShortStrings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/ShortStrings.sol)\n\npragma solidity ^0.8.8;\n\nimport \"./StorageSlot.sol\";\n\n// | string | 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA |\n// | length | 0x BB |\ntype ShortString is bytes32;\n\n/**\n * @dev This library provides functions to convert short memory strings\n * into a `ShortString` type that can be used as an immutable variable.\n *\n * Strings of arbitrary length can be optimized using this library if\n * they are short enough (up to 31 bytes) by packing them with their\n * length (1 byte) in a single EVM word (32 bytes). Additionally, a\n * fallback mechanism can be used for every other case.\n *\n * Usage example:\n *\n * ```solidity\n * contract Named {\n * using ShortStrings for *;\n *\n * ShortString private immutable _name;\n * string private _nameFallback;\n *\n * constructor(string memory contractName) {\n * _name = contractName.toShortStringWithFallback(_nameFallback);\n * }\n *\n * function name() external view returns (string memory) {\n * return _name.toStringWithFallback(_nameFallback);\n * }\n * }\n * ```\n */\nlibrary ShortStrings {\n // Used as an identifier for strings longer than 31 bytes.\n bytes32 private constant _FALLBACK_SENTINEL = 0x00000000000000000000000000000000000000000000000000000000000000FF;\n\n error StringTooLong(string str);\n error InvalidShortString();\n\n /**\n * @dev Encode a string of at most 31 chars into a `ShortString`.\n *\n * This will trigger a `StringTooLong` error is the input string is too long.\n */\n function toShortString(string memory str) internal pure returns (ShortString) {\n bytes memory bstr = bytes(str);\n if (bstr.length > 31) {\n revert StringTooLong(str);\n }\n return ShortString.wrap(bytes32(uint256(bytes32(bstr)) | bstr.length));\n }\n\n /**\n * @dev Decode a `ShortString` back to a \"normal\" string.\n */\n function toString(ShortString sstr) internal pure returns (string memory) {\n uint256 len = byteLength(sstr);\n // using `new string(len)` would work locally but is not memory safe.\n string memory str = new string(32);\n /// @solidity memory-safe-assembly\n assembly {\n mstore(str, len)\n mstore(add(str, 0x20), sstr)\n }\n return str;\n }\n\n /**\n * @dev Return the length of a `ShortString`.\n */\n function byteLength(ShortString sstr) internal pure returns (uint256) {\n uint256 result = uint256(ShortString.unwrap(sstr)) & 0xFF;\n if (result > 31) {\n revert InvalidShortString();\n }\n return result;\n }\n\n /**\n * @dev Encode a string into a `ShortString`, or write it to storage if it is too long.\n */\n function toShortStringWithFallback(string memory value, string storage store) internal returns (ShortString) {\n if (bytes(value).length < 32) {\n return toShortString(value);\n } else {\n StorageSlot.getStringSlot(store).value = value;\n return ShortString.wrap(_FALLBACK_SENTINEL);\n }\n }\n\n /**\n * @dev Decode a string that was encoded to `ShortString` or written to storage using {setWithFallback}.\n */\n function toStringWithFallback(ShortString value, string storage store) internal pure returns (string memory) {\n if (ShortString.unwrap(value) != _FALLBACK_SENTINEL) {\n return toString(value);\n } else {\n return store;\n }\n }\n\n /**\n * @dev Return the length of a string that was encoded to `ShortString` or written to storage using {setWithFallback}.\n *\n * WARNING: This will return the \"byte length\" of the string. This may not reflect the actual length in terms of\n * actual characters as the UTF-8 encoding of a single character can span over multiple bytes.\n */\n function byteLengthWithFallback(ShortString value, string storage store) internal view returns (uint256) {\n if (ShortString.unwrap(value) != _FALLBACK_SENTINEL) {\n return byteLength(value);\n } else {\n return bytes(store).length;\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/StorageSlot.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n * function _getImplementation() internal view returns (address) {\n * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n * }\n *\n * function _setImplementation(address newImplementation) internal {\n * require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n * }\n * }\n * ```\n *\n * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._\n * _Available since v4.9 for `string`, `bytes`._\n */\nlibrary StorageSlot {\n struct AddressSlot {\n address value;\n }\n\n struct BooleanSlot {\n bool value;\n }\n\n struct Bytes32Slot {\n bytes32 value;\n }\n\n struct Uint256Slot {\n uint256 value;\n }\n\n struct StringSlot {\n string value;\n }\n\n struct BytesSlot {\n bytes value;\n }\n\n /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\n */\n function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\n */\n function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\n */\n function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` with member `value` located at `slot`.\n */\n function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n */\n function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := store.slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` with member `value` located at `slot`.\n */\n function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := slot\n }\n }\n\n /**\n * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n */\n function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n /// @solidity memory-safe-assembly\n assembly {\n r.slot := store.slot\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/Strings.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toString(int256 value) internal pure returns (string memory) {\n return string(abi.encodePacked(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value))));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return keccak256(bytes(a)) == keccak256(bytes(b));\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.sol\";\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV // Deprecated in v4.8\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n /// @solidity memory-safe-assembly\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, \"\\x19Ethereum Signed Message:\\n32\")\n mstore(0x1c, hash)\n message := keccak256(0x00, 0x3c)\n }\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from `s`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n\", Strings.toString(s.length), s));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) {\n /// @solidity memory-safe-assembly\n assembly {\n let ptr := mload(0x40)\n mstore(ptr, \"\\x19\\x01\")\n mstore(add(ptr, 0x02), domainSeparator)\n mstore(add(ptr, 0x22), structHash)\n data := keccak256(ptr, 0x42)\n }\n }\n\n /**\n * @dev Returns an Ethereum Signed Data with intended validator, created from a\n * `validator` and `data` according to the version 0 of EIP-191.\n *\n * See {recover}.\n */\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x00\", validator, data));\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/cryptography/EIP712.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/EIP712.sol)\n\npragma solidity ^0.8.8;\n\nimport \"./ECDSA.sol\";\nimport \"../ShortStrings.sol\";\nimport \"../../interfaces/IERC5267.sol\";\n\n/**\n * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.\n *\n * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,\n * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding\n * they need in their contracts using a combination of `abi.encode` and `keccak256`.\n *\n * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding\n * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA\n * ({_hashTypedDataV4}).\n *\n * The implementation of the domain separator was designed to be as efficient as possible while still properly updating\n * the chain id to protect against replay attacks on an eventual fork of the chain.\n *\n * NOTE: This contract implements the version of the encoding known as \"v4\", as implemented by the JSON RPC method\n * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].\n *\n * NOTE: In the upgradeable version of this contract, the cached values will correspond to the address, and the domain\n * separator of the implementation contract. This will cause the `_domainSeparatorV4` function to always rebuild the\n * separator from the immutable values, which is cheaper than accessing a cached version in cold storage.\n *\n * _Available since v3.4._\n *\n * @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\n */\nabstract contract EIP712 is IERC5267 {\n using ShortStrings for *;\n\n bytes32 private constant _TYPE_HASH =\n keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\");\n\n // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to\n // invalidate the cached domain separator if the chain id changes.\n bytes32 private immutable _cachedDomainSeparator;\n uint256 private immutable _cachedChainId;\n address private immutable _cachedThis;\n\n bytes32 private immutable _hashedName;\n bytes32 private immutable _hashedVersion;\n\n ShortString private immutable _name;\n ShortString private immutable _version;\n string private _nameFallback;\n string private _versionFallback;\n\n /**\n * @dev Initializes the domain separator and parameter caches.\n *\n * The meaning of `name` and `version` is specified in\n * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:\n *\n * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.\n * - `version`: the current major version of the signing domain.\n *\n * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart\n * contract upgrade].\n */\n constructor(string memory name, string memory version) {\n _name = name.toShortStringWithFallback(_nameFallback);\n _version = version.toShortStringWithFallback(_versionFallback);\n _hashedName = keccak256(bytes(name));\n _hashedVersion = keccak256(bytes(version));\n\n _cachedChainId = block.chainid;\n _cachedDomainSeparator = _buildDomainSeparator();\n _cachedThis = address(this);\n }\n\n /**\n * @dev Returns the domain separator for the current chain.\n */\n function _domainSeparatorV4() internal view returns (bytes32) {\n if (address(this) == _cachedThis && block.chainid == _cachedChainId) {\n return _cachedDomainSeparator;\n } else {\n return _buildDomainSeparator();\n }\n }\n\n function _buildDomainSeparator() private view returns (bytes32) {\n return keccak256(abi.encode(_TYPE_HASH, _hashedName, _hashedVersion, block.chainid, address(this)));\n }\n\n /**\n * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this\n * function returns the hash of the fully encoded EIP712 message for this domain.\n *\n * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:\n *\n * ```solidity\n * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(\n * keccak256(\"Mail(address to,string contents)\"),\n * mailTo,\n * keccak256(bytes(mailContents))\n * )));\n * address signer = ECDSA.recover(digest, signature);\n * ```\n */\n function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {\n return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);\n }\n\n /**\n * @dev See {EIP-5267}.\n *\n * _Available since v4.9._\n */\n function eip712Domain()\n public\n view\n virtual\n override\n returns (\n bytes1 fields,\n string memory name,\n string memory version,\n uint256 chainId,\n address verifyingContract,\n bytes32 salt,\n uint256[] memory extensions\n )\n {\n return (\n hex\"0f\", // 01111\n _name.toStringWithFallback(_nameFallback),\n _version.toStringWithFallback(_versionFallback),\n block.chainid,\n address(this),\n bytes32(0),\n new uint256[](0)\n );\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/math/Math.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1, \"Math: mulDiv overflow\");\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10 ** 64) {\n value /= 10 ** 64;\n result += 64;\n }\n if (value >= 10 ** 32) {\n value /= 10 ** 32;\n result += 32;\n }\n if (value >= 10 ** 16) {\n value /= 10 ** 16;\n result += 16;\n }\n if (value >= 10 ** 8) {\n value /= 10 ** 8;\n result += 8;\n }\n if (value >= 10 ** 4) {\n value /= 10 ** 4;\n result += 4;\n }\n if (value >= 10 ** 2) {\n value /= 10 ** 2;\n result += 2;\n }\n if (value >= 10 ** 1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/math/SafeCast.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SafeCast.sol)\n// This file was procedurally generated from scripts/generate/templates/SafeCast.js.\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow\n * checks.\n *\n * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can\n * easily result in undesired exploitation or bugs, since developers usually\n * assume that overflows raise errors. `SafeCast` restores this intuition by\n * reverting the transaction when such an operation overflows.\n *\n * Using this library instead of the unchecked operations eliminates an entire\n * class of bugs, so it's recommended to use it always.\n *\n * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing\n * all math on `uint256` and `int256` and then downcasting.\n */\nlibrary SafeCast {\n /**\n * @dev Returns the downcasted uint248 from uint256, reverting on\n * overflow (when the input is greater than largest uint248).\n *\n * Counterpart to Solidity's `uint248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toUint248(uint256 value) internal pure returns (uint248) {\n require(value <= type(uint248).max, \"SafeCast: value doesn't fit in 248 bits\");\n return uint248(value);\n }\n\n /**\n * @dev Returns the downcasted uint240 from uint256, reverting on\n * overflow (when the input is greater than largest uint240).\n *\n * Counterpart to Solidity's `uint240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toUint240(uint256 value) internal pure returns (uint240) {\n require(value <= type(uint240).max, \"SafeCast: value doesn't fit in 240 bits\");\n return uint240(value);\n }\n\n /**\n * @dev Returns the downcasted uint232 from uint256, reverting on\n * overflow (when the input is greater than largest uint232).\n *\n * Counterpart to Solidity's `uint232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toUint232(uint256 value) internal pure returns (uint232) {\n require(value <= type(uint232).max, \"SafeCast: value doesn't fit in 232 bits\");\n return uint232(value);\n }\n\n /**\n * @dev Returns the downcasted uint224 from uint256, reverting on\n * overflow (when the input is greater than largest uint224).\n *\n * Counterpart to Solidity's `uint224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.2._\n */\n function toUint224(uint256 value) internal pure returns (uint224) {\n require(value <= type(uint224).max, \"SafeCast: value doesn't fit in 224 bits\");\n return uint224(value);\n }\n\n /**\n * @dev Returns the downcasted uint216 from uint256, reverting on\n * overflow (when the input is greater than largest uint216).\n *\n * Counterpart to Solidity's `uint216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toUint216(uint256 value) internal pure returns (uint216) {\n require(value <= type(uint216).max, \"SafeCast: value doesn't fit in 216 bits\");\n return uint216(value);\n }\n\n /**\n * @dev Returns the downcasted uint208 from uint256, reverting on\n * overflow (when the input is greater than largest uint208).\n *\n * Counterpart to Solidity's `uint208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toUint208(uint256 value) internal pure returns (uint208) {\n require(value <= type(uint208).max, \"SafeCast: value doesn't fit in 208 bits\");\n return uint208(value);\n }\n\n /**\n * @dev Returns the downcasted uint200 from uint256, reverting on\n * overflow (when the input is greater than largest uint200).\n *\n * Counterpart to Solidity's `uint200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toUint200(uint256 value) internal pure returns (uint200) {\n require(value <= type(uint200).max, \"SafeCast: value doesn't fit in 200 bits\");\n return uint200(value);\n }\n\n /**\n * @dev Returns the downcasted uint192 from uint256, reverting on\n * overflow (when the input is greater than largest uint192).\n *\n * Counterpart to Solidity's `uint192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toUint192(uint256 value) internal pure returns (uint192) {\n require(value <= type(uint192).max, \"SafeCast: value doesn't fit in 192 bits\");\n return uint192(value);\n }\n\n /**\n * @dev Returns the downcasted uint184 from uint256, reverting on\n * overflow (when the input is greater than largest uint184).\n *\n * Counterpart to Solidity's `uint184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toUint184(uint256 value) internal pure returns (uint184) {\n require(value <= type(uint184).max, \"SafeCast: value doesn't fit in 184 bits\");\n return uint184(value);\n }\n\n /**\n * @dev Returns the downcasted uint176 from uint256, reverting on\n * overflow (when the input is greater than largest uint176).\n *\n * Counterpart to Solidity's `uint176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toUint176(uint256 value) internal pure returns (uint176) {\n require(value <= type(uint176).max, \"SafeCast: value doesn't fit in 176 bits\");\n return uint176(value);\n }\n\n /**\n * @dev Returns the downcasted uint168 from uint256, reverting on\n * overflow (when the input is greater than largest uint168).\n *\n * Counterpart to Solidity's `uint168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toUint168(uint256 value) internal pure returns (uint168) {\n require(value <= type(uint168).max, \"SafeCast: value doesn't fit in 168 bits\");\n return uint168(value);\n }\n\n /**\n * @dev Returns the downcasted uint160 from uint256, reverting on\n * overflow (when the input is greater than largest uint160).\n *\n * Counterpart to Solidity's `uint160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toUint160(uint256 value) internal pure returns (uint160) {\n require(value <= type(uint160).max, \"SafeCast: value doesn't fit in 160 bits\");\n return uint160(value);\n }\n\n /**\n * @dev Returns the downcasted uint152 from uint256, reverting on\n * overflow (when the input is greater than largest uint152).\n *\n * Counterpart to Solidity's `uint152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toUint152(uint256 value) internal pure returns (uint152) {\n require(value <= type(uint152).max, \"SafeCast: value doesn't fit in 152 bits\");\n return uint152(value);\n }\n\n /**\n * @dev Returns the downcasted uint144 from uint256, reverting on\n * overflow (when the input is greater than largest uint144).\n *\n * Counterpart to Solidity's `uint144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toUint144(uint256 value) internal pure returns (uint144) {\n require(value <= type(uint144).max, \"SafeCast: value doesn't fit in 144 bits\");\n return uint144(value);\n }\n\n /**\n * @dev Returns the downcasted uint136 from uint256, reverting on\n * overflow (when the input is greater than largest uint136).\n *\n * Counterpart to Solidity's `uint136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toUint136(uint256 value) internal pure returns (uint136) {\n require(value <= type(uint136).max, \"SafeCast: value doesn't fit in 136 bits\");\n return uint136(value);\n }\n\n /**\n * @dev Returns the downcasted uint128 from uint256, reverting on\n * overflow (when the input is greater than largest uint128).\n *\n * Counterpart to Solidity's `uint128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v2.5._\n */\n function toUint128(uint256 value) internal pure returns (uint128) {\n require(value <= type(uint128).max, \"SafeCast: value doesn't fit in 128 bits\");\n return uint128(value);\n }\n\n /**\n * @dev Returns the downcasted uint120 from uint256, reverting on\n * overflow (when the input is greater than largest uint120).\n *\n * Counterpart to Solidity's `uint120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toUint120(uint256 value) internal pure returns (uint120) {\n require(value <= type(uint120).max, \"SafeCast: value doesn't fit in 120 bits\");\n return uint120(value);\n }\n\n /**\n * @dev Returns the downcasted uint112 from uint256, reverting on\n * overflow (when the input is greater than largest uint112).\n *\n * Counterpart to Solidity's `uint112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toUint112(uint256 value) internal pure returns (uint112) {\n require(value <= type(uint112).max, \"SafeCast: value doesn't fit in 112 bits\");\n return uint112(value);\n }\n\n /**\n * @dev Returns the downcasted uint104 from uint256, reverting on\n * overflow (when the input is greater than largest uint104).\n *\n * Counterpart to Solidity's `uint104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toUint104(uint256 value) internal pure returns (uint104) {\n require(value <= type(uint104).max, \"SafeCast: value doesn't fit in 104 bits\");\n return uint104(value);\n }\n\n /**\n * @dev Returns the downcasted uint96 from uint256, reverting on\n * overflow (when the input is greater than largest uint96).\n *\n * Counterpart to Solidity's `uint96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.2._\n */\n function toUint96(uint256 value) internal pure returns (uint96) {\n require(value <= type(uint96).max, \"SafeCast: value doesn't fit in 96 bits\");\n return uint96(value);\n }\n\n /**\n * @dev Returns the downcasted uint88 from uint256, reverting on\n * overflow (when the input is greater than largest uint88).\n *\n * Counterpart to Solidity's `uint88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toUint88(uint256 value) internal pure returns (uint88) {\n require(value <= type(uint88).max, \"SafeCast: value doesn't fit in 88 bits\");\n return uint88(value);\n }\n\n /**\n * @dev Returns the downcasted uint80 from uint256, reverting on\n * overflow (when the input is greater than largest uint80).\n *\n * Counterpart to Solidity's `uint80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toUint80(uint256 value) internal pure returns (uint80) {\n require(value <= type(uint80).max, \"SafeCast: value doesn't fit in 80 bits\");\n return uint80(value);\n }\n\n /**\n * @dev Returns the downcasted uint72 from uint256, reverting on\n * overflow (when the input is greater than largest uint72).\n *\n * Counterpart to Solidity's `uint72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toUint72(uint256 value) internal pure returns (uint72) {\n require(value <= type(uint72).max, \"SafeCast: value doesn't fit in 72 bits\");\n return uint72(value);\n }\n\n /**\n * @dev Returns the downcasted uint64 from uint256, reverting on\n * overflow (when the input is greater than largest uint64).\n *\n * Counterpart to Solidity's `uint64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v2.5._\n */\n function toUint64(uint256 value) internal pure returns (uint64) {\n require(value <= type(uint64).max, \"SafeCast: value doesn't fit in 64 bits\");\n return uint64(value);\n }\n\n /**\n * @dev Returns the downcasted uint56 from uint256, reverting on\n * overflow (when the input is greater than largest uint56).\n *\n * Counterpart to Solidity's `uint56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toUint56(uint256 value) internal pure returns (uint56) {\n require(value <= type(uint56).max, \"SafeCast: value doesn't fit in 56 bits\");\n return uint56(value);\n }\n\n /**\n * @dev Returns the downcasted uint48 from uint256, reverting on\n * overflow (when the input is greater than largest uint48).\n *\n * Counterpart to Solidity's `uint48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toUint48(uint256 value) internal pure returns (uint48) {\n require(value <= type(uint48).max, \"SafeCast: value doesn't fit in 48 bits\");\n return uint48(value);\n }\n\n /**\n * @dev Returns the downcasted uint40 from uint256, reverting on\n * overflow (when the input is greater than largest uint40).\n *\n * Counterpart to Solidity's `uint40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toUint40(uint256 value) internal pure returns (uint40) {\n require(value <= type(uint40).max, \"SafeCast: value doesn't fit in 40 bits\");\n return uint40(value);\n }\n\n /**\n * @dev Returns the downcasted uint32 from uint256, reverting on\n * overflow (when the input is greater than largest uint32).\n *\n * Counterpart to Solidity's `uint32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v2.5._\n */\n function toUint32(uint256 value) internal pure returns (uint32) {\n require(value <= type(uint32).max, \"SafeCast: value doesn't fit in 32 bits\");\n return uint32(value);\n }\n\n /**\n * @dev Returns the downcasted uint24 from uint256, reverting on\n * overflow (when the input is greater than largest uint24).\n *\n * Counterpart to Solidity's `uint24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toUint24(uint256 value) internal pure returns (uint24) {\n require(value <= type(uint24).max, \"SafeCast: value doesn't fit in 24 bits\");\n return uint24(value);\n }\n\n /**\n * @dev Returns the downcasted uint16 from uint256, reverting on\n * overflow (when the input is greater than largest uint16).\n *\n * Counterpart to Solidity's `uint16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v2.5._\n */\n function toUint16(uint256 value) internal pure returns (uint16) {\n require(value <= type(uint16).max, \"SafeCast: value doesn't fit in 16 bits\");\n return uint16(value);\n }\n\n /**\n * @dev Returns the downcasted uint8 from uint256, reverting on\n * overflow (when the input is greater than largest uint8).\n *\n * Counterpart to Solidity's `uint8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v2.5._\n */\n function toUint8(uint256 value) internal pure returns (uint8) {\n require(value <= type(uint8).max, \"SafeCast: value doesn't fit in 8 bits\");\n return uint8(value);\n }\n\n /**\n * @dev Converts a signed int256 into an unsigned uint256.\n *\n * Requirements:\n *\n * - input must be greater than or equal to 0.\n *\n * _Available since v3.0._\n */\n function toUint256(int256 value) internal pure returns (uint256) {\n require(value >= 0, \"SafeCast: value must be positive\");\n return uint256(value);\n }\n\n /**\n * @dev Returns the downcasted int248 from int256, reverting on\n * overflow (when the input is less than smallest int248 or\n * greater than largest int248).\n *\n * Counterpart to Solidity's `int248` operator.\n *\n * Requirements:\n *\n * - input must fit into 248 bits\n *\n * _Available since v4.7._\n */\n function toInt248(int256 value) internal pure returns (int248 downcasted) {\n downcasted = int248(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 248 bits\");\n }\n\n /**\n * @dev Returns the downcasted int240 from int256, reverting on\n * overflow (when the input is less than smallest int240 or\n * greater than largest int240).\n *\n * Counterpart to Solidity's `int240` operator.\n *\n * Requirements:\n *\n * - input must fit into 240 bits\n *\n * _Available since v4.7._\n */\n function toInt240(int256 value) internal pure returns (int240 downcasted) {\n downcasted = int240(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 240 bits\");\n }\n\n /**\n * @dev Returns the downcasted int232 from int256, reverting on\n * overflow (when the input is less than smallest int232 or\n * greater than largest int232).\n *\n * Counterpart to Solidity's `int232` operator.\n *\n * Requirements:\n *\n * - input must fit into 232 bits\n *\n * _Available since v4.7._\n */\n function toInt232(int256 value) internal pure returns (int232 downcasted) {\n downcasted = int232(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 232 bits\");\n }\n\n /**\n * @dev Returns the downcasted int224 from int256, reverting on\n * overflow (when the input is less than smallest int224 or\n * greater than largest int224).\n *\n * Counterpart to Solidity's `int224` operator.\n *\n * Requirements:\n *\n * - input must fit into 224 bits\n *\n * _Available since v4.7._\n */\n function toInt224(int256 value) internal pure returns (int224 downcasted) {\n downcasted = int224(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 224 bits\");\n }\n\n /**\n * @dev Returns the downcasted int216 from int256, reverting on\n * overflow (when the input is less than smallest int216 or\n * greater than largest int216).\n *\n * Counterpart to Solidity's `int216` operator.\n *\n * Requirements:\n *\n * - input must fit into 216 bits\n *\n * _Available since v4.7._\n */\n function toInt216(int256 value) internal pure returns (int216 downcasted) {\n downcasted = int216(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 216 bits\");\n }\n\n /**\n * @dev Returns the downcasted int208 from int256, reverting on\n * overflow (when the input is less than smallest int208 or\n * greater than largest int208).\n *\n * Counterpart to Solidity's `int208` operator.\n *\n * Requirements:\n *\n * - input must fit into 208 bits\n *\n * _Available since v4.7._\n */\n function toInt208(int256 value) internal pure returns (int208 downcasted) {\n downcasted = int208(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 208 bits\");\n }\n\n /**\n * @dev Returns the downcasted int200 from int256, reverting on\n * overflow (when the input is less than smallest int200 or\n * greater than largest int200).\n *\n * Counterpart to Solidity's `int200` operator.\n *\n * Requirements:\n *\n * - input must fit into 200 bits\n *\n * _Available since v4.7._\n */\n function toInt200(int256 value) internal pure returns (int200 downcasted) {\n downcasted = int200(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 200 bits\");\n }\n\n /**\n * @dev Returns the downcasted int192 from int256, reverting on\n * overflow (when the input is less than smallest int192 or\n * greater than largest int192).\n *\n * Counterpart to Solidity's `int192` operator.\n *\n * Requirements:\n *\n * - input must fit into 192 bits\n *\n * _Available since v4.7._\n */\n function toInt192(int256 value) internal pure returns (int192 downcasted) {\n downcasted = int192(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 192 bits\");\n }\n\n /**\n * @dev Returns the downcasted int184 from int256, reverting on\n * overflow (when the input is less than smallest int184 or\n * greater than largest int184).\n *\n * Counterpart to Solidity's `int184` operator.\n *\n * Requirements:\n *\n * - input must fit into 184 bits\n *\n * _Available since v4.7._\n */\n function toInt184(int256 value) internal pure returns (int184 downcasted) {\n downcasted = int184(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 184 bits\");\n }\n\n /**\n * @dev Returns the downcasted int176 from int256, reverting on\n * overflow (when the input is less than smallest int176 or\n * greater than largest int176).\n *\n * Counterpart to Solidity's `int176` operator.\n *\n * Requirements:\n *\n * - input must fit into 176 bits\n *\n * _Available since v4.7._\n */\n function toInt176(int256 value) internal pure returns (int176 downcasted) {\n downcasted = int176(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 176 bits\");\n }\n\n /**\n * @dev Returns the downcasted int168 from int256, reverting on\n * overflow (when the input is less than smallest int168 or\n * greater than largest int168).\n *\n * Counterpart to Solidity's `int168` operator.\n *\n * Requirements:\n *\n * - input must fit into 168 bits\n *\n * _Available since v4.7._\n */\n function toInt168(int256 value) internal pure returns (int168 downcasted) {\n downcasted = int168(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 168 bits\");\n }\n\n /**\n * @dev Returns the downcasted int160 from int256, reverting on\n * overflow (when the input is less than smallest int160 or\n * greater than largest int160).\n *\n * Counterpart to Solidity's `int160` operator.\n *\n * Requirements:\n *\n * - input must fit into 160 bits\n *\n * _Available since v4.7._\n */\n function toInt160(int256 value) internal pure returns (int160 downcasted) {\n downcasted = int160(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 160 bits\");\n }\n\n /**\n * @dev Returns the downcasted int152 from int256, reverting on\n * overflow (when the input is less than smallest int152 or\n * greater than largest int152).\n *\n * Counterpart to Solidity's `int152` operator.\n *\n * Requirements:\n *\n * - input must fit into 152 bits\n *\n * _Available since v4.7._\n */\n function toInt152(int256 value) internal pure returns (int152 downcasted) {\n downcasted = int152(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 152 bits\");\n }\n\n /**\n * @dev Returns the downcasted int144 from int256, reverting on\n * overflow (when the input is less than smallest int144 or\n * greater than largest int144).\n *\n * Counterpart to Solidity's `int144` operator.\n *\n * Requirements:\n *\n * - input must fit into 144 bits\n *\n * _Available since v4.7._\n */\n function toInt144(int256 value) internal pure returns (int144 downcasted) {\n downcasted = int144(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 144 bits\");\n }\n\n /**\n * @dev Returns the downcasted int136 from int256, reverting on\n * overflow (when the input is less than smallest int136 or\n * greater than largest int136).\n *\n * Counterpart to Solidity's `int136` operator.\n *\n * Requirements:\n *\n * - input must fit into 136 bits\n *\n * _Available since v4.7._\n */\n function toInt136(int256 value) internal pure returns (int136 downcasted) {\n downcasted = int136(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 136 bits\");\n }\n\n /**\n * @dev Returns the downcasted int128 from int256, reverting on\n * overflow (when the input is less than smallest int128 or\n * greater than largest int128).\n *\n * Counterpart to Solidity's `int128` operator.\n *\n * Requirements:\n *\n * - input must fit into 128 bits\n *\n * _Available since v3.1._\n */\n function toInt128(int256 value) internal pure returns (int128 downcasted) {\n downcasted = int128(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 128 bits\");\n }\n\n /**\n * @dev Returns the downcasted int120 from int256, reverting on\n * overflow (when the input is less than smallest int120 or\n * greater than largest int120).\n *\n * Counterpart to Solidity's `int120` operator.\n *\n * Requirements:\n *\n * - input must fit into 120 bits\n *\n * _Available since v4.7._\n */\n function toInt120(int256 value) internal pure returns (int120 downcasted) {\n downcasted = int120(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 120 bits\");\n }\n\n /**\n * @dev Returns the downcasted int112 from int256, reverting on\n * overflow (when the input is less than smallest int112 or\n * greater than largest int112).\n *\n * Counterpart to Solidity's `int112` operator.\n *\n * Requirements:\n *\n * - input must fit into 112 bits\n *\n * _Available since v4.7._\n */\n function toInt112(int256 value) internal pure returns (int112 downcasted) {\n downcasted = int112(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 112 bits\");\n }\n\n /**\n * @dev Returns the downcasted int104 from int256, reverting on\n * overflow (when the input is less than smallest int104 or\n * greater than largest int104).\n *\n * Counterpart to Solidity's `int104` operator.\n *\n * Requirements:\n *\n * - input must fit into 104 bits\n *\n * _Available since v4.7._\n */\n function toInt104(int256 value) internal pure returns (int104 downcasted) {\n downcasted = int104(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 104 bits\");\n }\n\n /**\n * @dev Returns the downcasted int96 from int256, reverting on\n * overflow (when the input is less than smallest int96 or\n * greater than largest int96).\n *\n * Counterpart to Solidity's `int96` operator.\n *\n * Requirements:\n *\n * - input must fit into 96 bits\n *\n * _Available since v4.7._\n */\n function toInt96(int256 value) internal pure returns (int96 downcasted) {\n downcasted = int96(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 96 bits\");\n }\n\n /**\n * @dev Returns the downcasted int88 from int256, reverting on\n * overflow (when the input is less than smallest int88 or\n * greater than largest int88).\n *\n * Counterpart to Solidity's `int88` operator.\n *\n * Requirements:\n *\n * - input must fit into 88 bits\n *\n * _Available since v4.7._\n */\n function toInt88(int256 value) internal pure returns (int88 downcasted) {\n downcasted = int88(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 88 bits\");\n }\n\n /**\n * @dev Returns the downcasted int80 from int256, reverting on\n * overflow (when the input is less than smallest int80 or\n * greater than largest int80).\n *\n * Counterpart to Solidity's `int80` operator.\n *\n * Requirements:\n *\n * - input must fit into 80 bits\n *\n * _Available since v4.7._\n */\n function toInt80(int256 value) internal pure returns (int80 downcasted) {\n downcasted = int80(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 80 bits\");\n }\n\n /**\n * @dev Returns the downcasted int72 from int256, reverting on\n * overflow (when the input is less than smallest int72 or\n * greater than largest int72).\n *\n * Counterpart to Solidity's `int72` operator.\n *\n * Requirements:\n *\n * - input must fit into 72 bits\n *\n * _Available since v4.7._\n */\n function toInt72(int256 value) internal pure returns (int72 downcasted) {\n downcasted = int72(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 72 bits\");\n }\n\n /**\n * @dev Returns the downcasted int64 from int256, reverting on\n * overflow (when the input is less than smallest int64 or\n * greater than largest int64).\n *\n * Counterpart to Solidity's `int64` operator.\n *\n * Requirements:\n *\n * - input must fit into 64 bits\n *\n * _Available since v3.1._\n */\n function toInt64(int256 value) internal pure returns (int64 downcasted) {\n downcasted = int64(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 64 bits\");\n }\n\n /**\n * @dev Returns the downcasted int56 from int256, reverting on\n * overflow (when the input is less than smallest int56 or\n * greater than largest int56).\n *\n * Counterpart to Solidity's `int56` operator.\n *\n * Requirements:\n *\n * - input must fit into 56 bits\n *\n * _Available since v4.7._\n */\n function toInt56(int256 value) internal pure returns (int56 downcasted) {\n downcasted = int56(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 56 bits\");\n }\n\n /**\n * @dev Returns the downcasted int48 from int256, reverting on\n * overflow (when the input is less than smallest int48 or\n * greater than largest int48).\n *\n * Counterpart to Solidity's `int48` operator.\n *\n * Requirements:\n *\n * - input must fit into 48 bits\n *\n * _Available since v4.7._\n */\n function toInt48(int256 value) internal pure returns (int48 downcasted) {\n downcasted = int48(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 48 bits\");\n }\n\n /**\n * @dev Returns the downcasted int40 from int256, reverting on\n * overflow (when the input is less than smallest int40 or\n * greater than largest int40).\n *\n * Counterpart to Solidity's `int40` operator.\n *\n * Requirements:\n *\n * - input must fit into 40 bits\n *\n * _Available since v4.7._\n */\n function toInt40(int256 value) internal pure returns (int40 downcasted) {\n downcasted = int40(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 40 bits\");\n }\n\n /**\n * @dev Returns the downcasted int32 from int256, reverting on\n * overflow (when the input is less than smallest int32 or\n * greater than largest int32).\n *\n * Counterpart to Solidity's `int32` operator.\n *\n * Requirements:\n *\n * - input must fit into 32 bits\n *\n * _Available since v3.1._\n */\n function toInt32(int256 value) internal pure returns (int32 downcasted) {\n downcasted = int32(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 32 bits\");\n }\n\n /**\n * @dev Returns the downcasted int24 from int256, reverting on\n * overflow (when the input is less than smallest int24 or\n * greater than largest int24).\n *\n * Counterpart to Solidity's `int24` operator.\n *\n * Requirements:\n *\n * - input must fit into 24 bits\n *\n * _Available since v4.7._\n */\n function toInt24(int256 value) internal pure returns (int24 downcasted) {\n downcasted = int24(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 24 bits\");\n }\n\n /**\n * @dev Returns the downcasted int16 from int256, reverting on\n * overflow (when the input is less than smallest int16 or\n * greater than largest int16).\n *\n * Counterpart to Solidity's `int16` operator.\n *\n * Requirements:\n *\n * - input must fit into 16 bits\n *\n * _Available since v3.1._\n */\n function toInt16(int256 value) internal pure returns (int16 downcasted) {\n downcasted = int16(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 16 bits\");\n }\n\n /**\n * @dev Returns the downcasted int8 from int256, reverting on\n * overflow (when the input is less than smallest int8 or\n * greater than largest int8).\n *\n * Counterpart to Solidity's `int8` operator.\n *\n * Requirements:\n *\n * - input must fit into 8 bits\n *\n * _Available since v3.1._\n */\n function toInt8(int256 value) internal pure returns (int8 downcasted) {\n downcasted = int8(value);\n require(downcasted == value, \"SafeCast: value doesn't fit in 8 bits\");\n }\n\n /**\n * @dev Converts an unsigned uint256 into a signed int256.\n *\n * Requirements:\n *\n * - input must be less than or equal to maxInt256.\n *\n * _Available since v3.0._\n */\n function toInt256(uint256 value) internal pure returns (int256) {\n // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive\n require(value <= uint256(type(int256).max), \"SafeCast: value doesn't fit in an int256\");\n return int256(value);\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts/utils/math/SignedMath.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n /**\n * @dev Returns the largest of two signed numbers.\n */\n function max(int256 a, int256 b) internal pure returns (int256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two signed numbers.\n */\n function min(int256 a, int256 b) internal pure returns (int256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two signed numbers without overflow.\n * The result is rounded towards zero.\n */\n function average(int256 a, int256 b) internal pure returns (int256) {\n // Formula from the book \"Hacker's Delight\"\n int256 x = (a & b) + ((a ^ b) >> 1);\n return x + (int256(uint256(x) >> 255) & (a ^ b));\n }\n\n /**\n * @dev Returns the absolute unsigned value of a signed value.\n */\n function abs(int256 n) internal pure returns (uint256) {\n unchecked {\n // must be unchecked in order to support `n = type(int256).min`\n return uint256(n >= 0 ? n : -n);\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./OwnableUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership} and {acceptOwnership}.\n *\n * This module is used through inheritance. It will make available all functions\n * from parent (Ownable).\n */\nabstract contract Ownable2StepUpgradeable is Initializable, OwnableUpgradeable {\n function __Ownable2Step_init() internal onlyInitializing {\n __Ownable_init_unchained();\n }\n\n function __Ownable2Step_init_unchained() internal onlyInitializing {\n }\n address private _pendingOwner;\n\n event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Returns the address of the pending owner.\n */\n function pendingOwner() public view virtual returns (address) {\n return _pendingOwner;\n }\n\n /**\n * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual override onlyOwner {\n _pendingOwner = newOwner;\n emit OwnershipTransferStarted(owner(), newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual override {\n delete _pendingOwner;\n super._transferOwnership(newOwner);\n }\n\n /**\n * @dev The new owner accepts the ownership transfer.\n */\n function acceptOwnership() public virtual {\n address sender = _msgSender();\n require(pendingOwner() == sender, \"Ownable2Step: caller is not the new owner\");\n _transferOwnership(sender);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n function __Ownable_init() internal onlyInitializing {\n __Ownable_init_unchained();\n }\n\n function __Ownable_init_unchained() internal onlyInitializing {\n _transferOwnership(_msgSender());\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[49] private __gap;\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n * function initialize() initializer public {\n * __ERC20_init(\"MyToken\", \"MTK\");\n * }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n * function initializeV2() reinitializer(2) public {\n * __ERC20Permit_init(\"MyToken\");\n * }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n * _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n /**\n * @dev Indicates that the contract has been initialized.\n * @custom:oz-retyped-from bool\n */\n uint8 private _initialized;\n\n /**\n * @dev Indicates that the contract is in the process of being initialized.\n */\n bool private _initializing;\n\n /**\n * @dev Triggered when the contract has been initialized or reinitialized.\n */\n event Initialized(uint8 version);\n\n /**\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n * `onlyInitializing` functions can be used to initialize parent contracts.\n *\n * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\n * constructor.\n *\n * Emits an {Initialized} event.\n */\n modifier initializer() {\n bool isTopLevelCall = !_initializing;\n require(\n (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\n \"Initializable: contract is already initialized\"\n );\n _initialized = 1;\n if (isTopLevelCall) {\n _initializing = true;\n }\n _;\n if (isTopLevelCall) {\n _initializing = false;\n emit Initialized(1);\n }\n }\n\n /**\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n * used to initialize parent contracts.\n *\n * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n * are added through upgrades and that require initialization.\n *\n * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n * cannot be nested. If one is invoked in the context of another, execution will revert.\n *\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n * a contract, executing them in the right order is up to the developer or operator.\n *\n * WARNING: setting the version to 255 will prevent any future reinitialization.\n *\n * Emits an {Initialized} event.\n */\n modifier reinitializer(uint8 version) {\n require(!_initializing && _initialized < version, \"Initializable: contract is already initialized\");\n _initialized = version;\n _initializing = true;\n _;\n _initializing = false;\n emit Initialized(version);\n }\n\n /**\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\n */\n modifier onlyInitializing() {\n require(_initializing, \"Initializable: contract is not initializing\");\n _;\n }\n\n /**\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n * through proxies.\n *\n * Emits an {Initialized} event the first time it is successfully executed.\n */\n function _disableInitializers() internal virtual {\n require(!_initializing, \"Initializable: contract is initializing\");\n if (_initialized != type(uint8).max) {\n _initialized = type(uint8).max;\n emit Initialized(type(uint8).max);\n }\n }\n\n /**\n * @dev Returns the highest version that has been initialized. See {reinitializer}.\n */\n function _getInitializedVersion() internal view returns (uint8) {\n return _initialized;\n }\n\n /**\n * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n */\n function _isInitializing() internal view returns (bool) {\n return _initializing;\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n *\n * Furthermore, `isContract` will also return true if the target contract within\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n * which only has an effect at the end of a transaction.\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n" + }, + "node_modules/@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\nimport \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n function __Context_init() internal onlyInitializing {\n }\n\n function __Context_init_unchained() internal onlyInitializing {\n }\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n /**\n * @dev This empty reserved space is put in place to allow future versions to add new\n * variables without shifting down storage in the inheritance chain.\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n */\n uint256[50] private __gap;\n}\n" + } + }, + "settings": { + "remappings": [ + "@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/", + "@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/", + "@rari-capital/solmate/=node_modules/@rari-capital/solmate/", + "forge-std/=node_modules/forge-std/src/", + "ds-test/=node_modules/ds-test/src/", + "hardhat-deploy/=node_modules/hardhat-deploy/", + "hardhat/=node_modules/hardhat/" + ], + "optimizer": { + "enabled": true, + "runs": 10000 + }, + "metadata": { + "useLiteralContent": false, + "bytecodeHash": "none" + }, + "outputSelection": { + "*": { + "": [ + "ast" + ], + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "storageLayout" + ] + } + }, + "evmVersion": "london", + "viaIR": false, + "libraries": {} + } +} \ No newline at end of file diff --git a/packages/contracts/hardhat.config.ts b/packages/contracts/hardhat.config.ts index f9e2721652..bb1650de4e 100644 --- a/packages/contracts/hardhat.config.ts +++ b/packages/contracts/hardhat.config.ts @@ -37,7 +37,7 @@ const config: HardhatUserConfig = { deploy: ['./deploy/L1'], }, kroma: { - url: process.env.L2_RPC_MAINNET || '', + url: process.env.L2_RPC_KROMA_MAINNET || '', accounts: [ process.env.PRIVATE_KEY_DEPLOYER_MAINNET || ethers.constants.HashZero, ], @@ -100,6 +100,10 @@ const config: HardhatUserConfig = { live: false, url: process.env.RPC_URL || 'http://localhost:9545', accounts: [PRIVATE_KEY_DEPLOYER_DEVNET], + saveDeployments: true, + companionNetworks: { + l1: 'devnetL1', + }, deploy: ['./deploy/L2'], }, }, diff --git a/packages/contracts/scripts/rename-deploy-scripts.ts b/packages/contracts/scripts/rename-deploy-scripts.ts index 1f42599e8c..18d5e51b5e 100644 --- a/packages/contracts/scripts/rename-deploy-scripts.ts +++ b/packages/contracts/scripts/rename-deploy-scripts.ts @@ -25,7 +25,11 @@ const L1_ORDERED_NAMES = [ 'SecurityCouncilToken', 'TimeLock', 'UpgradeGovernor', - 'L1GovernanceToken' + 'L1GovernanceTokenProxy', + 'L1MintManager', + 'L1GovernanceToken', + 'AssetManager', + 'ValidatorManager', ] const L2_ORDERED_NAMES = [ 'L1Block', @@ -39,6 +43,8 @@ const L2_ORDERED_NAMES = [ 'L1FeeVault', 'KromaMintableERC20Factory', 'KromaMintableERC721Factory', + 'GovernanceTokenProxy', + 'MintManager', 'GovernanceToken', ] diff --git a/packages/contracts/scripts/storage-snapshot.sh b/packages/contracts/scripts/storage-snapshot.sh index 5d7d900694..379cb15da6 100755 --- a/packages/contracts/scripts/storage-snapshot.sh +++ b/packages/contracts/scripts/storage-snapshot.sh @@ -12,6 +12,8 @@ fi contracts=( contracts/L1/Colosseum.sol:Colosseum contracts/L1/SecurityCouncil.sol:SecurityCouncil + contracts/L1/AssetManager.sol:AssetManager + contracts/L1/ValidatorManager.sol:ValidatorManager contracts/L1/ValidatorPool.sol:ValidatorPool contracts/L1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger contracts/L1/L1StandardBridge.sol:L1StandardBridge @@ -30,10 +32,12 @@ contracts=( contracts/universal/Proxy.sol:Proxy contracts/universal/KromaMintableERC20.sol:KromaMintableERC20 contracts/universal/KromaMintableERC20Factory.sol:KromaMintableERC20Factory + contracts/universal/KromaVestingWallet.sol:KromaVestingWallet contracts/governance/SecurityCouncilToken.sol:SecurityCouncilToken contracts/governance/TimeLock.sol:TimeLock contracts/governance/UpgradeGovernor.sol:UpgradeGovernor contracts/governance/GovernanceToken.sol:GovernanceToken + contracts/governance/MintManager.sol:MintManager ) dir=$(dirname "$0") diff --git a/packages/contracts/src/constants.ts b/packages/contracts/src/constants.ts index 32c51cecc9..494bafcc17 100644 --- a/packages/contracts/src/constants.ts +++ b/packages/contracts/src/constants.ts @@ -1,4 +1,4 @@ -import {ethers} from "ethers"; +import { ethers } from 'ethers' /** * Predeploys are Solidity contracts that are injected into the initial L2 state and provide @@ -18,7 +18,7 @@ export const predeploys = { L2ERC721Bridge: '0x420000000000000000000000000000000000000A', KromaMintableERC20Factory: '0x420000000000000000000000000000000000000B', KromaMintableERC721Factory: '0x420000000000000000000000000000000000000C', - GovernanceToken: '0x42000000000000000000000000000000000000ff', + Create2Deployer: '0x13b0D85CcB8bf860b6b79AF3029fCA081AE9beF2', } const uint128Max = ethers.BigNumber.from('0xffffffffffffffffffffffffffffffff') diff --git a/packages/contracts/src/contract-artifacts.ts b/packages/contracts/src/contract-artifacts.ts index e56d188e2a..a99dca78a5 100644 --- a/packages/contracts/src/contract-artifacts.ts +++ b/packages/contracts/src/contract-artifacts.ts @@ -54,6 +54,12 @@ } catch {} + let MintManager + try { + MintManager = require('../artifacts/contracts/governance/MintManager.sol/MintManager.json') + } catch {} + + let SecurityCouncilToken try { SecurityCouncilToken = require('../artifacts/contracts/governance/SecurityCouncilToken.sol/SecurityCouncilToken.json') @@ -72,15 +78,33 @@ } catch {} + let AssetManager + try { + AssetManager = require('../artifacts/contracts/L1/AssetManager.sol/AssetManager.json') + } catch {} + + let Colosseum try { Colosseum = require('../artifacts/contracts/L1/Colosseum.sol/Colosseum.json') } catch {} + let IAssetManager + try { + IAssetManager = require('../artifacts/contracts/L1/interfaces/IAssetManager.sol/IAssetManager.json') + } catch {} + + + let IValidatorManager + try { + IValidatorManager = require('../artifacts/contracts/L1/interfaces/IValidatorManager.sol/IValidatorManager.json') + } catch {} + + let IZKMerkleTrie try { - IZKMerkleTrie = require('../artifacts/contracts/L1/IZKMerkleTrie.sol/IZKMerkleTrie.json') + IZKMerkleTrie = require('../artifacts/contracts/L1/interfaces/IZKMerkleTrie.sol/IZKMerkleTrie.json') } catch {} @@ -132,6 +156,12 @@ } catch {} + let ValidatorManager + try { + ValidatorManager = require('../artifacts/contracts/L1/ValidatorManager.sol/ValidatorManager.json') + } catch {} + + let ValidatorPool try { ValidatorPool = require('../artifacts/contracts/L1/ValidatorPool.sol/ValidatorPool.json') @@ -222,6 +252,18 @@ } catch {} + let Atan2 + try { + Atan2 = require('../artifacts/contracts/libraries/Atan2.sol/Atan2.json') + } catch {} + + + let BalancedWeightTree + try { + BalancedWeightTree = require('../artifacts/contracts/libraries/BalancedWeightTree.sol/BalancedWeightTree.json') + } catch {} + + let Burn try { Burn = require('../artifacts/contracts/libraries/Burn.sol/Burn.json') @@ -294,6 +336,12 @@ } catch {} + let Uint128Math + try { + Uint128Math = require('../artifacts/contracts/libraries/Uint128Math.sol/Uint128Math.json') + } catch {} + + let ColosseumTestData try { ColosseumTestData = require('../artifacts/contracts/test/testdata/ColosseumTestData.sol/ColosseumTestData.json') @@ -412,10 +460,14 @@ EchidnaFuzzHashing, EchidnaFuzzKromaPortal, EchidnaFuzzResourceMetering, GovernanceToken, +MintManager, SecurityCouncilToken, TimeLock, UpgradeGovernor, +AssetManager, Colosseum, +IAssetManager, +IValidatorManager, IZKMerkleTrie, KromaPortal, L1CrossDomainMessenger, @@ -425,6 +477,7 @@ L2OutputOracle, ResourceMetering, SecurityCouncil, SystemConfig, +ValidatorManager, ValidatorPool, ZKMerkleTrie, IPoseidon2, @@ -440,6 +493,8 @@ L2ERC721Bridge, L2StandardBridge, L2ToL1MessagePasser, Arithmetic, +Atan2, +BalancedWeightTree, Burn, Bytes, Bytes32, @@ -452,6 +507,7 @@ Predeploys, RLPWriter, SafeCall, Types, +Uint128Math, ColosseumTestData, CrossDomainMessenger, ERC721Bridge, diff --git a/packages/contracts/src/deploy-config.ts b/packages/contracts/src/deploy-config.ts index 0141501f4c..a8686c07d2 100644 --- a/packages/contracts/src/deploy-config.ts +++ b/packages/contracts/src/deploy-config.ts @@ -91,6 +91,81 @@ interface RequiredDeployConfig { */ validatorPoolRoundDuration: number + /** + * The output index where ValidatorPool is terminated after in hex value. + */ + validatorPoolTerminateOutputIndex: string + + /** + * Address of the trusted validator. + */ + validatorManagerTrustedValidator: string + + /** + * Amount of the minimum register amount in hex value. + */ + validatorManagerMinRegisterAmount: string + + /** + * Amount of the minimum activation amount in hex value. + */ + validatorManagerMinActivateAmount: string + + /** + * The delay to finalize the commission rate change in seconds. + */ + validatorManagerCommissionChangeDelaySeconds: number + + /** + * The duration of one submission round in seconds. + */ + validatorManagerRoundDurationSeconds: number + + /** + * The duration of jail period in seconds in output non-submissions penalty. + */ + validatorManagerSoftJailPeriodSeconds: number + + /** + * The duration of jail period in seconds in slashing penalty. + */ + validatorManagerHardJailPeriodSeconds: number + + /** + * The threshold of output non-submission to be jailed. + */ + validatorManagerJailThreshold: number + + /** + * Max number of output finalizations when distributing reward. + */ + validatorManagerMaxFinalizations: number + + /** + * Amount of the base reward in hex value. + */ + validatorManagerBaseReward: string + + /** + * Address of the KGH NFT contract. + */ + assetManagerKgh: string + + /** + * Address of the validator reward vault. + */ + assetManagerVault: string + + /** + * The duration of minimum delegation period in seconds. + */ + assetManagerMinDelegationPeriod: number + + /** + * Amount of the bond amount in hex value. + */ + assetManagerBondAmount: string + /** * Output Oracle submission interval in L2 blocks. */ @@ -209,6 +284,16 @@ interface RequiredDeployConfig { * L2 : Governor voting period in block. */ l2GovernorVotingPeriodBlocks: number + + /** + * The salt to determine GovernanceTokenProxy address on L1 and L2. + */ + governanceTokenProxySalt: string + + /** + * The owner of MintManager on L1 and L2. + */ + mintManagerOwner: string } /** @@ -226,6 +311,9 @@ interface OptionalL1DeployConfig { l1GenesisBlockGasUsed: string l1GenesisBlockParentHash: string l1GenesisBlockBaseFeePerGas: string + governanceTokenNotUseCreate2: boolean + l1MintManagerRecipients: string[] + l1MintManagerShares: string[] } /** @@ -246,6 +334,8 @@ interface OptionalL2DeployConfig { gasPriceOracleOverhead: number gasPriceOracleScalar: number validatorRewardScalar: number + l2MintManagerRecipients: string[] + l2MintManagerShares: string[] } /** @@ -310,6 +400,51 @@ export const deployConfigSpec: { validatorPoolRoundDuration: { type: 'number', }, + validatorPoolTerminateOutputIndex: { + type: 'string', // uint256 + }, + validatorManagerTrustedValidator: { + type: 'address', + }, + validatorManagerMinRegisterAmount: { + type: 'string', // uint128 + }, + validatorManagerMinActivateAmount: { + type: 'string', // uint128 + }, + validatorManagerCommissionChangeDelaySeconds: { + type: 'number', + }, + validatorManagerRoundDurationSeconds: { + type: 'number', + }, + validatorManagerSoftJailPeriodSeconds: { + type: 'number', + }, + validatorManagerHardJailPeriodSeconds: { + type: 'number', + }, + validatorManagerJailThreshold: { + type: 'number', + }, + validatorManagerMaxFinalizations: { + type: 'number', + }, + validatorManagerBaseReward: { + type: 'string', // uint128 + }, + assetManagerKgh: { + type: 'address', + }, + assetManagerVault: { + type: 'address', + }, + assetManagerMinDelegationPeriod: { + type: 'number', + }, + assetManagerBondAmount: { + type: 'string', // uint128 + }, l2OutputOracleSubmissionInterval: { type: 'number', }, @@ -473,4 +608,15 @@ export const deployConfigSpec: { l2TimeLockMinDelaySeconds: { type: 'number', }, + governanceTokenNotUseCreate2: { + type: 'boolean', + default: false, + }, + governanceTokenProxySalt: { + type: 'string', // bytes32 + default: ethers.constants.HashZero, + }, + mintManagerOwner: { + type: 'address', + }, } diff --git a/packages/contracts/src/deploy-utils.ts b/packages/contracts/src/deploy-utils.ts index 9f668b49e0..be2cd36424 100644 --- a/packages/contracts/src/deploy-utils.ts +++ b/packages/contracts/src/deploy-utils.ts @@ -6,10 +6,13 @@ import { sleep } from '@kroma/core-utils' import '@kroma/hardhat-deploy-config' import '@nomiclabs/hardhat-ethers' import { Contract, ethers } from 'ethers' -import { ArtifactData } from 'hardhat-deploy/dist/types' +import { keccak256 } from 'ethers/lib/utils' import { HardhatRuntimeEnvironment } from 'hardhat/types' +import { ArtifactData } from 'hardhat-deploy/dist/types' import 'hardhat-deploy' +import { predeploys } from './constants' + const PROXY_IMPLEMENTATION_SLOT = '0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc' const PROXY_OWNER_SLOT = @@ -25,16 +28,14 @@ interface DeployOptions { } /** - * Wrapper around hardhat-deploy with some extra features. + * Deploys implementation contract and upgrades proxy to the deployed implementation contract. + * Upgrade is processed via ProxyAdmin contract. * * @param hre HardhatRuntimeEnvironment. * @param name Name to use for the deployment file. * @param opts Parameters for the deployment. - * @param opts.contract Name of the contract to deploy. - * @param opts.args Arguments to pass to the contract constructor. * @param opts.isProxyImpl Whether to update the implementation of the proxy. * @param opts.initArgs Arguments to pass to the proxy initializer. - * @param opts.postDeployAction Action to perform after the contract is deployed. * @returns A deployed contract object. */ export const deploy = async ( @@ -42,6 +43,134 @@ export const deploy = async ( name: string, opts: DeployOptions = {} ): Promise => { + const [created, newlyDeployed] = await deployImpl(hre, name, opts) + if (!newlyDeployed) { + return created + } + + if (opts.isProxyImpl) { + const { deployer } = await hre.getNamedAccounts() + const proxyName = name + 'Proxy' + const proxy = await getContractFromArtifact(hre, proxyName, { + signerOrProvider: deployer, + }) + const hasImpl = await hasImplementation(hre, proxy.address) + const admin = await getProxyAdmin(hre, proxy.address) + + let proxyAdmin = await hre.ethers.getContractAt('ProxyAdmin', admin) + const proxyOwner = await proxyAdmin.owner() + proxyAdmin = proxyAdmin.connect(hre.ethers.provider.getSigner(proxyOwner)) + + if (!opts.initArgs || hasImpl) { + console.log(`upgrading "${proxyName}" to ${created.address}`) + const tx = await proxyAdmin.upgrade(proxy.address, created.address) + await hre.ethers.provider.waitForTransaction(tx.hash) + } else { + console.log( + `upgrading "${proxyName}" to ${created.address} and initializing` + ) + + if (!opts.initializer) { + opts.initializer = 'initialize' + } + + // Ensure that the contract has the initialize function. + try { + created.interface.getFunction(opts.initializer) + } catch (error) { + throw new Error( + `deployed "${name}" does not have the function "${opts.initializer}"` + ) + } + + const tx = await proxyAdmin.upgradeAndCall( + proxy.address, + created.address, + created.interface.encodeFunctionData(opts.initializer, opts.initArgs) + ) + await hre.ethers.provider.waitForTransaction(tx.hash) + } + } + + return created +} + +/** + * Deploys implementation contract and upgrades proxy to the deployed implementation contract. + * Only used when proxy should be upgraded by deployer. + * + * @param hre HardhatRuntimeEnvironment. + * @param name Name to use for the deployment file. + * @param opts Parameters for the deployment. + * @param opts.initArgs Arguments to pass to the proxy initializer. + * @returns A deployed contract object. + */ +export const deployAndUpgradeByDeployer = async ( + hre: HardhatRuntimeEnvironment, + name: string, + opts: DeployOptions = {} +): Promise => { + const [created, newlyDeployed] = await deployImpl(hre, name, opts) + if (!newlyDeployed) { + return created + } + + const { deployer } = await hre.getNamedAccounts() + const proxyName = name + 'Proxy' + const proxy = await getContractFromArtifact(hre, proxyName, { + signerOrProvider: deployer, + }) + const hasImpl = await hasImplementation(hre, proxy.address) + + if (!opts.initArgs || hasImpl) { + console.log(`upgrading "${proxyName}" to ${created.address}`) + const tx = await proxy.upgradeTo(created.address) + await hre.ethers.provider.waitForTransaction(tx.hash) + } else { + console.log( + `upgrading "${proxyName}" to ${created.address} and initializing` + ) + + if (!opts.initializer) { + opts.initializer = 'initialize' + } + + // Ensure that the contract has the initialize function. + try { + created.interface.getFunction(opts.initializer) + } catch (error) { + throw new Error( + `deployed "${name}" does not have the function "${opts.initializer}"` + ) + } + + const tx = await proxy.upgradeToAndCall( + created.address, + created.interface.encodeFunctionData(opts.initializer, opts.initArgs) + ) + await hre.ethers.provider.waitForTransaction(tx.hash) + } + + return created +} + +/** + * Wrapper around hardhat-deploy with some extra features. + * + * @param hre HardhatRuntimeEnvironment. + * @param name Name to use for the deployment file. + * @param opts Parameters for the deployment. + * @param opts.contract Name of the contract to deploy. + * @param opts.args Arguments to pass to the contract constructor. + * @param opts.postDeployAction Action to perform after the contract is deployed. + * @returns A deployed contract object. + * @returns If the contract is newly deployed or not. + */ +const deployImpl = async ( + hre: HardhatRuntimeEnvironment, + name: string, + opts: DeployOptions = {} +): Promise<[Contract | null, boolean]> => { const { deployer } = await hre.getNamedAccounts() // Wrap in a try/catch in case there is not a deployConfig for the current network. @@ -72,7 +201,7 @@ export const deploy = async ( // If the contract is not newly deployed, do not proceed further. if (!result.newlyDeployed) { - return created + return [created, false] } // Always wait for the transaction to be mined, just in case. @@ -89,41 +218,7 @@ export const deploy = async ( await opts.postDeployAction(created) } - if (opts.isProxyImpl) { - const proxyName = name + 'Proxy' - const proxy = await getContractFromArtifact(hre, proxyName, { - signerOrProvider: deployer, - }) - const hasImpl = await hasImplementation(hre, proxy.address) - const admin = await getProxyAdmin(hre, proxy.address) - - let proxyAdmin = await hre.ethers.getContractAt('ProxyAdmin', admin) - const proxyOwner = await proxyAdmin.owner() - proxyAdmin = proxyAdmin.connect(hre.ethers.provider.getSigner(proxyOwner)) - - if (!opts.initArgs || hasImpl) { - console.log(`upgrading "${proxyName}" to ${created.address}`) - const tx = await proxyAdmin.upgrade(proxy.address, created.address) - await hre.ethers.provider.waitForTransaction(tx.hash) - } else { - console.log( - `upgrading "${proxyName}" to ${created.address} and initializing` - ) - - if (!opts.initializer) { - opts.initializer = 'initialize' - } - - const tx = await proxyAdmin.upgradeAndCall( - proxy.address, - created.address, - created.interface.encodeFunctionData(opts.initializer, opts.initArgs) - ) - await hre.ethers.provider.waitForTransaction(tx.hash) - } - } - - return created + return [created, true] } /** @@ -153,6 +248,118 @@ export const deployProxy = async ( }) } +/** + * Deploys proxy contract to deterministic address using CREATE2. + * Proxy name must end with "Proxy" + * + * @param hre HardhatRuntimeEnvironment. + * @param name Name to use for the proxy. + * @param admin Admin address of the proxy. + * @param salt Salt to determine the deployment address. + * @returns A deployed contract object. + */ +export const deployDeterministicProxy = async ( + hre: HardhatRuntimeEnvironment, + name: string, + admin: string, + salt: string +): Promise => { + if (!name.endsWith('Proxy')) { + throw new Error('proxy contract name must end with "Proxy"') + } + + // Wrap in a try/catch in case there is not a deployConfig for the current network. + let numDeployConfirmations: number + try { + numDeployConfirmations = hre.deployConfig.numDeployConfirmations + } catch (e) { + numDeployConfirmations = 1 + } + + // Calculate the address of proxy using deployer address, salt, initCode. + const proxy = await hre.ethers.getContractFactory('Proxy') + const simulateTx = proxy.getDeployTransaction(admin) + + const create2Inputs = [ + '0xff', + predeploys.Create2Deployer, + salt, + keccak256(simulateTx.data), + ].map((i) => (i.startsWith('0x') ? i : `0x${i}`)) + const create2Input = '0x' + create2Inputs.map((i) => i.slice(2)).join('') + + const create2Hash = keccak256(create2Input) + const create2Address = hre.ethers.utils.getAddress( + `0x${create2Hash.slice(-40)}` + ) + + // Ensure there is not code at the address. + let code = await hre.ethers.provider.getCode(create2Address) + if (code !== '0x') { + throw new Error( + `existing contract code found at ${create2Address}. Use a different salt or verify the intended deployment address.` + ) + } + + // Ensure there is code at the Create2Deployer address. + code = await hre.ethers.provider.getCode(predeploys.Create2Deployer) + if (code === '0x') { + throw new Error(`no code at ${predeploys.Create2Deployer}`) + } + + const { deployer } = await hre.getNamedAccounts() + const signer = hre.ethers.provider.getSigner(deployer) + + const create2DeployerAbi = [ + 'function deploy(uint256 value,bytes32 salt,bytes memory code) public', + ] + let create2Deployer = new hre.ethers.Contract( + predeploys.Create2Deployer, + create2DeployerAbi, + hre.ethers.provider + ) + create2Deployer = create2Deployer.connect(signer) + + // Call deploy function of Create2Deployer contract. + const deployTx = await create2Deployer.deploy(0, salt, simulateTx.data) + await deployTx.wait(numDeployConfirmations) + console.log(`deployed "${name}" at ${create2Address}`) + + // Save the deployment. + const proxyAbi = JSON.parse(proxy.interface.format('json') as string) + const proxyBuildInfo = await hre.artifacts.getBuildInfo('Proxy.sol:Proxy') + const proxyArtifact = await hre.artifacts.readArtifact('Proxy') + const proxyCompiledOutput: any = + proxyBuildInfo.output.contracts[proxyArtifact.sourceName]['Proxy'] + let metadata: string + try { + metadata = JSON.stringify(proxyCompiledOutput.metadata) + } catch (error) { + console.log( + `compiled output of Proxy contract does not have metadata field: ${error}` + ) + metadata = '' + } + const deployedBytecode = await hre.ethers.provider.getCode(create2Address) + const deployTxReceipt = await hre.ethers.provider.getTransactionReceipt( + deployTx.hash + ) + + const proxyDeployment = { + address: create2Address, + abi: proxyAbi, + transactionHash: deployTx.hash, + receipt: deployTxReceipt, + args: [admin], + metadata, + bytecode: proxy.bytecode, + deployedBytecode, + } + await hre.deployments.save(name, proxyDeployment) + + return null +} + /** * Returns a version of the contract object which modifies all of the input contract's methods to * automatically await transaction receipts and confirmations. Will also throw if we timeout while diff --git a/packages/contracts/tasks/deployments-l2.ts b/packages/contracts/tasks/deployments-l2.ts index 4851b77012..a5adaf8fd8 100644 --- a/packages/contracts/tasks/deployments-l2.ts +++ b/packages/contracts/tasks/deployments-l2.ts @@ -37,6 +37,10 @@ task( const proxyAbi = JSON.parse(proxy.interface.format('json') as string) for (const [name, proxyAddr] of Object.entries(predeploys)) { + if (name === 'Create2Deployer') { + continue + } + const proxyName = name + 'Proxy' const proxyDepExists = await hre.deployments.getOrNull(proxyName) diff --git a/packages/contracts/tasks/forge-verify.ts b/packages/contracts/tasks/forge-verify.ts index b74d2d6b47..6bec38230d 100644 --- a/packages/contracts/tasks/forge-verify.ts +++ b/packages/contracts/tasks/forge-verify.ts @@ -157,7 +157,7 @@ task('forge-contract-verify', 'Verify contracts using forge') if (success) { console.log(`Contract verification successful for ${contractName}`) } else { - console.log(`Contract verification unsuccesful for ${contractName}`) + console.log(`Contract verification unsuccessful for ${contractName}`) } } }) diff --git a/packages/sdk/.eslintrc.js b/packages/sdk/.eslintrc.js index 5b8e4ffaf1..14eddadf1a 100644 --- a/packages/sdk/.eslintrc.js +++ b/packages/sdk/.eslintrc.js @@ -1,7 +1,6 @@ // eslint-disable-next-line no-undef module.exports = { extends: '../../.eslintrc.js', - ignorePatterns: ['hardhat.config.ts'], overrides: [ { files: ['src/**/*.ts'], diff --git a/packages/sdk/hardhat.config.ts b/packages/sdk/hardhat.config.ts index caa9588a91..fb382eb010 100644 --- a/packages/sdk/hardhat.config.ts +++ b/packages/sdk/hardhat.config.ts @@ -1,7 +1,7 @@ -import '@nomiclabs/hardhat-ethers' -import '@nomiclabs/hardhat-waffle' import dotenv from 'dotenv' import { HardhatUserConfig } from 'hardhat/types' + +import '@nomiclabs/hardhat-ethers' import 'hardhat-deploy' import './src/tasks' @@ -14,7 +14,7 @@ const config: HardhatUserConfig = { version: '0.8.15', }, paths: { - sources: './test/contracts', + sources: './src', }, networks: { sepolia: { diff --git a/packages/sdk/package.json b/packages/sdk/package.json index a235df3f83..deef484d4c 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -39,6 +39,7 @@ "@nomiclabs/hardhat-ethers": "^2.0.2", "@nomiclabs/hardhat-waffle": "^2.0.1", "chai-as-promised": "^7.1.1", + "dotenv": "^16.0.0", "ethereum-waffle": "^3.4.0", "ethers": "^5.7.0", "hardhat": "^2.9.6", diff --git a/packages/sdk/src/tasks/deposit-eth.ts b/packages/sdk/src/tasks/deposit-eth.ts index d1506de654..edcfb20d9a 100644 --- a/packages/sdk/src/tasks/deposit-eth.ts +++ b/packages/sdk/src/tasks/deposit-eth.ts @@ -3,6 +3,7 @@ import { promises as fs } from 'fs' import '@nomiclabs/hardhat-ethers' import { providers, utils } from 'ethers' import { task, types } from 'hardhat/config' +import { HardhatRuntimeEnvironment } from 'hardhat/types' import 'hardhat-deploy' import { @@ -48,7 +49,7 @@ task('deposit-eth', 'Deposits ether to L2.') 'checkBalanceMismatch', 'Whether to check balance after deposit and withdrawal' ) - .setAction(async (args, hre) => { + .setAction(async (args, hre: HardhatRuntimeEnvironment) => { const signers = await hre.ethers.getSigners() assert(signers.length > 0, 'No configured signers') // Use the first configured signer for simplicity diff --git a/packages/sdk/src/tasks/initiate-withdrawal.ts b/packages/sdk/src/tasks/initiate-withdrawal.ts index 616b0097b1..582fa07b0d 100644 --- a/packages/sdk/src/tasks/initiate-withdrawal.ts +++ b/packages/sdk/src/tasks/initiate-withdrawal.ts @@ -3,6 +3,7 @@ import { promises as fs } from 'fs' import '@nomiclabs/hardhat-ethers' import { Wallet, providers, utils } from 'ethers' import { task, types } from 'hardhat/config' +import { HardhatRuntimeEnvironment } from 'hardhat/types' import 'hardhat-deploy' import { @@ -35,7 +36,7 @@ task('initiate-withdrawal', 'Initiate a withdrawal.') '', types.string ) - .setAction(async (args, hre) => { + .setAction(async (args, hre: HardhatRuntimeEnvironment) => { const signers = await hre.ethers.getSigners() assert(signers.length > 0, 'No configured signers') // Use the first configured signer for simplicity diff --git a/packages/sdk/src/type-extensions.ts b/packages/sdk/src/type-extensions.ts new file mode 100644 index 0000000000..602473d6c0 --- /dev/null +++ b/packages/sdk/src/type-extensions.ts @@ -0,0 +1,8 @@ +import 'hardhat/types/runtime' +import { DeploymentsExtension } from 'hardhat-deploy/types' + +declare module 'hardhat/types/runtime' { + interface HardhatRuntimeEnvironment { + deployments: DeploymentsExtension + } +} diff --git a/packages/sdk/tsconfig.json b/packages/sdk/tsconfig.json index 5cb4fda3c5..ba73aff524 100644 --- a/packages/sdk/tsconfig.json +++ b/packages/sdk/tsconfig.json @@ -1,10 +1,10 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "rootDir": "./src", "outDir": "./dist" }, "include": [ - "src/**/*" + "src/**/*", + "hardhat.config.ts" ] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 05016ce31e..d7ab4bd85f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,41 +10,41 @@ importers: dependencies: '@changesets/cli': specifier: ^2.27.1 - version: 2.27.1 + version: 2.27.6 '@codechecks/client': specifier: ^0.1.11 - version: 0.1.12(typescript@5.3.3) + version: 0.1.12(typescript@5.5.2) '@ethersproject/abstract-provider': specifier: ^5.7.0 version: 5.7.0 devDependencies: '@babel/eslint-parser': specifier: ^7.23.10 - version: 7.24.1(@babel/core@7.23.6)(eslint@8.56.0) + version: 7.24.7(@babel/core@7.24.7)(eslint@8.57.0) '@changesets/changelog-github': specifier: ^0.4.8 - version: 0.4.8 + version: 0.4.8(encoding@0.1.13) '@types/chai': specifier: ^4.3.11 - version: 4.3.11 + version: 4.3.16 '@types/chai-as-promised': specifier: ^7.1.8 version: 7.1.8 '@types/mocha': specifier: ^10.0.6 - version: 10.0.6 + version: 10.0.7 '@types/node': specifier: ^20.11.17 - version: 20.11.30 + version: 20.14.9 '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3) + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0)(typescript@5.5.2) '@typescript-eslint/parser': specifier: ^6.21.0 - version: 6.21.0(eslint@8.56.0)(typescript@5.3.3) + version: 6.21.0(eslint@8.57.0)(typescript@5.5.2) chai: specifier: ^4.3.10 - version: 4.3.10 + version: 4.4.1 copyfiles: specifier: ^2.3.0 version: 2.4.1 @@ -56,40 +56,40 @@ importers: version: 2.2.1 eslint: specifier: ^8.56.0 - version: 8.56.0 + version: 8.57.0 eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@8.56.0) + version: 9.1.0(eslint@8.57.0) eslint-config-standard: specifier: ^16.0.3 - version: 16.0.3(eslint-plugin-import@2.29.1)(eslint-plugin-node@11.1.0)(eslint-plugin-promise@5.2.0)(eslint@8.56.0) + version: 16.0.3(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0))(eslint-plugin-node@11.1.0(eslint@8.57.0))(eslint-plugin-promise@5.2.0(eslint@8.57.0))(eslint@8.57.0) eslint-import-resolver-typescript: specifier: ^3.5.5 - version: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.56.0) + version: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2))(eslint-plugin-import@2.29.1)(eslint@8.57.0) eslint-plugin-import: specifier: ^2.29.1 - version: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + version: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) eslint-plugin-jsdoc: specifier: ^48.0.6 - version: 48.2.3(eslint@8.56.0) + version: 48.5.0(eslint@8.57.0) eslint-plugin-node: specifier: ^11.1.0 - version: 11.1.0(eslint@8.56.0) + version: 11.1.0(eslint@8.57.0) eslint-plugin-prefer-arrow: specifier: ^1.2.3 - version: 1.2.3(eslint@8.56.0) + version: 1.2.3(eslint@8.57.0) eslint-plugin-prettier: specifier: ^4.0.0 - version: 4.2.1(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@2.8.8) + version: 4.2.1(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.8.8) eslint-plugin-promise: specifier: ^5.1.0 - version: 5.2.0(eslint@8.56.0) + version: 5.2.0(eslint@8.57.0) eslint-plugin-react: specifier: ^7.24.0 - version: 7.33.2(eslint@8.56.0) + version: 7.34.3(eslint@8.57.0) eslint-plugin-unicorn: specifier: ^50.0.1 - version: 50.0.1(eslint@8.56.0) + version: 50.0.1(eslint@8.57.0) husky: specifier: ^9.0.10 version: 9.0.11 @@ -98,13 +98,13 @@ importers: version: 15.2.0 mocha: specifier: ^10.2.0 - version: 10.2.0 + version: 10.5.2 nx: specifier: 18.1.2 version: 18.1.2 nx-cloud: specifier: latest - version: 16.5.2 + version: 19.0.0 nyc: specifier: ^15.1.0 version: 15.1.0 @@ -113,22 +113,22 @@ importers: version: 2.8.8 prettier-plugin-solidity: specifier: ^1.0.0-beta.13 - version: 1.2.0(prettier@2.8.8) + version: 1.3.1(prettier@2.8.8) rimraf: specifier: ^5.0.5 - version: 5.0.5 + version: 5.0.7 ts-mocha: specifier: ^10.0.0 - version: 10.0.0(mocha@10.2.0) + version: 10.0.0(mocha@10.5.2) typescript: specifier: ^5.3.3 - version: 5.3.3 + version: 5.5.2 packages/common-ts: dependencies: '@kroma/core-utils': specifier: 1.0.0 - version: link:../core-utils + version: 1.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@sentry/node': specifier: ^6.3.1 version: 6.19.7 @@ -143,16 +143,16 @@ importers: version: 9.5.0 dotenv: specifier: ^16.0.0 - version: 16.3.1 + version: 16.4.5 envalid: specifier: ^7.2.2 version: 7.3.1 ethers: specifier: ^5.7.0 - version: 5.7.2 + version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) express: specifier: ^4.17.1 - version: 4.18.2 + version: 4.19.2 express-prom-bundle: specifier: ^6.4.1 version: 6.6.0(prom-client@13.2.0) @@ -195,16 +195,16 @@ importers: version: 5.1.6 chai: specifier: ^4.3.4 - version: 4.3.10 + version: 4.4.1 supertest: specifier: ^6.1.4 - version: 6.3.3 + version: 6.3.4 packages/contracts: dependencies: '@kroma/core-utils': specifier: 1.0.0 - version: link:../core-utils + version: 1.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@openzeppelin/contracts': specifier: 4.9.3 version: 4.9.3 @@ -213,17 +213,17 @@ importers: version: 4.9.3 circomlibjs: specifier: ^0.1.7 - version: 0.1.7 + version: 0.1.7(bufferutil@4.0.8)(utf-8-validate@5.0.10) ethers: specifier: ^5.7.0 - version: 5.7.2 + version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) hardhat: specifier: ^2.9.6 - version: 2.19.2(ts-node@10.9.2)(typescript@4.9.5) + version: 2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@5.0.10) devDependencies: '@defi-wonderland/smock': specifier: ^2.0.2 - version: 2.3.5(@ethersproject/abi@5.7.0)(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.7.2)(hardhat@2.19.2) + version: 2.4.0(@ethersproject/abi@5.7.0)(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@5.0.10)))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@5.0.10)) '@ethersproject/abstract-provider': specifier: ^5.7.0 version: 5.7.0 @@ -235,46 +235,46 @@ importers: version: 0.1.3 '@foundry-rs/hardhat-forge': specifier: ^0.1.17 - version: 0.1.17(@nomiclabs/hardhat-ethers@2.2.3)(ethereum-waffle@3.4.4)(ethers@5.7.2)(hardhat@2.19.2) + version: 0.1.17(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@5.0.10)))(ethereum-waffle@3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(typescript@4.9.5)(utf-8-validate@5.0.10))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@5.0.10)) '@kroma/hardhat-deploy-config': specifier: 1.0.0 - version: link:../hardhat-deploy-config + version: 1.0.0 '@nomiclabs/hardhat-ethers': specifier: ^2.0.0 - version: 2.2.3(ethers@5.7.2)(hardhat@2.19.2) + version: 2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-waffle': specifier: ^2.0.0 - version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3)(@types/sinon-chai@3.2.12)(ethereum-waffle@3.4.4)(ethers@5.7.2)(hardhat@2.19.2) + version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(typescript@4.9.5)(utf-8-validate@5.0.10))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@5.0.10)) '@rari-capital/solmate': specifier: https://github.com/transmissions11/solmate.git#8f9b23f8838670afda0fd8983f2c41e8037ae6bc version: https://codeload.github.com/transmissions11/solmate/tar.gz/8f9b23f8838670afda0fd8983f2c41e8037ae6bc '@typechain/ethers-v5': specifier: ^10.1.0 - version: 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@4.9.5) + version: 10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@4.9.5))(typescript@4.9.5) '@typescript-eslint/eslint-plugin': specifier: ^5.45.1 - version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.56.0)(typescript@4.9.5) + version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@4.9.5))(eslint@8.57.0)(typescript@4.9.5) '@typescript-eslint/parser': specifier: ^5.45.1 - version: 5.62.0(eslint@8.56.0)(typescript@4.9.5) + version: 5.62.0(eslint@8.57.0)(typescript@4.9.5) bip39: specifier: ^3.0.4 version: 3.1.0 chai: specifier: ^4.2.0 - version: 4.3.10 + version: 4.4.1 command-exists: specifier: 1.2.9 version: 1.2.9 dotenv: specifier: ^16.0.0 - version: 16.3.1 + version: 16.4.5 ds-test: specifier: https://github.com/dapphub/ds-test.git#9310e879db8ba3ea6d5c6489a579118fd264a3f5 version: ds-test.git#9310e879db8ba3ea6d5c6489a579118fd264a3f5@https://codeload.github.com/dapphub/ds-test/tar.gz/9310e879db8ba3ea6d5c6489a579118fd264a3f5 ethereum-waffle: specifier: ^3.0.0 - version: 3.4.4(typescript@4.9.5) + version: 3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(typescript@4.9.5)(utf-8-validate@5.0.10) ethereumjs-wallet: specifier: ^1.0.2 version: 1.0.2 @@ -286,16 +286,16 @@ importers: version: 7.2.3 hardhat-deploy: specifier: ^0.11.4 - version: 0.11.45 + version: 0.11.45(bufferutil@4.0.8)(utf-8-validate@5.0.10) solhint: specifier: ^3.3.7 version: 3.6.2(typescript@4.9.5) solhint-plugin-prettier: specifier: ^0.0.5 - version: 0.0.5(prettier-plugin-solidity@1.2.0)(prettier@2.8.8) + version: 0.0.5(prettier-plugin-solidity@1.3.1(prettier@2.8.8))(prettier@2.8.8) ts-node: specifier: ^10.9.1 - version: 10.9.2(@types/node@20.11.30)(typescript@4.9.5) + version: 10.9.2(@types/node@20.14.9)(typescript@4.9.5) typechain: specifier: ^8.1.0 version: 8.3.2(typescript@4.9.5) @@ -337,7 +337,7 @@ importers: version: 5.7.0 '@ethersproject/providers': specifier: ^5.7.0 - version: 5.7.2 + version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@ethersproject/rlp': specifier: ^5.7.0 version: 5.7.0 @@ -352,32 +352,32 @@ importers: version: 1.2.1 chai: specifier: ^4.3.4 - version: 4.3.10 + version: 4.4.1 devDependencies: mocha: specifier: ^10.0.0 - version: 10.2.0 + version: 10.5.2 packages/hardhat-deploy-config: devDependencies: ethers: specifier: ^5.7.0 - version: 5.7.2 + version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) hardhat: specifier: ^2.9.6 - version: 2.19.2(ts-node@10.9.2)(typescript@5.3.3) + version: 2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.2))(typescript@5.5.2)(utf-8-validate@5.0.10) ts-node: specifier: ^10.9.1 - version: 10.9.2(@types/node@20.11.30)(typescript@5.3.3) + version: 10.9.2(@types/node@20.14.9)(typescript@5.5.2) packages/sdk: dependencies: '@kroma/contracts': specifier: 1.0.0 - version: link:../contracts + version: 1.0.0(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.2))(typescript@5.5.2)(utf-8-validate@5.0.10) '@kroma/core-utils': specifier: 1.0.0 - version: link:../core-utils + version: 1.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) lodash: specifier: ^4.17.21 version: 4.17.21 @@ -393,163 +393,147 @@ importers: version: 5.7.0 '@nomiclabs/hardhat-ethers': specifier: ^2.0.2 - version: 2.2.3(ethers@5.7.2)(hardhat@2.19.2) + version: 2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.2))(typescript@5.5.2)(utf-8-validate@5.0.10)) '@nomiclabs/hardhat-waffle': specifier: ^2.0.1 - version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3)(@types/sinon-chai@3.2.12)(ethereum-waffle@3.4.4)(ethers@5.7.2)(hardhat@2.19.2) + version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.2))(typescript@5.5.2)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.5.2)(utf-8-validate@5.0.10))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.2))(typescript@5.5.2)(utf-8-validate@5.0.10)) chai-as-promised: specifier: ^7.1.1 - version: 7.1.1(chai@4.3.10) + version: 7.1.2(chai@4.4.1) + dotenv: + specifier: ^16.0.0 + version: 16.4.5 ethereum-waffle: specifier: ^3.4.0 - version: 3.4.4(typescript@4.7.4) + version: 3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.5.2)(utf-8-validate@5.0.10) ethers: specifier: ^5.7.0 - version: 5.7.2 + version: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) hardhat: specifier: ^2.9.6 - version: 2.19.2(typescript@4.7.4) + version: 2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.2))(typescript@5.5.2)(utf-8-validate@5.0.10) hardhat-deploy: specifier: ^0.11.4 - version: 0.11.45 + version: 0.11.45(bufferutil@4.0.8)(utf-8-validate@5.0.10) mocha: specifier: ^10.0.0 - version: 10.2.0 + version: 10.5.2 nyc: specifier: ^15.1.0 version: 15.1.0 typedoc: specifier: ^0.22.13 - version: 0.22.18(typescript@4.7.4) + version: 0.22.18(typescript@5.5.2) packages: - '@aashutoshrathi/word-wrap@1.2.6': - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - - '@ampproject/remapping@2.2.1': - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@babel/code-frame@7.23.5': - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.23.5': - resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + '@babel/compat-data@7.24.7': + resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==} engines: {node: '>=6.9.0'} - '@babel/core@7.23.6': - resolution: {integrity: sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==} + '@babel/core@7.24.7': + resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==} engines: {node: '>=6.9.0'} - '@babel/eslint-parser@7.24.1': - resolution: {integrity: sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ==} + '@babel/eslint-parser@7.24.7': + resolution: {integrity: sha512-SO5E3bVxDuxyNxM5agFv480YA2HO6ohZbGxbazZdIk3KQOPOGVNw6q78I9/lbviIf95eq6tPozeYnJLbjnC8IA==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: '@babel/core': ^7.11.0 - eslint: ^7.5.0 || ^8.0.0 + eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 - '@babel/generator@7.23.6': - resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + '@babel/generator@7.24.7': + resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.23.6': - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + '@babel/helper-compilation-targets@7.24.7': + resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==} engines: {node: '>=6.9.0'} - '@babel/helper-environment-visitor@7.22.20': - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + '@babel/helper-environment-visitor@7.24.7': + resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} engines: {node: '>=6.9.0'} - '@babel/helper-function-name@7.23.0': - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + '@babel/helper-function-name@7.24.7': + resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} engines: {node: '>=6.9.0'} - '@babel/helper-hoist-variables@7.22.5': - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + '@babel/helper-hoist-variables@7.24.7': + resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.22.15': - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + '@babel/helper-module-imports@7.24.7': + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.23.3': - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + '@babel/helper-module-transforms@7.24.7': + resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-simple-access@7.22.5': - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + '@babel/helper-simple-access@7.24.7': + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} - '@babel/helper-split-export-declaration@7.22.6': - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + '@babel/helper-split-export-declaration@7.24.7': + resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.23.4': - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + '@babel/helper-string-parser@7.24.7': + resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.22.20': - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.23.5': - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + '@babel/helper-validator-option@7.24.7': + resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.23.6': - resolution: {integrity: sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==} + '@babel/helpers@7.24.7': + resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.23.4': - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.23.6': - resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} + '@babel/parser@7.24.7': + resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/runtime@7.23.6': - resolution: {integrity: sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==} + '@babel/runtime@7.24.7': + resolution: {integrity: sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==} engines: {node: '>=6.9.0'} - '@babel/template@7.22.15': - resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + '@babel/template@7.24.7': + resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.23.6': - resolution: {integrity: sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==} + '@babel/traverse@7.24.7': + resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==} engines: {node: '>=6.9.0'} - '@babel/types@7.23.6': - resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} + '@babel/types@7.24.7': + resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} engines: {node: '>=6.9.0'} - '@chainsafe/as-sha256@0.3.1': - resolution: {integrity: sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==} - - '@chainsafe/persistent-merkle-tree@0.4.2': - resolution: {integrity: sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==} - - '@chainsafe/persistent-merkle-tree@0.5.0': - resolution: {integrity: sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==} - - '@chainsafe/ssz@0.10.2': - resolution: {integrity: sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==} - - '@chainsafe/ssz@0.9.4': - resolution: {integrity: sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==} + '@changesets/apply-release-plan@7.0.3': + resolution: {integrity: sha512-klL6LCdmfbEe9oyfLxnidIf/stFXmrbFO/3gT5LU5pcyoZytzJe4gWpTBx3BPmyNPl16dZ1xrkcW7b98e3tYkA==} - '@changesets/apply-release-plan@7.0.0': - resolution: {integrity: sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==} - - '@changesets/assemble-release-plan@6.0.0': - resolution: {integrity: sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw==} + '@changesets/assemble-release-plan@6.0.2': + resolution: {integrity: sha512-n9/Tdq+ze+iUtjmq0mZO3pEhJTKkku9hUxtUadW30jlN7kONqJG3O6ALeXrmc6gsi/nvoCuKjqEJ68Hk8RbMTQ==} '@changesets/changelog-git@0.2.0': resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} @@ -557,24 +541,24 @@ packages: '@changesets/changelog-github@0.4.8': resolution: {integrity: sha512-jR1DHibkMAb5v/8ym77E4AMNWZKB5NPzw5a5Wtqm1JepAuIF+hrKp2u04NKM14oBZhHglkCfrla9uq8ORnK/dw==} - '@changesets/cli@2.27.1': - resolution: {integrity: sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ==} + '@changesets/cli@2.27.6': + resolution: {integrity: sha512-PB7KS5JkCQ4WSXlnfThn8CXAHVwYxFdZvYTimhi12fls/tzj9iimUhKsYwkrKSbw1AiVlGCZtihj5Wkt6siIjA==} hasBin: true - '@changesets/config@3.0.0': - resolution: {integrity: sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA==} + '@changesets/config@3.0.1': + resolution: {integrity: sha512-nCr8pOemUjvGJ8aUu8TYVjqnUL+++bFOQHBVmtNbLvKzIDkN/uiP/Z4RKmr7NNaiujIURHySDEGFPftR4GbTUA==} '@changesets/errors@0.2.0': resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} - '@changesets/get-dependents-graph@2.0.0': - resolution: {integrity: sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA==} + '@changesets/get-dependents-graph@2.1.0': + resolution: {integrity: sha512-QOt6pQq9RVXKGHPVvyKimJDYJumx7p4DO5MO9AhRJYgAPgv0emhNqAqqysSVKHBm4sxKlGN4S1zXOIb5yCFuhQ==} '@changesets/get-github-info@0.5.2': resolution: {integrity: sha512-JppheLu7S114aEs157fOZDjFqUDpm7eHdq5E8SSR0gUBTEK0cNSHsrSR5a66xs0z3RWuo46QvA3vawp8BxDHvg==} - '@changesets/get-release-plan@4.0.0': - resolution: {integrity: sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w==} + '@changesets/get-release-plan@4.0.2': + resolution: {integrity: sha512-rOalz7nMuMV2vyeP7KBeAhqEB7FM2GFPO5RQSoOoUKKH9L6wW3QyPA2K+/rG9kBrWl2HckPVES73/AuwPvbH3w==} '@changesets/get-version-range-type@0.4.0': resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} @@ -594,6 +578,9 @@ packages: '@changesets/read@0.6.0': resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==} + '@changesets/should-skip-package@0.1.0': + resolution: {integrity: sha512-FxG6Mhjw7yFStlSM7Z0Gmg3RiyQ98d/9VpQAZ3Fzr59dCOM9G6ZdYbjiSAt0XtFr9JR5U2tBaJWPjrkGGc618g==} + '@changesets/types@4.1.0': resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} @@ -603,8 +590,8 @@ packages: '@changesets/types@6.0.0': resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} - '@changesets/write@0.3.0': - resolution: {integrity: sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==} + '@changesets/write@0.3.1': + resolution: {integrity: sha512-SyGtMXzH3qFqlHKcvFY2eX+6b0NGiFcNav8AFsYwy5l8hejOeoeTDemu5Yjmke2V5jpzY+pBvM0vCCQ3gdZpfw==} '@codechecks/client@0.1.12': resolution: {integrity: sha512-2GHHvhO3kaOyxFXxOaiznlY8ARmz33/p+WQdhc2y6wzWw5eOl2wSwg1eZxx3LsWlAnB963Y4bd1YjZcGIhKRzA==} @@ -615,15 +602,15 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@defi-wonderland/smock@2.3.5': - resolution: {integrity: sha512-klANj1hUpc3cd2ShXdVH/bEGwxJd+LxOngkF5gLcIbg6b37RCgMPMmR/94/hgL62F8bfWtuNKsQD7K+c6M5fWQ==} + '@defi-wonderland/smock@2.4.0': + resolution: {integrity: sha512-eS5fuAa9MOVDvXsT7Qa4v9Tg0Pk5ypfY3JWyW93a5sqyY2E2nCuRRBC53IikM9z0tVB2YYA8C9bWK8Lc47mATw==} peerDependencies: '@ethersproject/abi': ^5 '@ethersproject/abstract-provider': ^5 '@ethersproject/abstract-signer': ^5 '@nomiclabs/hardhat-ethers': ^2 ethers: ^5 - hardhat: ^2 + hardhat: ^2.21.0 '@ensdomains/ens@0.4.5': resolution: {integrity: sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==} @@ -633,8 +620,8 @@ packages: resolution: {integrity: sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==} deprecated: Please use @ensdomains/ens-contracts - '@es-joy/jsdoccomment@0.42.0': - resolution: {integrity: sha512-R1w57YlVA6+YE01wch3GPYn6bCsrOV3YW/5oGGE2tmX6JcL9Nr+b5IikrjMPF+v9CV3ay+obImEdsDhovhJrzw==} + '@es-joy/jsdoccomment@0.43.1': + resolution: {integrity: sha512-I238eDtOolvCuvtxrnqtlBaw0BwdQuYqK7eA6XIonicMdOOOb75mqdIzkGDUbS04+1Di007rgm9snFRNeVrOog==} engines: {node: '>=16'} '@eslint-community/eslint-utils@4.4.0': @@ -643,16 +630,16 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.10.0': - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + '@eslint-community/regexpp@4.11.0': + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/js@8.56.0': - resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} '@ethereum-waffle/chai@3.4.4': @@ -777,8 +764,8 @@ packages: '@ethersproject/wordlists@5.7.0': resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} - '@fastify/busboy@2.1.0': - resolution: {integrity: sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==} + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} '@foundry-rs/easy-foundryup@0.1.3': @@ -792,16 +779,18 @@ packages: ethers: ^5.0.0 hardhat: ^2.0.0 - '@humanwhocodes/config-array@0.11.13': - resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.1': - resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -819,33 +808,42 @@ packages: resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jridgewell/gen-mapping@0.3.3': - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} - '@jridgewell/resolve-uri@3.1.1': - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.1.2': - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - '@jridgewell/trace-mapping@0.3.20': - resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@kroma/contracts@1.0.0': + resolution: {integrity: sha512-FTXnEfjMlER9DvFiRzXEKwDakTsb1dAwEcXtjeu+4ign3YIaqiZVRsoMjFkJtsAprxjXehMuWW5NvjU0aS2QjA==} + + '@kroma/core-utils@1.0.0': + resolution: {integrity: sha512-mrQ4uqIbMWVWYZrPvORMAgZ/wLfp+LNfyeVp0AypvRfgwGfSseKJySfmG70qKW7TtA60/Xy+uIGuJ7MRHxKh7A==} + + '@kroma/hardhat-deploy-config@1.0.0': + resolution: {integrity: sha512-6hd1nFHh/1P9cZ7drJ6lgC9KIj6fSgzGkfJCZRIzOfUPHBo52p5C5HiS9fETz+Yyma1ZuaSvt6umEQ9jpTiN8A==} + '@ljharb/resumer@0.0.1': resolution: {integrity: sha512-skQiAOrCfO7vRTq53cxznMpks7wS1va95UCidALlOVWqvBAzwPVErwizDwoMqNVMEn1mDq0utxZd02eIrvF1lw==} engines: {node: '>= 0.4'} - '@ljharb/through@2.3.11': - resolution: {integrity: sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==} + '@ljharb/through@2.3.13': + resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} engines: {node: '>= 0.4'} '@manypkg/find-root@1.1.0': @@ -861,18 +859,14 @@ packages: '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} - '@noble/curves@1.1.0': - resolution: {integrity: sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==} + '@noble/curves@1.4.0': + resolution: {integrity: sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==} '@noble/hashes@1.2.0': resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} - '@noble/hashes@1.3.1': - resolution: {integrity: sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==} - engines: {node: '>= 16'} - - '@noble/hashes@1.3.3': - resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} engines: {node: '>= 16'} '@noble/secp256k1@1.7.1': @@ -890,154 +884,94 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nomicfoundation/ethereumjs-block@4.2.2': - resolution: {integrity: sha512-atjpt4gc6ZGZUPHBAQaUJsm1l/VCo7FmyQ780tMGO8QStjLdhz09dXynmhwVTy5YbRr0FOh/uX3QaEM0yIB2Zg==} - engines: {node: '>=14'} - - '@nomicfoundation/ethereumjs-block@5.0.2': - resolution: {integrity: sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q==} - engines: {node: '>=14'} - - '@nomicfoundation/ethereumjs-blockchain@6.2.2': - resolution: {integrity: sha512-6AIB2MoTEPZJLl6IRKcbd8mUmaBAQ/NMe3O7OsAOIiDjMNPPH5KaUQiLfbVlegT4wKIg/GOsFH7XlH2KDVoJNg==} - engines: {node: '>=14'} + '@nomicfoundation/edr-darwin-arm64@0.4.0': + resolution: {integrity: sha512-7+rraFk9tCqvfemv9Ita5vTlSBAeO/S5aDKOgGRgYt0JEKZlrX161nDW6UfzMPxWl9GOLEDUzCEaYuNmXseUlg==} + engines: {node: '>= 18'} - '@nomicfoundation/ethereumjs-blockchain@7.0.2': - resolution: {integrity: sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w==} - engines: {node: '>=14'} + '@nomicfoundation/edr-darwin-x64@0.4.0': + resolution: {integrity: sha512-+Hrc0mP9L6vhICJSfyGo/2taOToy1AIzVZawO3lU8Lf7oDQXfhQ4UkZnkWAs9SVu1eUwHUGGGE0qB8644piYgg==} + engines: {node: '>= 18'} - '@nomicfoundation/ethereumjs-common@3.1.2': - resolution: {integrity: sha512-JAEBpIua62dyObHM9KI2b4wHZcRQYYge9gxiygTWa3lNCr2zo+K0TbypDpgiNij5MCGNWP1eboNfNfx1a3vkvA==} + '@nomicfoundation/edr-linux-arm64-gnu@0.4.0': + resolution: {integrity: sha512-4HUDMchNClQrVRfVTqBeSX92hM/3khCgpZkXP52qrnJPqgbdCxosOehlQYZ65wu0b/kaaZSyvACgvCLSQ5oSzQ==} + engines: {node: '>= 18'} - '@nomicfoundation/ethereumjs-common@4.0.2': - resolution: {integrity: sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg==} + '@nomicfoundation/edr-linux-arm64-musl@0.4.0': + resolution: {integrity: sha512-D4J935ZRL8xfnP3zIFlCI9jXInJ0loDUkCTLeCEbOf2uuDumWDghKNQlF1itUS+EHaR1pFVBbuwqq8hVK0dASg==} + engines: {node: '>= 18'} - '@nomicfoundation/ethereumjs-ethash@2.0.5': - resolution: {integrity: sha512-xlLdcICGgAYyYmnI3r1t0R5fKGBJNDQSOQxXNjVO99JmxJIdXR5MgPo5CSJO1RpyzKOgzi3uIFn8agv564dZEQ==} - engines: {node: '>=14'} + '@nomicfoundation/edr-linux-x64-gnu@0.4.0': + resolution: {integrity: sha512-6x7HPy+uN5Cb9N77e2XMmT6+QSJ+7mRbHnhkGJ8jm4cZvWuj2Io7npOaeHQ3YHK+TiQpTnlbkjoOIpEwpY3XZA==} + engines: {node: '>= 18'} - '@nomicfoundation/ethereumjs-ethash@3.0.2': - resolution: {integrity: sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg==} - engines: {node: '>=14'} + '@nomicfoundation/edr-linux-x64-musl@0.4.0': + resolution: {integrity: sha512-3HFIJSXgyubOiaN4MWGXx2xhTnhwlJk0PiSYNf9+L/fjBtcRkb2nM910ZJHTvqCb6OT98cUnaKuAYdXIW2amgw==} + engines: {node: '>= 18'} - '@nomicfoundation/ethereumjs-evm@1.3.2': - resolution: {integrity: sha512-I00d4MwXuobyoqdPe/12dxUQxTYzX8OckSaWsMcWAfQhgVDvBx6ffPyP/w1aL0NW7MjyerySPcSVfDJAMHjilw==} - engines: {node: '>=14'} + '@nomicfoundation/edr-win32-x64-msvc@0.4.0': + resolution: {integrity: sha512-CP4GsllEfXEz+lidcGYxKe5rDJ60TM5/blB5z/04ELVvw6/CK9eLcYeku7HV0jvV7VE6dADYKSdQyUkvd0El+A==} + engines: {node: '>= 18'} - '@nomicfoundation/ethereumjs-evm@2.0.2': - resolution: {integrity: sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ==} - engines: {node: '>=14'} + '@nomicfoundation/edr@0.4.0': + resolution: {integrity: sha512-T96DMSogO8TCdbKKctvxfsDljbhFOUKWc9fHJhSeUh71EEho2qR4951LKQF7t7UWEzguVYh/idQr5L/E3QeaMw==} + engines: {node: '>= 18'} - '@nomicfoundation/ethereumjs-rlp@4.0.3': - resolution: {integrity: sha512-DZMzB/lqPK78T6MluyXqtlRmOMcsZbTTbbEyAjo0ncaff2mqu/k8a79PBcyvpgAhWD/R59Fjq/x3ro5Lof0AtA==} - engines: {node: '>=14'} - hasBin: true + '@nomicfoundation/ethereumjs-common@4.0.4': + resolution: {integrity: sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==} - '@nomicfoundation/ethereumjs-rlp@5.0.2': - resolution: {integrity: sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA==} - engines: {node: '>=14'} + '@nomicfoundation/ethereumjs-rlp@5.0.4': + resolution: {integrity: sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==} + engines: {node: '>=18'} hasBin: true - '@nomicfoundation/ethereumjs-statemanager@1.0.5': - resolution: {integrity: sha512-CAhzpzTR5toh/qOJIZUUOnWekUXuRqkkzaGAQrVcF457VhtCmr+ddZjjK50KNZ524c1XP8cISguEVNqJ6ij1sA==} - - '@nomicfoundation/ethereumjs-statemanager@2.0.2': - resolution: {integrity: sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA==} - - '@nomicfoundation/ethereumjs-trie@5.0.5': - resolution: {integrity: sha512-+8sNZrXkzvA1NH5F4kz5RSYl1I6iaRz7mAZRsyxOm0IVY4UaP43Ofvfp/TwOalFunurQrYB5pRO40+8FBcxFMA==} - engines: {node: '>=14'} - - '@nomicfoundation/ethereumjs-trie@6.0.2': - resolution: {integrity: sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ==} - engines: {node: '>=14'} - - '@nomicfoundation/ethereumjs-tx@4.1.2': - resolution: {integrity: sha512-emJBJZpmTdUa09cqxQqHaysbBI9Od353ZazeH7WgPb35miMgNY6mb7/3vBA98N5lUW/rgkiItjX0KZfIzihSoQ==} - engines: {node: '>=14'} - - '@nomicfoundation/ethereumjs-tx@5.0.2': - resolution: {integrity: sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g==} - engines: {node: '>=14'} - - '@nomicfoundation/ethereumjs-util@8.0.6': - resolution: {integrity: sha512-jOQfF44laa7xRfbfLXojdlcpkvxeHrE2Xu7tSeITsWFgoII163MzjOwFEzSNozHYieFysyoEMhCdP+NY5ikstw==} - engines: {node: '>=14'} - - '@nomicfoundation/ethereumjs-util@9.0.2': - resolution: {integrity: sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ==} - engines: {node: '>=14'} - - '@nomicfoundation/ethereumjs-vm@6.4.2': - resolution: {integrity: sha512-PRTyxZMP6kx+OdAzBhuH1LD2Yw+hrSpaytftvaK//thDy2OI07S0nrTdbrdk7b8ZVPAc9H9oTwFBl3/wJ3w15g==} - engines: {node: '>=14'} - - '@nomicfoundation/ethereumjs-vm@7.0.2': - resolution: {integrity: sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA==} - engines: {node: '>=14'} - - '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1': - resolution: {integrity: sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1': - resolution: {integrity: sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] + '@nomicfoundation/ethereumjs-tx@5.0.4': + resolution: {integrity: sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==} + engines: {node: '>=18'} + peerDependencies: + c-kzg: ^2.1.2 + peerDependenciesMeta: + c-kzg: + optional: true - '@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1': - resolution: {integrity: sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] + '@nomicfoundation/ethereumjs-util@9.0.4': + resolution: {integrity: sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==} + engines: {node: '>=18'} + peerDependencies: + c-kzg: ^2.1.2 + peerDependenciesMeta: + c-kzg: + optional: true - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1': - resolution: {integrity: sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': + resolution: {integrity: sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==} + engines: {node: '>= 12'} - '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1': - resolution: {integrity: sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': + resolution: {integrity: sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==} + engines: {node: '>= 12'} - '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1': - resolution: {integrity: sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': + resolution: {integrity: sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==} + engines: {node: '>= 12'} - '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1': - resolution: {integrity: sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': + resolution: {integrity: sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA==} + engines: {node: '>= 12'} - '@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1': - resolution: {integrity: sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': + resolution: {integrity: sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g==} + engines: {node: '>= 12'} - '@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1': - resolution: {integrity: sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': + resolution: {integrity: sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg==} + engines: {node: '>= 12'} - '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1': - resolution: {integrity: sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': + resolution: {integrity: sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA==} + engines: {node: '>= 12'} - '@nomicfoundation/solidity-analyzer@0.1.1': - resolution: {integrity: sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==} + '@nomicfoundation/solidity-analyzer@0.1.2': + resolution: {integrity: sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==} engines: {node: '>= 12'} '@nomiclabs/hardhat-ethers@2.2.3': @@ -1055,8 +989,8 @@ packages: ethers: ^5.0.0 hardhat: ^2.0.0 - '@nrwl/nx-cloud@16.5.2': - resolution: {integrity: sha512-oHO5T1HRJsR9mbRd8eUqMBPCgqVZLSbAh3zJoPFmhEmjbM4YB9ePRpgYFT8dRNeZUOUd/8Yt7Pb6EVWOHvpD/w==} + '@nrwl/nx-cloud@19.0.0': + resolution: {integrity: sha512-3WuXq3KKXwKnbjOkYK0OXosjD02LIjC3kEkyMIbaE36O9dMp3k/sa4ZtDVC3tAoIrj17VLVmjKfoDYbED1rapw==} '@nrwl/tao@18.1.2': resolution: {integrity: sha512-IA+osZ5TlKMwJmcP7TECW7TO0JdNNQud9Dgkh1ZfJ4GWnT7WEkE9b2Yf1IFeeB81kCTXXq8jfISa8ZY21MjRaQ==} @@ -1132,9 +1066,12 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@rari-capital/solmate@https://codeload.github.com/transmissions11/solmate/tar.gz/8f9b23f8838670afda0fd8983f2c41e8037ae6bc': resolution: {tarball: https://codeload.github.com/transmissions11/solmate/tar.gz/8f9b23f8838670afda0fd8983f2c41e8037ae6bc} - name: '@rari-capital/solmate' version: 7.0.0-alpha.3 '@resolver-engine/core@0.3.3': @@ -1149,20 +1086,20 @@ packages: '@resolver-engine/imports@0.3.3': resolution: {integrity: sha512-anHpS4wN4sRMwsAbMXhMfOD/y4a4Oo0Cw/5+rue7hSwGWsDOQaAU1ClK1OxjUC35/peazxEl8JaSRRS+Xb8t3Q==} - '@scure/base@1.1.5': - resolution: {integrity: sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==} + '@scure/base@1.1.7': + resolution: {integrity: sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g==} '@scure/bip32@1.1.5': resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} - '@scure/bip32@1.3.1': - resolution: {integrity: sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==} + '@scure/bip32@1.4.0': + resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} '@scure/bip39@1.1.1': resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} - '@scure/bip39@1.2.1': - resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} + '@scure/bip39@1.3.0': + resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} '@sentry/core@5.30.0': resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} @@ -1230,6 +1167,9 @@ packages: '@solidity-parser/parser@0.16.2': resolution: {integrity: sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg==} + '@solidity-parser/parser@0.17.0': + resolution: {integrity: sha512-Nko8R0/kUo391jsEHHxrGM07QFdnPGvlmox4rmH0kNiNAashItAilhy4Mv4pK5gQmW5f4sXAF58fwJbmlkGcVw==} + '@szmarczak/http-timer@1.1.2': resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} engines: {node: '>=6'} @@ -1244,8 +1184,8 @@ packages: '@textlint/markdown-to-ast@12.6.1': resolution: {integrity: sha512-T0HO+VrU9VbLRiEx/kH4+gwGMHNMIGkp0Pok+p0I33saOOLyhfGvwOKQgvt2qkxzQEV2L5MtGB8EnW4r5d3CqQ==} - '@tsconfig/node10@1.0.9': - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} '@tsconfig/node12@1.0.11': resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} @@ -1271,9 +1211,6 @@ packages: ethers: ^5.0.0 typechain: ^3.0.0 - '@types/async-eventemitter@0.2.4': - resolution: {integrity: sha512-2Bq61VD01kgLf1XkK2xPtoBcu7fgn/km5JyEX9v0BlG5VQBzA+BlF9umFk+8gR8S4+eK7MgDY2oyVZCu6ar3Jw==} - '@types/bn.js@4.11.6': resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} @@ -1289,17 +1226,20 @@ packages: '@types/chai-as-promised@7.1.8': resolution: {integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==} - '@types/chai@4.3.11': - resolution: {integrity: sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==} + '@types/chai@4.3.16': + resolution: {integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==} '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/events@3.0.3': - resolution: {integrity: sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g==} + '@types/eslint@8.56.10': + resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - '@types/express-serve-static-core@4.17.41': - resolution: {integrity: sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==} + '@types/express-serve-static-core@4.19.5': + resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==} '@types/express@4.17.21': resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} @@ -1328,35 +1268,26 @@ packages: '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - '@types/mime@3.0.4': - resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} - '@types/minimatch@3.0.5': resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} - '@types/minimist@1.2.5': - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - '@types/mkdirp@0.5.2': resolution: {integrity: sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==} - '@types/mocha@10.0.6': - resolution: {integrity: sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==} + '@types/mocha@10.0.7': + resolution: {integrity: sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw==} '@types/morgan@1.9.9': resolution: {integrity: sha512-iRYSDKVaC6FkGSpEVVIvrRGw0DfJMiQzIn3qr2G5B3C//AWkulhXgaBd7tS9/J79GWSYMTHGs7PfI5b3Y8m+RQ==} - '@types/node-fetch@2.6.9': - resolution: {integrity: sha512-bQVlnMLFJ2d35DkPNjEPmd9ueO/rh5EiaZt2bhqiSarPjZIuIV6bPQVqcrEyvNo+AfTrRGVazle1tl597w3gfA==} + '@types/node-fetch@2.6.11': + resolution: {integrity: sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==} '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@20.10.5': - resolution: {integrity: sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==} - - '@types/node@20.11.30': - resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==} + '@types/node@20.14.9': + resolution: {integrity: sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -1384,15 +1315,12 @@ packages: '@types/prettier@2.7.3': resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} - '@types/qs@6.9.10': - resolution: {integrity: sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==} + '@types/qs@6.9.15': + resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - '@types/readable-stream@2.3.15': - resolution: {integrity: sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==} - '@types/resolve@0.0.8': resolution: {integrity: sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==} @@ -1402,20 +1330,20 @@ packages: '@types/secp256k1@4.0.6': resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} - '@types/semver@7.5.6': - resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} '@types/send@0.17.4': resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} - '@types/serve-static@1.15.5': - resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} '@types/sinon-chai@3.2.12': resolution: {integrity: sha512-9y0Gflk3b0+NhQZ/oxGtaAJDvRywCa5sIyaVnounqLvmf93yBF4EgIRspePtkMs3Tr844nCclYMlcCNmLCvjuQ==} - '@types/sinon@17.0.2': - resolution: {integrity: sha512-Zt6heIGsdqERkxctIpvN5Pv3edgBrhoeb3yHyxffd4InN0AX2SVNKSrhdDZKGQICVOxWP/q4DyhpfPNMSrpIiA==} + '@types/sinon@17.0.3': + resolution: {integrity: sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw==} '@types/sinonjs__fake-timers@8.1.5': resolution: {integrity: sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==} @@ -1507,6 +1435,10 @@ packages: resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/types@7.14.1': + resolution: {integrity: sha512-mL7zNEOQybo5R3AavY+Am7KLv8BorIv7HCYS5rKoNZKQD9tsfGUpO4KdAn3sSUvTiS4PQkr2+K0KJbxj8H9NDg==} + engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/typescript-estree@5.62.0': resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1548,23 +1480,20 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@vue/compiler-core@3.3.12': - resolution: {integrity: sha512-qAtjyG3GBLG0chzp5xGCyRLLe6wFCHmjI82aGzwuGKyznNP+GJJMxjc0wOYWDB2YKfho7niJFdoFpo0CZZQg9w==} - - '@vue/compiler-dom@3.3.12': - resolution: {integrity: sha512-RdJU9oEYaoPKUdGXCy0l+i4clesdDeLmbvRlszoc9iagsnBnMmQtYfCPVQ5BHB6o7K4SCucDdJM2Dh3oXB0D6g==} + '@vue/compiler-core@3.4.31': + resolution: {integrity: sha512-skOiodXWTV3DxfDhB4rOf3OGalpITLlgCeOwb+Y9GJpfQ8ErigdBUHomBzvG78JoVE8MJoQsb+qhZiHfKeNeEg==} - '@vue/compiler-sfc@3.3.12': - resolution: {integrity: sha512-yy5b9e7b79dsGbMmglCe/YnhCQgBkHO7Uf6JfjWPSf2/5XH+MKn18LhzhHyxbHdJgnA4lZCqtXzLaJz8Pd8lMw==} + '@vue/compiler-dom@3.4.31': + resolution: {integrity: sha512-wK424WMXsG1IGMyDGyLqB+TbmEBFM78hIsOJ9QwUVLGrcSk0ak6zYty7Pj8ftm7nEtdU/DGQxAXp0/lM/2cEpQ==} - '@vue/compiler-ssr@3.3.12': - resolution: {integrity: sha512-adCiMJPznfWcQyk/9HSuXGja859IaMV+b8UNSVzDatqv7h0PvT9BEeS22+gjkWofDiSg5d78/ZLls3sLA+cn3A==} + '@vue/compiler-sfc@3.4.31': + resolution: {integrity: sha512-einJxqEw8IIJxzmnxmJBuK2usI+lJonl53foq+9etB2HAzlPjAS/wa7r0uUpXw5ByX3/0uswVSrjNb17vJm1kQ==} - '@vue/reactivity-transform@3.3.12': - resolution: {integrity: sha512-g5TijmML7FyKkLt6QnpqNmA4KD7K/T5SbXa88Bhq+hydNQEkzA8veVXWAQuNqg9rjaFYD0rPf0a9NofKA0ENgg==} + '@vue/compiler-ssr@3.4.31': + resolution: {integrity: sha512-RtefmITAje3fJ8FSg1gwgDhdKhZVntIVbwupdyZDSifZTRMiWxWehAOTCc8/KZDnBOcYQ4/9VWxsTbd3wT0hAA==} - '@vue/shared@3.3.12': - resolution: {integrity: sha512-6p0Yin0pclvnER7BLNOQuod9Z+cxSYh8pSh7CzHnWNjAIP6zrTlCdHRvSCb1aYEx6i3Q3kvfuWU7nG16CgG1ag==} + '@vue/shared@3.4.31': + resolution: {integrity: sha512-Yp3wtJk//8cO4NItOPpi3QkLExAr/aLBGZMmTtW9WpdwBCJpRM6zj9WgWktXAl8IDIozwNMByT45JP3tO3ACWA==} '@yarnpkg/lockfile@1.1.0': resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} @@ -1581,10 +1510,6 @@ packages: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} - abstract-level@1.0.3: - resolution: {integrity: sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==} - engines: {node: '>=12'} - abstract-leveldown@2.6.3: resolution: {integrity: sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA==} @@ -1608,12 +1533,12 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@8.3.1: - resolution: {integrity: sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==} + acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} engines: {node: '>=0.4.0'} - acorn@8.11.2: - resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + acorn@8.12.0: + resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} engines: {node: '>=0.4.0'} hasBin: true @@ -1638,12 +1563,15 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + ajv@8.16.0: + resolution: {integrity: sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==} anchor-markdown-header@0.6.0: resolution: {integrity: sha512-v7HJMtE1X7wTpNFseRhxsY/pivP4uAJbidVhPT+yhz4i/vV1+qx371IXuV9V7bN6KjFtheLJxqaSm0Y/8neJTA==} + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + ansi-colors@4.1.1: resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} engines: {node: '>=6'} @@ -1660,8 +1588,8 @@ packages: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} - ansi-escapes@6.2.0: - resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} + ansi-escapes@6.2.1: + resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} engines: {node: '>=14.16'} ansi-regex@2.1.1: @@ -1758,8 +1686,9 @@ packages: resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} engines: {node: '>=8'} - array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} array-differ@3.0.0: resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} @@ -1768,8 +1697,8 @@ packages: array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - array-includes@3.1.7: - resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} array-union@2.1.0: @@ -1780,8 +1709,12 @@ packages: resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} engines: {node: '>=0.10.0'} - array.prototype.findlastindex@1.2.3: - resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} engines: {node: '>= 0.4'} array.prototype.flat@1.3.2: @@ -1792,15 +1725,19 @@ packages: resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} engines: {node: '>= 0.4'} - array.prototype.reduce@1.0.6: - resolution: {integrity: sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==} + array.prototype.reduce@1.0.7: + resolution: {integrity: sha512-mzmiUCVwtiD4lgxYP8g7IYy8El8p2CSMePvIbTS7gchKir/L1fgJrk0yDKmAX6mnRQFKNADYIk8nNlTris5H1Q==} engines: {node: '>= 0.4'} - array.prototype.tosorted@1.1.2: - resolution: {integrity: sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==} + array.prototype.toreversed@1.1.2: + resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} - arraybuffer.prototype.slice@1.0.2: - resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} engines: {node: '>= 0.4'} arrify@1.0.1: @@ -1814,8 +1751,8 @@ packages: asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - asn1.js@5.4.1: - resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} + asn1.js@4.10.1: + resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} asn1@0.2.6: resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} @@ -1850,12 +1787,6 @@ packages: async@2.6.2: resolution: {integrity: sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==} - async@2.6.4: - resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} - - asynciterator.prototype@1.0.0: - resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} - asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -1872,27 +1803,24 @@ packages: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} - available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} aws-sign2@0.7.0: resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} - aws4@1.12.0: - resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} + aws4@1.13.0: + resolution: {integrity: sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g==} axios@0.21.4: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} - axios@1.1.3: - resolution: {integrity: sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==} + axios@1.7.2: + resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} - axios@1.6.2: - resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==} - - b4a@1.6.4: - resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} + b4a@1.6.6: + resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} babel-code-frame@6.26.0: resolution: {integrity: sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==} @@ -2095,15 +2023,11 @@ packages: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} - bigint-crypto-utils@3.3.0: - resolution: {integrity: sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==} - engines: {node: '>=14.0.0'} - bignumber.js@9.1.2: resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} - binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} bintrees@1.0.2: @@ -2143,14 +2067,14 @@ packages: bn.js@5.2.1: resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - body-parser@1.20.1: - resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - body-parser@1.20.2: resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + boxen@5.1.2: + resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} + engines: {node: '>=10'} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -2161,19 +2085,13 @@ packages: resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} engines: {node: '>=0.10.0'} - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - breakword@1.0.6: - resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} - brorand@1.1.0: resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - browser-level@1.0.1: - resolution: {integrity: sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==} - browser-stdout@1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} @@ -2189,21 +2107,16 @@ packages: browserify-rsa@4.1.0: resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==} - browserify-sign@4.2.2: - resolution: {integrity: sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==} - engines: {node: '>= 4'} + browserify-sign@4.2.3: + resolution: {integrity: sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw==} + engines: {node: '>= 0.12'} browserslist@3.2.8: resolution: {integrity: sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==} hasBin: true - browserslist@4.22.2: - resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + browserslist@4.23.1: + resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -2213,8 +2126,8 @@ packages: bs58check@2.1.2: resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} - bsert@0.0.12: - resolution: {integrity: sha512-lUB0EMu4KhIf+VQ6RZJ7J3dFdohYSeta+gNgDi00Hi/t3k/W6xZlwm9PSSG0q7hJ2zW9Rsn5yaMPymETxroTRw==} + bsert@0.0.13: + resolution: {integrity: sha512-gYzSj8I2lDTKvl4aRSYs2CZIpeJugq7RjGhLRG+Jl//gEW5B2u1MKB6exVCL09FqYj6JRQAAgRwQHMOWvr7A8A==} engines: {node: '>=8.0.0'} buffer-from@1.1.2: @@ -2280,8 +2193,9 @@ packages: resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} engines: {node: '>=8'} - call-bind@1.0.5: - resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} callsite@1.0.0: resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} @@ -2290,10 +2204,6 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} - camelcase-keys@7.0.2: resolution: {integrity: sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==} engines: {node: '>=12'} @@ -2310,37 +2220,26 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001570: - resolution: {integrity: sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==} - - caniuse-lite@1.0.30001600: - resolution: {integrity: sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==} + caniuse-lite@1.0.30001639: + resolution: {integrity: sha512-eFHflNTBIlFwP2AIKaYuBQN/apnUoKNhBdza8ZnW/h2di4LCZ4xFqYlxUxo+LQ76KFI1PGcC1QDxMbxTZpSCAg==} cardinal@2.1.1: resolution: {integrity: sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==} hasBin: true - case@1.6.3: - resolution: {integrity: sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==} - engines: {node: '>= 0.8.0'} - caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - catering@2.1.1: - resolution: {integrity: sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==} - engines: {node: '>=6'} - ccount@1.1.0: resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} - chai-as-promised@7.1.1: - resolution: {integrity: sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==} + chai-as-promised@7.1.2: + resolution: {integrity: sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==} peerDependencies: - chai: '>= 2.1.2 < 5' + chai: '>= 2.1.2 < 6' - chai@4.3.10: - resolution: {integrity: sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==} + chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} engines: {node: '>=4'} chalk@1.1.3: @@ -2377,8 +2276,8 @@ packages: checkpoint-store@1.1.0: resolution: {integrity: sha512-J/NdY2WvIx654cc6LWSq/IYFFCUf75fFTgwzFnmbqyORH4MwgiQCgswLLKBGzmsyTI5V7i5bp/So6sMbDWhedg==} - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} chownr@1.1.4: @@ -2417,10 +2316,6 @@ packages: resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} engines: {node: '>=0.10.0'} - classic-level@1.3.0: - resolution: {integrity: sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==} - engines: {node: '>=12'} - clean-regexp@1.0.0: resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} engines: {node: '>=4'} @@ -2429,6 +2324,10 @@ packages: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} + cli-boxes@2.2.1: + resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} + engines: {node: '>=6'} + cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} @@ -2579,8 +2478,8 @@ packages: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} - cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} cookiejar@2.1.4: @@ -2594,11 +2493,11 @@ packages: resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} hasBin: true - core-js-compat@3.36.1: - resolution: {integrity: sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==} + core-js-compat@3.37.1: + resolution: {integrity: sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==} - core-js-pure@3.34.0: - resolution: {integrity: sha512-pmhivkYXkymswFfbXsANmBAewXx86UBfmagP+w0wkK06kLsLlTK5oQmsURPivzMkIBQiYq2cjamcZExIwlFQIg==} + core-js-pure@3.37.1: + resolution: {integrity: sha512-J/r5JTHSmzTxbiYYrzXg9w1VpqrYt+gexenBE9pugeyhwPZTAEJddyiReJWsLO6uNQ8xJZFbod6XC7KKwatCiA==} core-js@2.6.12: resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} @@ -2627,11 +2526,6 @@ packages: typescript: optional: true - crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} - hasBin: true - create-ecdh@4.0.4: resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} @@ -2661,26 +2555,26 @@ packages: crypto-browserify@3.12.0: resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==} - csv-generate@3.4.3: - resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} - - csv-parse@4.16.3: - resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} - - csv-stringify@5.6.5: - resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} - - csv@5.5.3: - resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} - engines: {node: '>= 0.1.90'} - - d@1.0.1: - resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + d@1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} dashdash@1.14.1: resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} engines: {node: '>=0.10'} + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + dataloader@1.4.0: resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} @@ -2721,9 +2615,14 @@ packages: supports-color: optional: true - decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} + debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} @@ -2745,8 +2644,8 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} deep-equal@1.1.2: @@ -2781,8 +2680,8 @@ packages: resolution: {integrity: sha512-5fMC8ek8alH16QiV0lTCis610D1Zt1+LA4MS4d63JgS32lrCjTFDUFz2ao09/j2I4Bqb5jL4FZYwu7Jz0XO1ww==} engines: {node: '>=6'} - define-data-property@1.1.1: - resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} define-lazy-prop@2.0.0: @@ -2862,8 +2761,8 @@ packages: resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} engines: {node: '>=0.3.1'} - diff@5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} diffie-hellman@5.0.3: @@ -2909,8 +2808,12 @@ packages: resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} engines: {node: '>=10'} - dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + dotenv@16.3.2: + resolution: {integrity: sha512-HTlk5nmhkm8F6JcdXvHIzaorzCoziNQT9mGxLPVXW8wJF1TiGSL60ZGB4gHWabHOaMmWmhvk2/lPHfnBiT78AQ==} + engines: {node: '>=12'} + + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} dotenv@8.6.0: @@ -2923,7 +2826,6 @@ packages: ds-test.git#9310e879db8ba3ea6d5c6489a579118fd264a3f5@https://codeload.github.com/dapphub/ds-test/tar.gz/9310e879db8ba3ea6d5c6489a579118fd264a3f5: resolution: {tarball: https://codeload.github.com/dapphub/ds-test/tar.gz/9310e879db8ba3ea6d5c6489a579118fd264a3f5} - name: ds-test.git#9310e879db8ba3ea6d5c6489a579118fd264a3f5 version: 0.0.0 duplexer3@0.1.5: @@ -2932,8 +2834,8 @@ packages: duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - duplexify@4.1.2: - resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==} + duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -2944,15 +2846,15 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.4.615: - resolution: {integrity: sha512-/bKPPcgZVUziECqDc+0HkT87+0zhaWSZHNXqF8FLd2lQcptpmUFwoCSWjCdOng9Gdq+afKArPdEg/0ZW461Eng==} - - electron-to-chromium@1.4.715: - resolution: {integrity: sha512-XzWNH4ZSa9BwVUQSDorPWAUQ5WGuYz7zJUNpNif40zFCiCl20t8zgylmreNmn26h5kiyw2lg7RfTmeMBsDklqg==} + electron-to-chromium@1.4.815: + resolution: {integrity: sha512-OvpTT2ItpOXJL7IGcYakRjHCt8L5GrrN/wHCQsRB4PQa1X9fe+X9oen245mIId7s14xvArCGSTIq644yPUKKLg==} elliptic@6.5.4: resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + elliptic@6.5.5: + resolution: {integrity: sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==} + emoji-regex@10.1.0: resolution: {integrity: sha512-xAEnNCT3w2Tg6MA7ly6QqYJvEoY1tm9iIjJ3yMKK9JPlWuRHAMoe5iETwQnx3M9TVbFMfsrBgWKR+IsmswwNjg==} @@ -2982,8 +2884,8 @@ packages: end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - enhanced-resolve@5.15.0: - resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + enhanced-resolve@5.17.0: + resolution: {integrity: sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==} engines: {node: '>=10.13.0'} enquirer@2.3.6: @@ -3001,6 +2903,10 @@ packages: resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} engines: {node: '>=0.12'} + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -3016,18 +2922,34 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.22.3: - resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} + es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} engines: {node: '>= 0.4'} es-array-method-boxes-properly@1.0.0: resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} - es-iterator-helpers@1.0.15: - resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.0.19: + resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} - es-set-tostringtag@2.0.2: - resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} es-shim-unscopables@1.0.2: @@ -3037,8 +2959,8 @@ packages: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} - es5-ext@0.10.62: - resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} + es5-ext@0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} engines: {node: '>=0.10'} es6-error@4.1.1: @@ -3047,11 +2969,12 @@ packages: es6-iterator@2.0.3: resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} - es6-symbol@3.1.3: - resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} + es6-symbol@3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} - escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} escape-html@1.0.3: @@ -3089,8 +3012,8 @@ packages: eslint: '*' eslint-plugin-import: '*' - eslint-module-utils@2.8.0: - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + eslint-module-utils@2.8.1: + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -3126,8 +3049,8 @@ packages: '@typescript-eslint/parser': optional: true - eslint-plugin-jsdoc@48.2.3: - resolution: {integrity: sha512-r9DMAmFs66VNvNqRLLjHejdnJtILrt3xGi+Qx0op0oRfFGVpOR1Hb3BC++MacseHx93d8SKYPhyrC9BS7Os2QA==} + eslint-plugin-jsdoc@48.5.0: + resolution: {integrity: sha512-ukXPNpGby3KjCveCizIS8t1EbuJEHYEu/tBg8GCbn/YbHcXwphyvYCdvRZ/oMRfTscGSSzfsWoZ+ZkAP0/6YMQ==} engines: {node: '>=18'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 @@ -3160,8 +3083,8 @@ packages: peerDependencies: eslint: ^7.0.0 - eslint-plugin-react@7.33.2: - resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} + eslint-plugin-react@7.34.3: + resolution: {integrity: sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 @@ -3196,11 +3119,15 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint@8.56.0: - resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true + esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3274,8 +3201,8 @@ packages: resolution: {integrity: sha512-/MSbf/r2/Ld8o0l15AymjOTlPqpN8Cr4ByUEA9GtR4x0yAh3TdtDzEg29zMjXCNPI7u6E5fOQdj/Cf9Tc7oVNw==} deprecated: 'New package name format for new versions: @ethereumjs/ethash. Please update.' - ethereum-bloom-filters@1.0.10: - resolution: {integrity: sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==} + ethereum-bloom-filters@1.1.0: + resolution: {integrity: sha512-J1gDRkLpuGNvWYzWslBQR9cDV4nd4kfvVTE/Wy4Kkm4yb3EYRSlyi0eB/inTsSTTVyA0+HyzHgbr95Fn/Z1fSw==} ethereum-common@0.0.18: resolution: {integrity: sha512-EoltVQTRNg2Uy4o84qpa2aXymXDJhxm7eos/ACOg0DG4baAbMjhbdAEsx9GeE8sC3XCxnYvrrzZDH8D8MtA2iQ==} @@ -3289,8 +3216,8 @@ packages: ethereum-cryptography@1.2.0: resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} - ethereum-cryptography@2.1.2: - resolution: {integrity: sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==} + ethereum-cryptography@2.2.0: + resolution: {integrity: sha512-hsm9JhfytIf8QME/3B7j4bc8V+VdTU+Vas1aJlvIS96ffoNAosudXvGoEvWmc7QZYdkC8mrMJz9r0fcbw7GyCA==} ethereum-waffle@3.4.4: resolution: {integrity: sha512-PA9+jCjw4WC3Oc5ocSMBj5sXvueWQeAbvCA+hUlb6oFgwwKyq5ka3bWQ7QZcjzIX+TdFkxP4IbFmoY2D8Dkj9Q==} @@ -3305,7 +3232,6 @@ packages: ethereumjs-abi@https://codeload.github.com/ethereumjs/ethereumjs-abi/tar.gz/ee3994657fa7a427238e6ba92a84d0b529bbcde0: resolution: {tarball: https://codeload.github.com/ethereumjs/ethereumjs-abi/tar.gz/ee3994657fa7a427238e6ba92a84d0b529bbcde0} - name: ethereumjs-abi version: 0.6.8 ethereumjs-account@2.0.5: @@ -3376,7 +3302,9 @@ packages: ethjs-util@0.1.6: resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} engines: {node: '>=6.5.0', npm: '>=3'} - bundledDependencies: false + + event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} event-target-shim@5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} @@ -3417,8 +3345,8 @@ packages: peerDependencies: prom-client: '>=12.0.0' - express@4.18.2: - resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + express@4.19.2: + resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} engines: {node: '>= 0.10.0'} ext@1.7.0: @@ -3453,8 +3381,8 @@ packages: fake-merkle-patricia-tree@1.0.1: resolution: {integrity: sha512-Tgq37lkc9pUIgIKw5uitNUKcgcYL3R6JvXtKQbOf/ZSavXbidsksgp/pAY6p//uhw0I4yoMsvTSovvVIsk/qxA==} - fast-copy@3.0.1: - resolution: {integrity: sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==} + fast-copy@3.0.2: + resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -3472,15 +3400,15 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-redact@3.3.0: - resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} engines: {node: '>=6'} fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fastq@1.16.0: - resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} fault@1.0.4: resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} @@ -3488,8 +3416,8 @@ packages: fetch-ponyfill@4.1.0: resolution: {integrity: sha512-knK9sGskIg2T7OnYLdZ2hZXn0CtDrAIBxYQLpmEf0BqfdWnwmM1weccUl5+4EdA44tzNSFAuxITPbXtPehUB3g==} - ffjavascript@0.2.62: - resolution: {integrity: sha512-uJ7MTrdzhX/3f+hxn0XhdXbJCqYZJSBB6y2/ui4t21vKYVjyTMlU80pPXu40ir6qpqbrdzUeKdlOdJ0aFG9UNA==} + ffjavascript@0.2.63: + resolution: {integrity: sha512-dBgdsfGks58b66JnUZeZpGxdMIDQ4QsD3VYlRJyFVrKQHb2kJy4R2gufx5oetrTxXPT+aEjg0dOvOLg1N0on4A==} figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} @@ -3503,8 +3431,8 @@ packages: resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} engines: {node: '>=0.10.0'} - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} finalhandler@1.2.0: @@ -3563,8 +3491,8 @@ packages: flatstr@1.0.12: resolution: {integrity: sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==} - flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} flow-stoplight@1.0.0: resolution: {integrity: sha512-rDjbZUKpN8OYhB0IE/vY/I8UWO/602IIJEU/76Tv4LvYnwHCk0BCsvz4eRr9n+FQcri7L5cyaXOo0+/Kh4HisA==} @@ -3572,8 +3500,8 @@ packages: fmix@0.1.0: resolution: {integrity: sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==} - follow-redirects@1.15.3: - resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -3592,8 +3520,8 @@ packages: resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} engines: {node: '>=8.0.0'} - foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + foreground-child@3.2.1: + resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} engines: {node: '>=14'} forever-agent@0.6.1: @@ -3601,7 +3529,6 @@ packages: forge-std@https://codeload.github.com/foundry-rs/forge-std/tar.gz/46264e9788017fc74f9f58b7efa0bc6e1df6d410: resolution: {tarball: https://codeload.github.com/foundry-rs/forge-std/tar.gz/46264e9788017fc74f9f58b7efa0bc6e1df6d410} - name: forge-std version: 1.5.2 form-data@2.3.3: @@ -3719,8 +3646,9 @@ packages: get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - get-intrinsic@1.2.2: - resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} @@ -3738,12 +3666,12 @@ packages: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} - get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} - get-tsconfig@4.7.2: - resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} + get-tsconfig@4.7.5: + resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} get-value@2.0.6: resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} @@ -3760,23 +3688,27 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} + glob@10.4.2: + resolution: {integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==} + engines: {node: '>=16 || 14 >=14.18'} hasBin: true glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + deprecated: Glob versions prior to v9 are no longer supported glob@7.2.0: resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + deprecated: Glob versions prior to v9 are no longer supported glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported global-modules@1.0.0: resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} @@ -3801,8 +3733,8 @@ packages: resolution: {integrity: sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==} engines: {node: '>=0.10.0'} - globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} globby@11.1.0: @@ -3823,9 +3755,6 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} @@ -3838,15 +3767,11 @@ packages: engines: {node: '>=6'} deprecated: this library is no longer supported - hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - hardhat-deploy@0.11.45: resolution: {integrity: sha512-aC8UNaq3JcORnEUIwV945iJuvBwi65tjHVDU3v6mOcqik7WAzHVCJ7cwmkkipsHrWysrB5YvGF1q9S1vIph83w==} - hardhat@2.19.2: - resolution: {integrity: sha512-CRU3+0Cc8Qh9UpxKd8cLADDPes7ZDtKj4dTK+ERtLBomEzhRPLWklJn4VKOwjre9/k8GNd/e9DYxpfuzcxbXPQ==} + hardhat@2.22.5: + resolution: {integrity: sha512-9Zq+HonbXCSy6/a13GY1cgHglQRfh4qkzmj1tpPlhxJDwNVnhxlReV6K7hCWFKlOrV13EQwsdcD0rjcaQKWRZw==} hasBin: true peerDependencies: ts-node: '*' @@ -3876,19 +3801,19 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-property-descriptors@1.0.1: - resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} engines: {node: '>= 0.4'} has-symbols@1.0.3: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} - has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} has-value@0.3.1: @@ -3911,6 +3836,10 @@ packages: resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} engines: {node: '>= 0.4.0'} + hash-base@3.0.4: + resolution: {integrity: sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==} + engines: {node: '>=4'} + hash-base@3.1.0: resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} engines: {node: '>=4'} @@ -3922,8 +3851,8 @@ packages: resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} engines: {node: '>=8'} - hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} he@1.2.0: @@ -4009,8 +3938,8 @@ packages: ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@5.3.0: - resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} immediate@3.2.3: @@ -4019,8 +3948,8 @@ packages: immediate@3.3.0: resolution: {integrity: sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==} - immutable@4.3.4: - resolution: {integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==} + immutable@4.3.6: + resolution: {integrity: sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==} import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} @@ -4040,6 +3969,7 @@ packages: inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -4047,8 +3977,8 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - internal-slot@1.0.6: - resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} invariant@2.2.4: @@ -4079,8 +4009,9 @@ packages: resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} engines: {node: '>= 0.4'} - is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -4119,13 +4050,18 @@ packages: resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} hasBin: true - is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-core-module@2.14.0: + resolution: {integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==} + engines: {node: '>= 0.4'} is-data-descriptor@1.0.1: resolution: {integrity: sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==} engines: {node: '>= 0.4'} + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} @@ -4207,11 +4143,12 @@ packages: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} - is-map@2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} - is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} is-number-object@1.0.7: @@ -4230,10 +4167,6 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} - is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - is-plain-obj@2.1.0: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} engines: {node: '>=8'} @@ -4246,11 +4179,13 @@ packages: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} - is-set@2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} - is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} is-stream@1.1.0: resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} @@ -4276,8 +4211,8 @@ packages: resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} engines: {node: '>= 0.4'} - is-typed-array@1.1.12: - resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} engines: {node: '>= 0.4'} is-typedarray@1.0.0: @@ -4293,14 +4228,16 @@ packages: is-utf8@0.2.1: resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} - is-weakmap@2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - is-weakset@2.0.2: - resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} @@ -4357,15 +4294,15 @@ packages: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} - istanbul-reports@3.1.6: - resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} iterator.prototype@1.1.2: resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} - jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + jackspeak@3.4.0: + resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} engines: {node: '>=14'} jest-diff@29.7.0: @@ -4380,9 +4317,6 @@ packages: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} - js-sdsl@4.4.2: - resolution: {integrity: sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==} - js-sha3@0.5.7: resolution: {integrity: sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==} @@ -4458,8 +4392,8 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json-stable-stringify@1.1.0: - resolution: {integrity: sha512-zfA+5SuwYN2VWqN1/5HZaDzQKLJHaBVMZIIM+wuYjdptkaQsqzDdqjqf+lZZJUuJq1aanHiY8LhH8LmH+qBYJA==} + json-stable-stringify@1.1.1: + resolution: {integrity: sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==} engines: {node: '>= 0.4'} json-stringify-safe@5.0.1: @@ -4481,6 +4415,9 @@ packages: jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + jsonfile@2.4.0: resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==} @@ -4529,10 +4466,6 @@ packages: klaw@1.3.1: resolution: {integrity: sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==} - kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - lcid@1.0.0: resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} engines: {node: '>=0.10.0'} @@ -4576,14 +4509,6 @@ packages: level-sublevel@6.6.4: resolution: {integrity: sha512-pcCrTUOiO48+Kp6F1+UAzF/OtWqLcQVTVF39HLdZ3RO8XBoXt+XVPKZO1vVr1aUoxHZA9OtD2e1v7G+3S5KFDA==} - level-supports@4.0.1: - resolution: {integrity: sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==} - engines: {node: '>=12'} - - level-transcoder@1.0.1: - resolution: {integrity: sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==} - engines: {node: '>=12'} - level-ws@0.0.0: resolution: {integrity: sha512-XUTaO/+Db51Uiyp/t7fCMGVFOTdtLS/NIACxE/GHsij15mKzxksZifKVjlXDF41JMUP/oM1Oc4YNGdKnc3dVLw==} @@ -4591,10 +4516,6 @@ packages: resolution: {integrity: sha512-RXEfCmkd6WWFlArh3X8ONvQPm8jNpfA0s/36M4QzLqrLEIt1iJE9WBHLZ5vZJK6haMjJPJGJCQWfjMNnRcq/9Q==} engines: {node: '>=6'} - level@8.0.0: - resolution: {integrity: sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==} - engines: {node: '>=12'} - levelup@1.3.9: resolution: {integrity: sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ==} @@ -4708,8 +4629,8 @@ packages: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} - lru-cache@10.1.0: - resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} + lru-cache@10.3.0: + resolution: {integrity: sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==} engines: {node: 14 || >=16.14} lru-cache@3.2.0: @@ -4721,10 +4642,6 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - lru_map@0.3.3: resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} @@ -4737,9 +4654,8 @@ packages: lunr@2.3.9: resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} - magic-string@0.30.5: - resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} - engines: {node: '>=12'} + magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} @@ -4756,10 +4672,6 @@ packages: resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} engines: {node: '>=0.10.0'} - map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - map-obj@4.3.0: resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} engines: {node: '>=8'} @@ -4789,10 +4701,6 @@ packages: match-all@1.2.6: resolution: {integrity: sha512-0EESkXiTkWzrQQntBu2uzKvLu6vVkUGz40nGPbSZuegcfE5UuSzNjLaIu76zJWuaT/2I3Z/8M06OlUOZLGwLlQ==} - mcl-wasm@0.7.9: - resolution: {integrity: sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==} - engines: {node: '>=8.9.0'} - md5.js@1.3.5: resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} @@ -4840,18 +4748,10 @@ packages: resolution: {integrity: sha512-tbV02LfZMWLcHcq4tw++NuqMO+FZX8tNJEiD2aNRm48ZZusVg5N8NART+dmBkepJVye986oixErf7jfXboMGMA==} engines: {node: '>=6'} - memory-level@1.0.0: - resolution: {integrity: sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==} - engines: {node: '>=12'} - memorystream@0.3.1: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} - meow@6.1.1: - resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} - engines: {node: '>=8'} - merge-descriptors@1.0.1: resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} @@ -4910,6 +4810,10 @@ packages: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + miller-rabin@4.0.1: resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==} hasBin: true @@ -4980,9 +4884,9 @@ packages: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} - minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -4998,6 +4902,10 @@ packages: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + minizlib@1.3.3: resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} @@ -5009,10 +4917,6 @@ packages: resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} engines: {node: '>=0.10.0'} - mixme@0.5.10: - resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==} - engines: {node: '>= 8.0.0'} - mkdirp-promise@5.0.1: resolution: {integrity: sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==} engines: {node: '>=4'} @@ -5027,11 +4931,16 @@ packages: engines: {node: '>=10'} hasBin: true + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + mnemonist@0.38.5: resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} - mocha@10.2.0: - resolution: {integrity: sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==} + mocha@10.5.2: + resolution: {integrity: sha512-9btlN3JKCefPf+vKd/kcKz2SXxi12z6JswkGfaAF0saQvnsqLJk504ZmbxhSoENge08E9dsymozKgFMTl5PQsA==} engines: {node: '>= 14.0.0'} hasBin: true @@ -5042,14 +4951,14 @@ packages: resolution: {integrity: sha512-2emPTb1reeLLYwHxyVx993iYyCHEiRRO+y8NFXFPL5kl5q14sgTK76cXyEKkeKCHeRw35SfdkUJ10Q1KfHuiIQ==} engines: {node: '>= 0.4'} - module-error@1.0.2: - resolution: {integrity: sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==} - engines: {node: '>=10'} - morgan@1.10.0: resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} engines: {node: '>= 0.8.0'} + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} @@ -5091,11 +5000,6 @@ packages: nanoassert@2.0.0: resolution: {integrity: sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==} - nanoid@3.3.3: - resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -5105,9 +5009,6 @@ packages: resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} engines: {node: '>=0.10.0'} - napi-macros@2.2.2: - resolution: {integrity: sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==} - natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} @@ -5145,8 +5046,8 @@ packages: encoding: optional: true - node-gyp-build@4.7.1: - resolution: {integrity: sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg==} + node-gyp-build@4.8.1: + resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} hasBin: true node-machine-id@1.1.12: @@ -5185,8 +5086,8 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} - npm-run-path@5.1.0: - resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} number-is-nan@1.0.1: @@ -5197,8 +5098,8 @@ packages: resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} engines: {node: '>=6.5.0', npm: '>=3'} - nx-cloud@16.5.2: - resolution: {integrity: sha512-1t1Ii9gojl8r/8hFGaZ/ZyYR0Cb0hzvXLCsaFuvg+EJEFdvua3P4cfNya/0bdRrm+7Eb/ITUOskbvYq4TSlyGg==} + nx-cloud@19.0.0: + resolution: {integrity: sha512-Aq1vQD8yBIdb5jLVpzsqmu8yDmMvRVdjaM30Pp1hghhlSvorGBlpTwY+TccZJv/hBtVO+SpXK8SnnegRZMrxdw==} hasBin: true nx@18.1.2: @@ -5232,11 +5133,12 @@ packages: object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} - object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} - object-is@1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} engines: {node: '>= 0.4'} object-keys@0.4.0: @@ -5254,30 +5156,32 @@ packages: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} - object.entries@1.1.7: - resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} + object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} engines: {node: '>= 0.4'} - object.fromentries@2.0.7: - resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} engines: {node: '>= 0.4'} - object.getownpropertydescriptors@2.1.7: - resolution: {integrity: sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==} + object.getownpropertydescriptors@2.1.8: + resolution: {integrity: sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==} engines: {node: '>= 0.8'} - object.groupby@1.0.1: - resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} - object.hasown@1.1.3: - resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} + object.hasown@1.1.4: + resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} + engines: {node: '>= 0.4'} object.pick@1.3.0: resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} engines: {node: '>=0.10.0'} - object.values@1.1.7: - resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} obliterator@2.0.4: @@ -5321,8 +5225,8 @@ packages: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} - optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} ora@5.3.0: @@ -5408,12 +5312,16 @@ packages: resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} engines: {node: '>=8'} + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} - parse-asn1@5.1.6: - resolution: {integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==} + parse-asn1@5.1.7: + resolution: {integrity: sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg==} + engines: {node: '>= 0.10'} parse-entities@2.0.0: resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} @@ -5421,6 +5329,10 @@ packages: parse-headers@2.0.5: resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==} + parse-imports@2.1.0: + resolution: {integrity: sha512-JQWgmK2o4w8leUkZeZPatWdAny6vXGU/3siIUvMF6J2rDCud9aTt8h/px9oZJ6U3EcfhngBJ635uPFI0q0VAeA==} + engines: {node: '>= 18'} + parse-json@2.2.0: resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} engines: {node: '>=0.10.0'} @@ -5485,9 +5397,9 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} @@ -5510,8 +5422,8 @@ packages: performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -5538,15 +5450,15 @@ packages: resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} engines: {node: '>=0.10.0'} - pino-abstract-transport@1.1.0: - resolution: {integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==} + pino-abstract-transport@1.2.0: + resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} pino-multi-stream@5.3.0: resolution: {integrity: sha512-4fAGCRll18I+JmoAbxDvU9zc5sera/3c+VgTtUdoNMOZ/VSHB+HMAYtixKpeRmZTDHDDdE2rtwjVkuwWB8mYQA==} deprecated: No longer supported. Use the multi-stream support in the latest core Pino - pino-pretty@10.3.0: - resolution: {integrity: sha512-JthvQW289q3454mhM3/38wFYGWPiBMR28T3CpDNABzoTQOje9UKS7XCJQSnjWF9LQGQkGd8D7h0oq+qwiM3jFA==} + pino-pretty@11.2.1: + resolution: {integrity: sha512-O05NuD9tkRasFRWVaF/uHLOvoRDFD7tb5VMertr78rbsYFjYp48Vg3477EshVAF5eZaEw+OpDl/tu+B0R5o+7g==} hasBin: true pino-sentry@0.7.0: @@ -5557,8 +5469,8 @@ packages: pino-std-serializers@3.2.0: resolution: {integrity: sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg==} - pino-std-serializers@6.2.2: - resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} + pino-std-serializers@7.0.0: + resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} pino@6.14.0: resolution: {integrity: sha512-iuhEDel3Z3hF9Jfe44DPXR8l07bhjuFY3GMHIXbjnY9XcafbyDDwl2sN2vw2GjMPf5Nkoe+OFao7ffn9SXaKDg==} @@ -5579,8 +5491,12 @@ packages: resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} engines: {node: '>=0.10.0'} - postcss@8.4.32: - resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==} + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss@8.4.39: + resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==} engines: {node: ^10 || ^12 || >=14} postinstall-postinstall@2.1.0: @@ -5590,8 +5506,8 @@ packages: resolution: {integrity: sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ==} engines: {node: '>= 0.6'} - preferred-pm@3.1.2: - resolution: {integrity: sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==} + preferred-pm@3.1.3: + resolution: {integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==} engines: {node: '>=10'} prelude-ls@1.2.1: @@ -5606,8 +5522,8 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} - prettier-plugin-solidity@1.2.0: - resolution: {integrity: sha512-fgxcUZpVAP+LlRfy5JI5oaAkXGkmsje2VJ5krv/YMm+rcTZbIUwFguSw5f+WFuttMjpDm6wB4UL7WVkArEfiVA==} + prettier-plugin-solidity@1.3.1: + resolution: {integrity: sha512-MN4OP5I2gHAzHZG1wcuJl0FsLS3c4Cc5494bbg+6oQWBPuEamjwDvmGfFMZ6NFzsh3Efd9UUxeT7ImgjNH4ozA==} engines: {node: '>=16'} peerDependencies: prettier: '>=2.3.0' @@ -5714,8 +5630,8 @@ packages: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} engines: {node: '>=0.6'} - qs@6.11.2: - resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + qs@6.12.1: + resolution: {integrity: sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==} engines: {node: '>=0.6'} qs@6.5.3: @@ -5732,10 +5648,6 @@ packages: quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - quick-lru@5.1.1: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} @@ -5750,10 +5662,6 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} - raw-body@2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} - engines: {node: '>= 0.8'} - raw-body@2.5.2: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} @@ -5761,8 +5669,8 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} read-pkg-up@1.0.1: resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} @@ -5797,18 +5705,14 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} - readable-stream@4.5.1: - resolution: {integrity: sha512-uQjbf34vmf/asGnOHQEw07Q4llgMACQZTWWa4MmICS0IKJoHbLwKCy71H3eR99Dw5iYejc6W+pqZZEeqRtUFAw==} + readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} - redeyed@2.1.1: resolution: {integrity: sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==} @@ -5816,8 +5720,8 @@ packages: resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} engines: {node: '>=6'} - reflect.getprototypeof@1.0.4: - resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} + reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} engines: {node: '>= 0.4'} regenerate@1.4.2: @@ -5840,8 +5744,8 @@ packages: resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} hasBin: true - regexp.prototype.flags@1.5.1: - resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} + regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} regexpp@3.2.0: @@ -5984,20 +5888,22 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rfdc@1.3.0: - resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rimraf@5.0.5: - resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} - engines: {node: '>=14'} + rimraf@5.0.7: + resolution: {integrity: sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==} + engines: {node: '>=14.18'} hasBin: true ripemd160@2.0.2: @@ -6007,9 +5913,6 @@ packages: resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} hasBin: true - run-parallel-limit@1.1.0: - resolution: {integrity: sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==} - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -6019,8 +5922,8 @@ packages: rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - safe-array-concat@1.0.1: - resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} engines: {node: '>=0.4'} safe-buffer@5.1.2: @@ -6033,8 +5936,9 @@ packages: resolution: {integrity: sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg==} deprecated: Renamed to @metamask/safe-event-emitter - safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} safe-regex@1.1.0: resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} @@ -6077,13 +5981,8 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - - semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} engines: {node: '>=10'} hasBin: true @@ -6105,12 +6004,12 @@ packages: set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - set-function-length@1.1.1: - resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} - set-function-name@2.0.1: - resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} engines: {node: '>= 0.4'} set-immediate-shim@1.0.1: @@ -6150,8 +6049,9 @@ packages: shiki@0.10.1: resolution: {integrity: sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng==} - side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -6178,6 +6078,9 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} + slashes@3.0.12: + resolution: {integrity: sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==} + slice-ansi@4.0.0: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} @@ -6190,11 +6093,6 @@ packages: resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} engines: {node: '>=18'} - smartwrap@2.0.2: - resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} - engines: {node: '>=6'} - hasBin: true - snapdragon-node@2.1.1: resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} engines: {node: '>=0.10.0'} @@ -6231,8 +6129,8 @@ packages: resolution: {integrity: sha512-85EeLbmkcPwD+3JR7aEMKsVC9YrRSxd4qkXuMzrlf7+z2Eqdfm1wHWq1ffTuo5aDhoZxp2I9yF3QkxZOxOL7aQ==} hasBin: true - solidity-comments-extractor@0.0.7: - resolution: {integrity: sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==} + solidity-comments-extractor@0.0.8: + resolution: {integrity: sha512-htM7Vn6LhHreR+EglVMd2s+sZhcXAirB1Zlyrv5zBuTxieCvjfnRpd7iZk75m/u6NOlEyQ94C6TWbBn2cY7w8g==} sonic-boom@1.4.1: resolution: {integrity: sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==} @@ -6240,11 +6138,11 @@ packages: sonic-boom@2.8.0: resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==} - sonic-boom@3.7.0: - resolution: {integrity: sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==} + sonic-boom@4.0.1: + resolution: {integrity: sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==} - source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} source-map-resolve@0.5.3: @@ -6282,8 +6180,8 @@ packages: spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} @@ -6291,8 +6189,8 @@ packages: spdx-expression-parse@4.0.0: resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} - spdx-license-ids@3.0.16: - resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} + spdx-license-ids@3.0.18: + resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==} split-string@3.1.0: resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} @@ -6329,15 +6227,12 @@ packages: resolution: {integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==} engines: {node: '>=0.10.0'} - stream-shift@1.0.1: - resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} stream-to-pull-stream@1.7.3: resolution: {integrity: sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg==} - stream-transform@2.1.3: - resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} - strict-uri-encode@1.1.0: resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} engines: {node: '>=0.10.0'} @@ -6361,22 +6256,24 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string-width@7.0.0: - resolution: {integrity: sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==} + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} - string.prototype.matchall@4.0.10: - resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} + string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} - string.prototype.trim@1.2.8: - resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.7: - resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} - string.prototype.trimstart@1.0.7: - resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} string_decoder@0.10.31: resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} @@ -6439,9 +6336,10 @@ packages: superagent@8.1.2: resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} engines: {node: '>=6.4.0 <13 || >=14'} + deprecated: Please upgrade to v9.0.0+ as we have fixed a public vulnerability with formidable dependency. Note that v9.0.0+ requires Node.js v14.18.0+. See https://github.com/ladjs/superagent/pull/1800 for insight. This project is supported and maintained by the team at Forward Email @ https://forwardemail.net - supertest@6.3.3: - resolution: {integrity: sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==} + supertest@6.3.4: + resolution: {integrity: sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==} engines: {node: '>=6.4.0'} supports-color@2.0.0: @@ -6471,12 +6369,16 @@ packages: swarm-js@0.1.42: resolution: {integrity: sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==} + synckit@0.9.0: + resolution: {integrity: sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==} + engines: {node: ^14.18.0 || >=16.0.0} + table-layout@1.0.2: resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} engines: {node: '>=8.0.0'} - table@6.8.1: - resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} + table@6.8.2: + resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} engines: {node: '>=10.0.0'} tapable@2.2.1: @@ -6495,9 +6397,9 @@ packages: resolution: {integrity: sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==} engines: {node: '>=4.5'} - tar@6.1.11: - resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} - engines: {node: '>= 10'} + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} tdigest@0.1.2: resolution: {integrity: sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==} @@ -6542,9 +6444,9 @@ packages: resolution: {integrity: sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==} engines: {node: '>=6'} - tmp@0.2.1: - resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} - engines: {node: '>=8.17.0'} + tmp@0.2.3: + resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} + engines: {node: '>=14.14'} to-fast-properties@1.0.3: resolution: {integrity: sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==} @@ -6585,12 +6487,9 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - traverse@0.6.7: - resolution: {integrity: sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==} - - trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} + traverse@0.6.9: + resolution: {integrity: sha512-7bBrcF+/LQzSgFmT0X5YclVqQxtv7TDJ1f8Wj7ibBu/U6BMLeOpUxuZjV7rMc44UtKxlnMFigdhFAIszSX1DMg==} + engines: {node: '>= 0.4'} trim-right@1.0.1: resolution: {integrity: sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==} @@ -6602,9 +6501,9 @@ packages: true-case-path@2.2.1: resolution: {integrity: sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q==} - ts-api-utils@1.0.3: - resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} - engines: {node: '>=16.13.0'} + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' @@ -6678,8 +6577,8 @@ packages: tslib@2.3.1: resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} tsort@0.0.1: resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} @@ -6690,11 +6589,6 @@ packages: peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - tty-table@4.2.3: - resolution: {integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==} - engines: {node: '>=8.0.0'} - hasBin: true - tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} @@ -6715,10 +6609,6 @@ packages: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} - type-fest@0.13.1: - resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} - engines: {node: '>=10'} - type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} @@ -6743,19 +6633,12 @@ packages: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} - type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} - type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} - type@1.2.0: - resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} - - type@2.7.2: - resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + type@2.7.3: + resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} typechain@3.0.0: resolution: {integrity: sha512-ft4KVmiN3zH4JUFu2WJBrwfHeDf772Tt2d8bssDTo/YcckKW2D+OwFrHXRC6hJvO3mHjFQTihoMV6fJOi0Hngg==} @@ -6767,24 +6650,29 @@ packages: peerDependencies: typescript: '>=4.3.0' - typed-array-buffer@1.0.0: - resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} - typed-array-byte-length@1.0.0: - resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} engines: {node: '>= 0.4'} - typed-array-byte-offset@1.0.0: - resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} engines: {node: '>= 0.4'} - typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + typedarray.prototype.slice@1.0.3: + resolution: {integrity: sha512-8WbVAQAUlENo1q3c3zZYuy5k9VzBQvp8AX9WOtbvyWlLM1v5JaSRmjubLjzHF4JFtptjH/5c/i95yaElvcjC0A==} + engines: {node: '>= 0.4'} + typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} @@ -6795,18 +6683,13 @@ packages: peerDependencies: typescript: 4.0.x || 4.1.x || 4.2.x || 4.3.x || 4.4.x || 4.5.x || 4.6.x || 4.7.x - typescript@4.7.4: - resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==} - engines: {node: '>=4.2.0'} - hasBin: true - typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} hasBin: true - typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + typescript@5.5.2: + resolution: {integrity: sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==} engines: {node: '>=14.17'} hasBin: true @@ -6845,8 +6728,8 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici@5.28.2: - resolution: {integrity: sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==} + undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} unified@9.2.2: @@ -6889,8 +6772,8 @@ packages: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} - update-browserslist-db@1.0.13: - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + update-browserslist-db@1.0.16: + resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -7060,6 +6943,7 @@ packages: web3-provider-engine@14.2.1: resolution: {integrity: sha512-iSv31h2qXkr9vrL6UZDm4leZMc32SjWJFGOp/D92JXfcEboCqraZyuExDkpxKw8ziTufXieNM7LSXNHzszYdJw==} + deprecated: 'This package has been deprecated, see the README for details: https://github.com/MetaMask/web3-provider-engine' web3-providers-http@1.2.11: resolution: {integrity: sha512-psh4hYGb1+ijWywfwpB2cvvOIMISlR44F/rJtYkRmQ5jMvG4FOCPlQJPiHQZo+2cc3HbktvvSJzIhkWQJdmvrA==} @@ -7077,8 +6961,8 @@ packages: resolution: {integrity: sha512-B3OrO3oG1L+bv3E1sTwCx66injW1A8hhwpknDUbV+sw3fehFazA06z9SGXUefuFI1kVs4q2vRi0n4oCcI4dZDg==} engines: {node: '>=8.0.0'} - web3-utils@1.10.3: - resolution: {integrity: sha512-OqcUrEE16fDBbGoQtZXWdavsPzbGIDc5v3VrRTZ0XrIpefC/viZ1ZU9bGEemazyS0catk/3rkOOxpzTfY+XsyQ==} + web3-utils@1.10.4: + resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} engines: {node: '>=8.0.0'} web3-utils@1.2.11: @@ -7109,8 +6993,9 @@ packages: resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} engines: {node: '>= 0.4'} - which-collection@1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} which-module@1.0.0: resolution: {integrity: sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==} @@ -7122,8 +7007,8 @@ packages: resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} engines: {node: '>=8.15'} - which-typed-array@1.1.13: - resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} engines: {node: '>= 0.4'} which@1.3.1: @@ -7135,11 +7020,19 @@ packages: engines: {node: '>= 8'} hasBin: true + widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + window-size@0.2.0: resolution: {integrity: sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==} engines: {node: '>= 0.10.0'} hasBin: true + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + wordwrapjs@4.0.1: resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} engines: {node: '>=8.0.0'} @@ -7184,8 +7077,8 @@ packages: utf-8-validate: optional: true - ws@5.2.3: - resolution: {integrity: sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==} + ws@5.2.4: + resolution: {integrity: sha512-fFCejsuC8f9kOSu9FYaOw8CdO68O3h5v0lg4p74o8JqWpwTf9tniOD+nOB78aWoVSS6WptVUmDrp/KPsMVBWFQ==} peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ^5.0.2 @@ -7207,8 +7100,8 @@ packages: utf-8-validate: optional: true - ws@7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} engines: {node: '>=8.3.0'} peerDependencies: bufferutil: ^4.0.1 @@ -7281,10 +7174,6 @@ packages: resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} engines: {node: '>=10'} - yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -7331,177 +7220,163 @@ packages: snapshots: - '@aashutoshrathi/word-wrap@1.2.6': {} - - '@ampproject/remapping@2.2.1': + '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 - '@babel/code-frame@7.23.5': + '@babel/code-frame@7.24.7': dependencies: - '@babel/highlight': 7.23.4 - chalk: 2.4.2 + '@babel/highlight': 7.24.7 + picocolors: 1.0.1 - '@babel/compat-data@7.23.5': {} + '@babel/compat-data@7.24.7': {} - '@babel/core@7.23.6': + '@babel/core@7.24.7': dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) - '@babel/helpers': 7.23.6 - '@babel/parser': 7.23.6 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.6 - '@babel/types': 7.23.6 + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.24.7 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helpers': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/template': 7.24.7 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 convert-source-map: 2.0.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/eslint-parser@7.24.1(@babel/core@7.23.6)(eslint@8.56.0)': + '@babel/eslint-parser@7.24.7(@babel/core@7.24.7)(eslint@8.57.0)': dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.24.7 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 - eslint: 8.56.0 + eslint: 8.57.0 eslint-visitor-keys: 2.1.0 semver: 6.3.1 - '@babel/generator@7.23.6': + '@babel/generator@7.24.7': dependencies: - '@babel/types': 7.23.6 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 + '@babel/types': 7.24.7 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 - '@babel/helper-compilation-targets@7.23.6': + '@babel/helper-compilation-targets@7.24.7': dependencies: - '@babel/compat-data': 7.23.5 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.22.2 + '@babel/compat-data': 7.24.7 + '@babel/helper-validator-option': 7.24.7 + browserslist: 4.23.1 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-environment-visitor@7.22.20': {} + '@babel/helper-environment-visitor@7.24.7': + dependencies: + '@babel/types': 7.24.7 - '@babel/helper-function-name@7.23.0': + '@babel/helper-function-name@7.24.7': dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.6 + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 - '@babel/helper-hoist-variables@7.22.5': + '@babel/helper-hoist-variables@7.24.7': dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.24.7 - '@babel/helper-module-imports@7.22.15': + '@babel/helper-module-imports@7.24.7': dependencies: - '@babel/types': 7.23.6 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color - '@babel/helper-module-transforms@7.23.3(@babel/core@7.23.6)': + '@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7)': dependencies: - '@babel/core': 7.23.6 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/core': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + transitivePeerDependencies: + - supports-color - '@babel/helper-simple-access@7.22.5': + '@babel/helper-simple-access@7.24.7': dependencies: - '@babel/types': 7.23.6 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color - '@babel/helper-split-export-declaration@7.22.6': + '@babel/helper-split-export-declaration@7.24.7': dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.24.7 - '@babel/helper-string-parser@7.23.4': {} + '@babel/helper-string-parser@7.24.7': {} - '@babel/helper-validator-identifier@7.22.20': {} + '@babel/helper-validator-identifier@7.24.7': {} - '@babel/helper-validator-option@7.23.5': {} + '@babel/helper-validator-option@7.24.7': {} - '@babel/helpers@7.23.6': + '@babel/helpers@7.24.7': dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.6 - '@babel/types': 7.23.6 - transitivePeerDependencies: - - supports-color + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 - '@babel/highlight@7.23.4': + '@babel/highlight@7.24.7': dependencies: - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-validator-identifier': 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 + picocolors: 1.0.1 - '@babel/parser@7.23.6': + '@babel/parser@7.24.7': dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.24.7 - '@babel/runtime@7.23.6': + '@babel/runtime@7.24.7': dependencies: regenerator-runtime: 0.14.1 - '@babel/template@7.22.15': + '@babel/template@7.24.7': dependencies: - '@babel/code-frame': 7.23.5 - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 - '@babel/traverse@7.23.6': + '@babel/traverse@7.24.7': dependencies: - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 - debug: 4.3.4(supports-color@8.1.1) + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-hoist-variables': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 + debug: 4.3.5 globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.23.6': + '@babel/types@7.24.7': dependencies: - '@babel/helper-string-parser': 7.23.4 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-string-parser': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 - '@chainsafe/as-sha256@0.3.1': {} - - '@chainsafe/persistent-merkle-tree@0.4.2': - dependencies: - '@chainsafe/as-sha256': 0.3.1 - - '@chainsafe/persistent-merkle-tree@0.5.0': - dependencies: - '@chainsafe/as-sha256': 0.3.1 - - '@chainsafe/ssz@0.10.2': - dependencies: - '@chainsafe/as-sha256': 0.3.1 - '@chainsafe/persistent-merkle-tree': 0.5.0 - - '@chainsafe/ssz@0.9.4': + '@changesets/apply-release-plan@7.0.3': dependencies: - '@chainsafe/as-sha256': 0.3.1 - '@chainsafe/persistent-merkle-tree': 0.4.2 - case: 1.6.3 - - '@changesets/apply-release-plan@7.0.0': - dependencies: - '@babel/runtime': 7.23.6 - '@changesets/config': 3.0.0 + '@babel/runtime': 7.24.7 + '@changesets/config': 3.0.1 '@changesets/get-version-range-type': 0.4.0 '@changesets/git': 3.0.0 + '@changesets/should-skip-package': 0.1.0 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 detect-indent: 6.1.0 @@ -7510,47 +7385,49 @@ snapshots: outdent: 0.5.0 prettier: 2.8.8 resolve-from: 5.0.0 - semver: 7.5.4 + semver: 7.6.2 - '@changesets/assemble-release-plan@6.0.0': + '@changesets/assemble-release-plan@6.0.2': dependencies: - '@babel/runtime': 7.23.6 + '@babel/runtime': 7.24.7 '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.0.0 + '@changesets/get-dependents-graph': 2.1.0 + '@changesets/should-skip-package': 0.1.0 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 - semver: 7.5.4 + semver: 7.6.2 '@changesets/changelog-git@0.2.0': dependencies: '@changesets/types': 6.0.0 - '@changesets/changelog-github@0.4.8': + '@changesets/changelog-github@0.4.8(encoding@0.1.13)': dependencies: - '@changesets/get-github-info': 0.5.2 + '@changesets/get-github-info': 0.5.2(encoding@0.1.13) '@changesets/types': 5.2.1 dotenv: 8.6.0 transitivePeerDependencies: - encoding - '@changesets/cli@2.27.1': + '@changesets/cli@2.27.6': dependencies: - '@babel/runtime': 7.23.6 - '@changesets/apply-release-plan': 7.0.0 - '@changesets/assemble-release-plan': 6.0.0 + '@babel/runtime': 7.24.7 + '@changesets/apply-release-plan': 7.0.3 + '@changesets/assemble-release-plan': 6.0.2 '@changesets/changelog-git': 0.2.0 - '@changesets/config': 3.0.0 + '@changesets/config': 3.0.1 '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.0.0 - '@changesets/get-release-plan': 4.0.0 + '@changesets/get-dependents-graph': 2.1.0 + '@changesets/get-release-plan': 4.0.2 '@changesets/git': 3.0.0 '@changesets/logger': 0.1.0 '@changesets/pre': 2.0.0 '@changesets/read': 0.6.0 + '@changesets/should-skip-package': 0.1.0 '@changesets/types': 6.0.0 - '@changesets/write': 0.3.0 + '@changesets/write': 0.3.1 '@manypkg/get-packages': 1.1.3 - '@types/semver': 7.5.6 + '@types/semver': 7.5.8 ansi-colors: 4.1.3 chalk: 2.4.2 ci-info: 3.9.0 @@ -7558,50 +7435,49 @@ snapshots: external-editor: 3.1.0 fs-extra: 7.0.1 human-id: 1.0.2 - meow: 6.1.1 + mri: 1.2.0 outdent: 0.5.0 p-limit: 2.3.0 - preferred-pm: 3.1.2 + preferred-pm: 3.1.3 resolve-from: 5.0.0 - semver: 7.5.4 + semver: 7.6.2 spawndamnit: 2.0.0 term-size: 2.2.1 - tty-table: 4.2.3 - '@changesets/config@3.0.0': + '@changesets/config@3.0.1': dependencies: '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.0.0 + '@changesets/get-dependents-graph': 2.1.0 '@changesets/logger': 0.1.0 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - micromatch: 4.0.5 + micromatch: 4.0.7 '@changesets/errors@0.2.0': dependencies: extendable-error: 0.1.7 - '@changesets/get-dependents-graph@2.0.0': + '@changesets/get-dependents-graph@2.1.0': dependencies: '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 chalk: 2.4.2 fs-extra: 7.0.1 - semver: 7.5.4 + semver: 7.6.2 - '@changesets/get-github-info@0.5.2': + '@changesets/get-github-info@0.5.2(encoding@0.1.13)': dependencies: dataloader: 1.4.0 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) transitivePeerDependencies: - encoding - '@changesets/get-release-plan@4.0.0': + '@changesets/get-release-plan@4.0.2': dependencies: - '@babel/runtime': 7.23.6 - '@changesets/assemble-release-plan': 6.0.0 - '@changesets/config': 3.0.0 + '@babel/runtime': 7.24.7 + '@changesets/assemble-release-plan': 6.0.2 + '@changesets/config': 3.0.1 '@changesets/pre': 2.0.0 '@changesets/read': 0.6.0 '@changesets/types': 6.0.0 @@ -7611,12 +7487,12 @@ snapshots: '@changesets/git@3.0.0': dependencies: - '@babel/runtime': 7.23.6 + '@babel/runtime': 7.24.7 '@changesets/errors': 0.2.0 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 is-subdir: 1.2.0 - micromatch: 4.0.5 + micromatch: 4.0.7 spawndamnit: 2.0.0 '@changesets/logger@0.1.0': @@ -7630,7 +7506,7 @@ snapshots: '@changesets/pre@2.0.0': dependencies: - '@babel/runtime': 7.23.6 + '@babel/runtime': 7.24.7 '@changesets/errors': 0.2.0 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 @@ -7638,7 +7514,7 @@ snapshots: '@changesets/read@0.6.0': dependencies: - '@babel/runtime': 7.23.6 + '@babel/runtime': 7.24.7 '@changesets/git': 3.0.0 '@changesets/logger': 0.1.0 '@changesets/parse': 0.4.0 @@ -7647,26 +7523,32 @@ snapshots: fs-extra: 7.0.1 p-filter: 2.1.0 + '@changesets/should-skip-package@0.1.0': + dependencies: + '@babel/runtime': 7.24.7 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + '@changesets/types@4.1.0': {} '@changesets/types@5.2.1': {} '@changesets/types@6.0.0': {} - '@changesets/write@0.3.0': + '@changesets/write@0.3.1': dependencies: - '@babel/runtime': 7.23.6 + '@babel/runtime': 7.24.7 '@changesets/types': 6.0.0 fs-extra: 7.0.1 human-id: 1.0.2 prettier: 2.8.8 - '@codechecks/client@0.1.12(typescript@5.3.3)': + '@codechecks/client@0.1.12(typescript@5.5.2)': dependencies: bluebird: 3.7.2 chalk: 2.4.2 commander: 2.20.3 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 execa: 1.0.0 glob: 7.2.3 graceful-fs: 4.2.11 @@ -7681,7 +7563,7 @@ snapshots: request: 2.88.2 request-promise: 4.2.6(request@2.88.2) ts-essentials: 1.0.4 - ts-node: 8.10.2(typescript@5.3.3) + ts-node: 8.10.2(typescript@5.5.2) url-join: 4.0.1 transitivePeerDependencies: - supports-color @@ -7691,24 +7573,22 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@defi-wonderland/smock@2.3.5(@ethersproject/abi@5.7.0)(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@nomiclabs/hardhat-ethers@2.2.3)(ethers@5.7.2)(hardhat@2.19.2)': + '@defi-wonderland/smock@2.4.0(@ethersproject/abi@5.7.0)(@ethersproject/abstract-provider@5.7.0)(@ethersproject/abstract-signer@5.7.0)(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@5.0.10)))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@5.0.10))': dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 - '@nomicfoundation/ethereumjs-evm': 1.3.2 - '@nomicfoundation/ethereumjs-util': 8.0.6 - '@nomicfoundation/ethereumjs-vm': 6.4.2 - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2)(hardhat@2.19.2) - diff: 5.1.0 - ethers: 5.7.2 - hardhat: 2.19.2(ts-node@10.9.2)(typescript@4.9.5) + '@nomicfoundation/ethereumjs-util': 9.0.4 + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@5.0.10)) + diff: 5.2.0 + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + hardhat: 2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@5.0.10) lodash.isequal: 4.5.0 lodash.isequalwith: 4.4.0 rxjs: 7.8.1 - semver: 7.5.4 + semver: 7.6.2 transitivePeerDependencies: - - supports-color + - c-kzg '@ensdomains/ens@0.4.5': dependencies: @@ -7716,30 +7596,33 @@ snapshots: eth-ens-namehash: 2.0.8 solc: 0.4.26 testrpc: 0.0.1 - web3-utils: 1.10.3 + web3-utils: 1.10.4 '@ensdomains/resolver@0.2.4': {} - '@es-joy/jsdoccomment@0.42.0': + '@es-joy/jsdoccomment@0.43.1': dependencies: + '@types/eslint': 8.56.10 + '@types/estree': 1.0.5 + '@typescript-eslint/types': 7.14.1 comment-parser: 1.4.1 esquery: 1.5.0 jsdoc-type-pratt-parser: 4.0.0 - '@eslint-community/eslint-utils@4.4.0(eslint@8.56.0)': + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': dependencies: - eslint: 8.56.0 + eslint: 8.57.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.10.0': {} + '@eslint-community/regexpp@4.11.0': {} '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 espree: 9.6.1 globals: 13.24.0 - ignore: 5.3.0 + ignore: 5.3.1 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -7747,31 +7630,31 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.56.0': {} + '@eslint/js@8.57.0': {} - '@ethereum-waffle/chai@3.4.4': + '@ethereum-waffle/chai@3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: - '@ethereum-waffle/provider': 3.4.4 - ethers: 5.7.2 + '@ethereum-waffle/provider': 3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - encoding - supports-color - utf-8-validate - '@ethereum-waffle/compiler@3.4.4(typescript@4.7.4)': + '@ethereum-waffle/compiler@3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(typescript@4.9.5)(utf-8-validate@5.0.10)': dependencies: '@resolver-engine/imports': 0.3.3 '@resolver-engine/imports-fs': 0.3.3 - '@typechain/ethers-v5': 2.0.0(ethers@5.7.2)(typechain@3.0.0) + '@typechain/ethers-v5': 2.0.0(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@3.0.0(typescript@4.9.5)) '@types/mkdirp': 0.5.2 - '@types/node-fetch': 2.6.9 - ethers: 5.7.2 + '@types/node-fetch': 2.6.11 + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) mkdirp: 0.5.6 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) solc: 0.6.12 ts-generator: 0.1.1 - typechain: 3.0.0(typescript@4.7.4) + typechain: 3.0.0(typescript@4.9.5) transitivePeerDependencies: - bufferutil - encoding @@ -7779,19 +7662,19 @@ snapshots: - typescript - utf-8-validate - '@ethereum-waffle/compiler@3.4.4(typescript@4.9.5)': + '@ethereum-waffle/compiler@3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.5.2)(utf-8-validate@5.0.10)': dependencies: '@resolver-engine/imports': 0.3.3 '@resolver-engine/imports-fs': 0.3.3 - '@typechain/ethers-v5': 2.0.0(ethers@5.7.2)(typechain@3.0.0) + '@typechain/ethers-v5': 2.0.0(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@3.0.0(typescript@5.5.2)) '@types/mkdirp': 0.5.2 - '@types/node-fetch': 2.6.9 - ethers: 5.7.2 + '@types/node-fetch': 2.6.11 + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) mkdirp: 0.5.6 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) solc: 0.6.12 ts-generator: 0.1.1 - typechain: 3.0.0(typescript@4.9.5) + typechain: 3.0.0(typescript@5.5.2) transitivePeerDependencies: - bufferutil - encoding @@ -7799,28 +7682,28 @@ snapshots: - typescript - utf-8-validate - '@ethereum-waffle/ens@3.4.4': + '@ethereum-waffle/ens@3.4.4(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@ensdomains/ens': 0.4.5 '@ensdomains/resolver': 0.2.4 - ethers: 5.7.2 + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate - '@ethereum-waffle/mock-contract@3.4.4': + '@ethereum-waffle/mock-contract@3.4.4(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@ethersproject/abi': 5.7.0 - ethers: 5.7.2 + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate - '@ethereum-waffle/provider@3.4.4': + '@ethereum-waffle/provider@3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10)': dependencies: - '@ethereum-waffle/ens': 3.4.4 - ethers: 5.7.2 - ganache-core: 2.13.2 + '@ethereum-waffle/ens': 3.4.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ganache-core: 2.13.2(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) patch-package: 6.5.1 postinstall-postinstall: 2.1.0 transitivePeerDependencies: @@ -7834,7 +7717,7 @@ snapshots: '@ethereumjs/util@8.1.0': dependencies: '@ethereumjs/rlp': 4.0.1 - ethereum-cryptography: 2.1.2 + ethereum-cryptography: 2.2.0 micro-ftch: 0.3.1 '@ethersproject/abi@5.0.0-beta.153': @@ -7987,7 +7870,7 @@ snapshots: dependencies: '@ethersproject/logger': 5.7.0 - '@ethersproject/providers@5.7.2': + '@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@ethersproject/abstract-provider': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 @@ -8008,7 +7891,7 @@ snapshots: '@ethersproject/transactions': 5.7.0 '@ethersproject/web': 5.7.1 bech32: 1.1.4 - ws: 7.4.6 + ws: 7.4.6(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -8105,43 +7988,43 @@ snapshots: '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 - '@fastify/busboy@2.1.0': {} + '@fastify/busboy@2.1.1': {} '@foundry-rs/easy-foundryup@0.1.3': dependencies: command-exists: 1.2.9 ts-interface-checker: 0.1.13 - '@foundry-rs/hardhat-forge@0.1.17(@nomiclabs/hardhat-ethers@2.2.3)(ethereum-waffle@3.4.4)(ethers@5.7.2)(hardhat@2.19.2)': + '@foundry-rs/hardhat-forge@0.1.17(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@5.0.10)))(ethereum-waffle@3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(typescript@4.9.5)(utf-8-validate@5.0.10))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@5.0.10))': dependencies: '@foundry-rs/easy-foundryup': 0.1.3 - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2)(hardhat@2.19.2) - '@nomiclabs/hardhat-waffle': 2.0.6(@nomiclabs/hardhat-ethers@2.2.3)(@types/sinon-chai@3.2.12)(ethereum-waffle@3.4.4)(ethers@5.7.2)(hardhat@2.19.2) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@5.0.10)) + '@nomiclabs/hardhat-waffle': 2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(typescript@4.9.5)(utf-8-validate@5.0.10))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@5.0.10)) '@types/sinon-chai': 3.2.12 '@types/web3': 1.0.19 camelcase-keys: 7.0.2 - debug: 4.3.4(supports-color@8.1.1) - ethereum-waffle: 3.4.4(typescript@4.9.5) - ethers: 5.7.2 + debug: 4.3.5 + ethereum-waffle: 3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(typescript@4.9.5)(utf-8-validate@5.0.10) + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) fs-extra: 10.1.0 glob: 7.2.3 - hardhat: 2.19.2(ts-node@10.9.2)(typescript@4.9.5) + hardhat: 2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@5.0.10) true-case-path: 2.2.1 ts-interface-checker: 0.1.13 transitivePeerDependencies: - supports-color - '@humanwhocodes/config-array@0.11.13': + '@humanwhocodes/config-array@0.11.14': dependencies: - '@humanwhocodes/object-schema': 2.0.1 - debug: 4.3.4(supports-color@8.1.1) + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.5 minimatch: 3.1.2 transitivePeerDependencies: - supports-color '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.1': {} + '@humanwhocodes/object-schema@2.0.3': {} '@isaacs/cliui@8.0.2': dependencies: @@ -8166,46 +8049,86 @@ snapshots: dependencies: '@sinclair/typebox': 0.27.8 - '@jridgewell/gen-mapping@0.3.3': + '@jridgewell/gen-mapping@0.3.5': dependencies: - '@jridgewell/set-array': 1.1.2 + '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/resolve-uri@3.1.1': {} + '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/set-array@1.1.2': {} + '@jridgewell/set-array@1.2.1': {} '@jridgewell/sourcemap-codec@1.4.15': {} - '@jridgewell/trace-mapping@0.3.20': + '@jridgewell/trace-mapping@0.3.25': dependencies: - '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping@0.3.9': dependencies: - '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 + '@kroma/contracts@1.0.0(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.2))(typescript@5.5.2)(utf-8-validate@5.0.10)': + dependencies: + '@kroma/core-utils': 1.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@openzeppelin/contracts': 4.9.3 + '@openzeppelin/contracts-upgradeable': 4.9.3 + circomlibjs: 0.1.7(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + hardhat: 2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.2))(typescript@5.5.2)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - c-kzg + - supports-color + - ts-node + - typescript + - utf-8-validate + + '@kroma/core-utils@1.0.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/contracts': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@ethersproject/rlp': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + bufio: 1.2.1 + chai: 4.4.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@kroma/hardhat-deploy-config@1.0.0': {} + '@ljharb/resumer@0.0.1': dependencies: - '@ljharb/through': 2.3.11 + '@ljharb/through': 2.3.13 - '@ljharb/through@2.3.11': + '@ljharb/through@2.3.13': dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.23.6 + '@babel/runtime': 7.24.7 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.23.6 + '@babel/runtime': 7.24.7 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 @@ -8224,15 +8147,13 @@ snapshots: dependencies: eslint-scope: 5.1.1 - '@noble/curves@1.1.0': + '@noble/curves@1.4.0': dependencies: - '@noble/hashes': 1.3.1 + '@noble/hashes': 1.4.0 '@noble/hashes@1.2.0': {} - '@noble/hashes@1.3.1': {} - - '@noble/hashes@1.3.3': {} + '@noble/hashes@1.4.0': {} '@noble/secp256k1@1.7.1': {} @@ -8246,307 +8167,119 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.16.0 + fastq: 1.17.1 - '@nomicfoundation/ethereumjs-block@4.2.2': - dependencies: - '@nomicfoundation/ethereumjs-common': 3.1.2 - '@nomicfoundation/ethereumjs-rlp': 4.0.3 - '@nomicfoundation/ethereumjs-trie': 5.0.5 - '@nomicfoundation/ethereumjs-tx': 4.1.2 - '@nomicfoundation/ethereumjs-util': 8.0.6 - ethereum-cryptography: 0.1.3 + '@nomicfoundation/edr-darwin-arm64@0.4.0': {} - '@nomicfoundation/ethereumjs-block@5.0.2': - dependencies: - '@nomicfoundation/ethereumjs-common': 4.0.2 - '@nomicfoundation/ethereumjs-rlp': 5.0.2 - '@nomicfoundation/ethereumjs-trie': 6.0.2 - '@nomicfoundation/ethereumjs-tx': 5.0.2 - '@nomicfoundation/ethereumjs-util': 9.0.2 - ethereum-cryptography: 0.1.3 - ethers: 5.7.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate + '@nomicfoundation/edr-darwin-x64@0.4.0': {} - '@nomicfoundation/ethereumjs-blockchain@6.2.2': - dependencies: - '@nomicfoundation/ethereumjs-block': 4.2.2 - '@nomicfoundation/ethereumjs-common': 3.1.2 - '@nomicfoundation/ethereumjs-ethash': 2.0.5 - '@nomicfoundation/ethereumjs-rlp': 4.0.3 - '@nomicfoundation/ethereumjs-trie': 5.0.5 - '@nomicfoundation/ethereumjs-util': 8.0.6 - abstract-level: 1.0.3 - debug: 4.3.4(supports-color@8.1.1) - ethereum-cryptography: 0.1.3 - level: 8.0.0 - lru-cache: 5.1.1 - memory-level: 1.0.0 - transitivePeerDependencies: - - supports-color + '@nomicfoundation/edr-linux-arm64-gnu@0.4.0': {} - '@nomicfoundation/ethereumjs-blockchain@7.0.2': - dependencies: - '@nomicfoundation/ethereumjs-block': 5.0.2 - '@nomicfoundation/ethereumjs-common': 4.0.2 - '@nomicfoundation/ethereumjs-ethash': 3.0.2 - '@nomicfoundation/ethereumjs-rlp': 5.0.2 - '@nomicfoundation/ethereumjs-trie': 6.0.2 - '@nomicfoundation/ethereumjs-tx': 5.0.2 - '@nomicfoundation/ethereumjs-util': 9.0.2 - abstract-level: 1.0.3 - debug: 4.3.4(supports-color@8.1.1) - ethereum-cryptography: 0.1.3 - level: 8.0.0 - lru-cache: 5.1.1 - memory-level: 1.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate + '@nomicfoundation/edr-linux-arm64-musl@0.4.0': {} - '@nomicfoundation/ethereumjs-common@3.1.2': - dependencies: - '@nomicfoundation/ethereumjs-util': 8.0.6 - crc-32: 1.2.2 + '@nomicfoundation/edr-linux-x64-gnu@0.4.0': {} - '@nomicfoundation/ethereumjs-common@4.0.2': - dependencies: - '@nomicfoundation/ethereumjs-util': 9.0.2 - crc-32: 1.2.2 + '@nomicfoundation/edr-linux-x64-musl@0.4.0': {} - '@nomicfoundation/ethereumjs-ethash@2.0.5': - dependencies: - '@nomicfoundation/ethereumjs-block': 4.2.2 - '@nomicfoundation/ethereumjs-rlp': 4.0.3 - '@nomicfoundation/ethereumjs-util': 8.0.6 - abstract-level: 1.0.3 - bigint-crypto-utils: 3.3.0 - ethereum-cryptography: 0.1.3 - - '@nomicfoundation/ethereumjs-ethash@3.0.2': - dependencies: - '@nomicfoundation/ethereumjs-block': 5.0.2 - '@nomicfoundation/ethereumjs-rlp': 5.0.2 - '@nomicfoundation/ethereumjs-util': 9.0.2 - abstract-level: 1.0.3 - bigint-crypto-utils: 3.3.0 - ethereum-cryptography: 0.1.3 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@nomicfoundation/ethereumjs-evm@1.3.2': - dependencies: - '@nomicfoundation/ethereumjs-common': 3.1.2 - '@nomicfoundation/ethereumjs-util': 8.0.6 - '@types/async-eventemitter': 0.2.4 - async-eventemitter: 0.2.4 - debug: 4.3.4(supports-color@8.1.1) - ethereum-cryptography: 0.1.3 - mcl-wasm: 0.7.9 - rustbn.js: 0.2.0 - transitivePeerDependencies: - - supports-color - - '@nomicfoundation/ethereumjs-evm@2.0.2': - dependencies: - '@ethersproject/providers': 5.7.2 - '@nomicfoundation/ethereumjs-common': 4.0.2 - '@nomicfoundation/ethereumjs-tx': 5.0.2 - '@nomicfoundation/ethereumjs-util': 9.0.2 - debug: 4.3.4(supports-color@8.1.1) - ethereum-cryptography: 0.1.3 - mcl-wasm: 0.7.9 - rustbn.js: 0.2.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@nomicfoundation/ethereumjs-rlp@4.0.3': {} - - '@nomicfoundation/ethereumjs-rlp@5.0.2': {} + '@nomicfoundation/edr-win32-x64-msvc@0.4.0': {} - '@nomicfoundation/ethereumjs-statemanager@1.0.5': + '@nomicfoundation/edr@0.4.0': dependencies: - '@nomicfoundation/ethereumjs-common': 3.1.2 - '@nomicfoundation/ethereumjs-rlp': 4.0.3 - '@nomicfoundation/ethereumjs-trie': 5.0.5 - '@nomicfoundation/ethereumjs-util': 8.0.6 - debug: 4.3.4(supports-color@8.1.1) - ethereum-cryptography: 0.1.3 - functional-red-black-tree: 1.0.1 - transitivePeerDependencies: - - supports-color + '@nomicfoundation/edr-darwin-arm64': 0.4.0 + '@nomicfoundation/edr-darwin-x64': 0.4.0 + '@nomicfoundation/edr-linux-arm64-gnu': 0.4.0 + '@nomicfoundation/edr-linux-arm64-musl': 0.4.0 + '@nomicfoundation/edr-linux-x64-gnu': 0.4.0 + '@nomicfoundation/edr-linux-x64-musl': 0.4.0 + '@nomicfoundation/edr-win32-x64-msvc': 0.4.0 - '@nomicfoundation/ethereumjs-statemanager@2.0.2': + '@nomicfoundation/ethereumjs-common@4.0.4': dependencies: - '@nomicfoundation/ethereumjs-common': 4.0.2 - '@nomicfoundation/ethereumjs-rlp': 5.0.2 - debug: 4.3.4(supports-color@8.1.1) - ethereum-cryptography: 0.1.3 - ethers: 5.7.2 - js-sdsl: 4.4.2 + '@nomicfoundation/ethereumjs-util': 9.0.4 transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@nomicfoundation/ethereumjs-trie@5.0.5': - dependencies: - '@nomicfoundation/ethereumjs-rlp': 4.0.3 - '@nomicfoundation/ethereumjs-util': 8.0.6 - ethereum-cryptography: 0.1.3 - readable-stream: 3.6.2 - - '@nomicfoundation/ethereumjs-trie@6.0.2': - dependencies: - '@nomicfoundation/ethereumjs-rlp': 5.0.2 - '@nomicfoundation/ethereumjs-util': 9.0.2 - '@types/readable-stream': 2.3.15 - ethereum-cryptography: 0.1.3 - readable-stream: 3.6.2 - - '@nomicfoundation/ethereumjs-tx@4.1.2': - dependencies: - '@nomicfoundation/ethereumjs-common': 3.1.2 - '@nomicfoundation/ethereumjs-rlp': 4.0.3 - '@nomicfoundation/ethereumjs-util': 8.0.6 - ethereum-cryptography: 0.1.3 + - c-kzg - '@nomicfoundation/ethereumjs-tx@5.0.2': - dependencies: - '@chainsafe/ssz': 0.9.4 - '@ethersproject/providers': 5.7.2 - '@nomicfoundation/ethereumjs-common': 4.0.2 - '@nomicfoundation/ethereumjs-rlp': 5.0.2 - '@nomicfoundation/ethereumjs-util': 9.0.2 - ethereum-cryptography: 0.1.3 - transitivePeerDependencies: - - bufferutil - - utf-8-validate + '@nomicfoundation/ethereumjs-rlp@5.0.4': {} - '@nomicfoundation/ethereumjs-util@8.0.6': + '@nomicfoundation/ethereumjs-tx@5.0.4': dependencies: - '@nomicfoundation/ethereumjs-rlp': 4.0.3 + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 ethereum-cryptography: 0.1.3 - '@nomicfoundation/ethereumjs-util@9.0.2': + '@nomicfoundation/ethereumjs-util@9.0.4': dependencies: - '@chainsafe/ssz': 0.10.2 - '@nomicfoundation/ethereumjs-rlp': 5.0.2 + '@nomicfoundation/ethereumjs-rlp': 5.0.4 ethereum-cryptography: 0.1.3 - '@nomicfoundation/ethereumjs-vm@6.4.2': - dependencies: - '@nomicfoundation/ethereumjs-block': 4.2.2 - '@nomicfoundation/ethereumjs-blockchain': 6.2.2 - '@nomicfoundation/ethereumjs-common': 3.1.2 - '@nomicfoundation/ethereumjs-evm': 1.3.2 - '@nomicfoundation/ethereumjs-rlp': 4.0.3 - '@nomicfoundation/ethereumjs-statemanager': 1.0.5 - '@nomicfoundation/ethereumjs-trie': 5.0.5 - '@nomicfoundation/ethereumjs-tx': 4.1.2 - '@nomicfoundation/ethereumjs-util': 8.0.6 - '@types/async-eventemitter': 0.2.4 - async-eventemitter: 0.2.4 - debug: 4.3.4(supports-color@8.1.1) - ethereum-cryptography: 0.1.3 - functional-red-black-tree: 1.0.1 - mcl-wasm: 0.7.9 - rustbn.js: 0.2.0 - transitivePeerDependencies: - - supports-color - - '@nomicfoundation/ethereumjs-vm@7.0.2': - dependencies: - '@nomicfoundation/ethereumjs-block': 5.0.2 - '@nomicfoundation/ethereumjs-blockchain': 7.0.2 - '@nomicfoundation/ethereumjs-common': 4.0.2 - '@nomicfoundation/ethereumjs-evm': 2.0.2 - '@nomicfoundation/ethereumjs-rlp': 5.0.2 - '@nomicfoundation/ethereumjs-statemanager': 2.0.2 - '@nomicfoundation/ethereumjs-trie': 6.0.2 - '@nomicfoundation/ethereumjs-tx': 5.0.2 - '@nomicfoundation/ethereumjs-util': 9.0.2 - debug: 4.3.4(supports-color@8.1.1) - ethereum-cryptography: 0.1.3 - mcl-wasm: 0.7.9 - rustbn.js: 0.2.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1': + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': optional: true - '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1': + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': optional: true - '@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1': + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': optional: true - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1': + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': optional: true - '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1': + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': optional: true - '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1': + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': optional: true - '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1': + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': optional: true - '@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1': - optional: true - - '@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1': - optional: true + '@nomicfoundation/solidity-analyzer@0.1.2': + optionalDependencies: + '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.2 + '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.2 + '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.2 - '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1': - optional: true + '@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@5.0.10))': + dependencies: + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + hardhat: 2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@5.0.10) - '@nomicfoundation/solidity-analyzer@0.1.1': - optionalDependencies: - '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.1 - '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.1 - '@nomicfoundation/solidity-analyzer-freebsd-x64': 0.1.1 - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.1 - '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.1 - '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.1 - '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.1 - '@nomicfoundation/solidity-analyzer-win32-arm64-msvc': 0.1.1 - '@nomicfoundation/solidity-analyzer-win32-ia32-msvc': 0.1.1 - '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.1 + '@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.2))(typescript@5.5.2)(utf-8-validate@5.0.10))': + dependencies: + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + hardhat: 2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.2))(typescript@5.5.2)(utf-8-validate@5.0.10) - '@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2)(hardhat@2.19.2)': + '@nomiclabs/hardhat-waffle@2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(typescript@4.9.5)(utf-8-validate@5.0.10))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@5.0.10))': dependencies: - ethers: 5.7.2 - hardhat: 2.19.2(ts-node@10.9.2)(typescript@4.9.5) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@5.0.10)) + '@types/sinon-chai': 3.2.12 + ethereum-waffle: 3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(typescript@4.9.5)(utf-8-validate@5.0.10) + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + hardhat: 2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@5.0.10) - '@nomiclabs/hardhat-waffle@2.0.6(@nomiclabs/hardhat-ethers@2.2.3)(@types/sinon-chai@3.2.12)(ethereum-waffle@3.4.4)(ethers@5.7.2)(hardhat@2.19.2)': + '@nomiclabs/hardhat-waffle@2.0.6(@nomiclabs/hardhat-ethers@2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.2))(typescript@5.5.2)(utf-8-validate@5.0.10)))(@types/sinon-chai@3.2.12)(ethereum-waffle@3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.5.2)(utf-8-validate@5.0.10))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.2))(typescript@5.5.2)(utf-8-validate@5.0.10))': dependencies: - '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2)(hardhat@2.19.2) + '@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.2))(typescript@5.5.2)(utf-8-validate@5.0.10)) '@types/sinon-chai': 3.2.12 - ethereum-waffle: 3.4.4(typescript@4.9.5) - ethers: 5.7.2 - hardhat: 2.19.2(ts-node@10.9.2)(typescript@4.9.5) + ethereum-waffle: 3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.5.2)(utf-8-validate@5.0.10) + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + hardhat: 2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.2))(typescript@5.5.2)(utf-8-validate@5.0.10) - '@nrwl/nx-cloud@16.5.2': + '@nrwl/nx-cloud@19.0.0': dependencies: - nx-cloud: 16.5.2 + nx-cloud: 19.0.0 transitivePeerDependencies: - debug '@nrwl/tao@18.1.2': dependencies: nx: 18.1.2 - tslib: 2.6.2 + tslib: 2.6.3 transitivePeerDependencies: - '@swc-node/register' - '@swc/core' @@ -8589,6 +8322,8 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@pkgr/core@0.1.1': {} + '@rari-capital/solmate@https://codeload.github.com/transmissions11/solmate/tar.gz/8f9b23f8838670afda0fd8983f2c41e8037ae6bc': {} '@resolver-engine/core@0.3.3': @@ -8624,29 +8359,29 @@ snapshots: transitivePeerDependencies: - supports-color - '@scure/base@1.1.5': {} + '@scure/base@1.1.7': {} '@scure/bip32@1.1.5': dependencies: '@noble/hashes': 1.2.0 '@noble/secp256k1': 1.7.1 - '@scure/base': 1.1.5 + '@scure/base': 1.1.7 - '@scure/bip32@1.3.1': + '@scure/bip32@1.4.0': dependencies: - '@noble/curves': 1.1.0 - '@noble/hashes': 1.3.3 - '@scure/base': 1.1.5 + '@noble/curves': 1.4.0 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.7 '@scure/bip39@1.1.1': dependencies: '@noble/hashes': 1.2.0 - '@scure/base': 1.1.5 + '@scure/base': 1.1.7 - '@scure/bip39@1.2.1': + '@scure/bip39@1.3.0': dependencies: - '@noble/hashes': 1.3.3 - '@scure/base': 1.1.5 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.7 '@sentry/core@5.30.0': dependencies: @@ -8749,6 +8484,8 @@ snapshots: dependencies: antlr4ts: 0.5.0-alpha.4 + '@solidity-parser/parser@0.17.0': {} + '@szmarczak/http-timer@1.1.2': dependencies: defer-to-connect: 1.1.3 @@ -8764,18 +8501,18 @@ snapshots: '@textlint/markdown-to-ast@12.6.1': dependencies: '@textlint/ast-node-types': 12.6.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 mdast-util-gfm-autolink-literal: 0.1.3 remark-footnotes: 3.0.0 remark-frontmatter: 3.0.0 remark-gfm: 1.0.0 remark-parse: 9.0.0 - traverse: 0.6.7 + traverse: 0.6.9 unified: 9.2.2 transitivePeerDependencies: - supports-color - '@tsconfig/node10@1.0.9': {} + '@tsconfig/node10@1.0.11': {} '@tsconfig/node12@1.0.11': {} @@ -8783,71 +8520,77 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2)(ethers@5.7.2)(typechain@8.3.2)(typescript@4.9.5)': + '@typechain/ethers-v5@10.2.1(@ethersproject/abi@5.7.0)(@ethersproject/providers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@8.3.2(typescript@4.9.5))(typescript@4.9.5)': dependencies: '@ethersproject/abi': 5.7.0 - '@ethersproject/providers': 5.7.2 - ethers: 5.7.2 + '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) lodash: 4.17.21 ts-essentials: 7.0.3(typescript@4.9.5) typechain: 8.3.2(typescript@4.9.5) typescript: 4.9.5 - '@typechain/ethers-v5@2.0.0(ethers@5.7.2)(typechain@3.0.0)': + '@typechain/ethers-v5@2.0.0(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@3.0.0(typescript@4.9.5))': dependencies: - ethers: 5.7.2 + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) typechain: 3.0.0(typescript@4.9.5) - '@types/async-eventemitter@0.2.4': + '@typechain/ethers-v5@2.0.0(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(typechain@3.0.0(typescript@5.5.2))': dependencies: - '@types/events': 3.0.3 + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + typechain: 3.0.0(typescript@5.5.2) '@types/bn.js@4.11.6': dependencies: - '@types/node': 20.11.30 + '@types/node': 20.14.9 '@types/bn.js@5.1.5': dependencies: - '@types/node': 20.11.30 + '@types/node': 20.14.9 '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 20.11.30 + '@types/node': 20.14.9 '@types/cacheable-request@6.0.3': dependencies: '@types/http-cache-semantics': 4.0.4 '@types/keyv': 3.1.4 - '@types/node': 20.11.30 + '@types/node': 20.14.9 '@types/responselike': 1.0.3 optional: true '@types/chai-as-promised@7.1.8': dependencies: - '@types/chai': 4.3.11 + '@types/chai': 4.3.16 - '@types/chai@4.3.11': {} + '@types/chai@4.3.16': {} '@types/connect@3.4.38': dependencies: - '@types/node': 20.11.30 + '@types/node': 20.14.9 - '@types/events@3.0.3': {} + '@types/eslint@8.56.10': + dependencies: + '@types/estree': 1.0.5 + '@types/json-schema': 7.0.15 - '@types/express-serve-static-core@4.17.41': + '@types/estree@1.0.5': {} + + '@types/express-serve-static-core@4.19.5': dependencies: - '@types/node': 20.11.30 - '@types/qs': 6.9.10 + '@types/node': 20.14.9 + '@types/qs': 6.9.15 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 '@types/express@4.17.21': dependencies: '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.17.41 - '@types/qs': 6.9.10 - '@types/serve-static': 1.15.5 + '@types/express-serve-static-core': 4.19.5 + '@types/qs': 6.9.15 + '@types/serve-static': 1.15.7 '@types/http-cache-semantics@4.0.4': optional: true @@ -8860,7 +8603,7 @@ snapshots: '@types/keyv@3.1.4': dependencies: - '@types/node': 20.11.30 + '@types/node': 20.14.9 optional: true '@types/lru-cache@5.1.1': {} @@ -8871,34 +8614,26 @@ snapshots: '@types/mime@1.3.5': {} - '@types/mime@3.0.4': {} - '@types/minimatch@3.0.5': {} - '@types/minimist@1.2.5': {} - '@types/mkdirp@0.5.2': dependencies: - '@types/node': 20.11.30 + '@types/node': 20.14.9 - '@types/mocha@10.0.6': {} + '@types/mocha@10.0.7': {} '@types/morgan@1.9.9': dependencies: - '@types/node': 20.10.5 + '@types/node': 20.14.9 - '@types/node-fetch@2.6.9': + '@types/node-fetch@2.6.11': dependencies: - '@types/node': 20.11.30 + '@types/node': 20.14.9 form-data: 4.0.0 '@types/node@12.20.55': {} - '@types/node@20.10.5': - dependencies: - undici-types: 5.26.5 - - '@types/node@20.11.30': + '@types/node@20.14.9': dependencies: undici-types: 5.26.5 @@ -8908,7 +8643,7 @@ snapshots: '@types/pbkdf2@3.1.2': dependencies: - '@types/node': 20.11.30 + '@types/node': 20.14.9 '@types/pino-multi-stream@5.1.6': dependencies: @@ -8916,62 +8651,57 @@ snapshots: '@types/pino-pretty@5.0.0': dependencies: - pino-pretty: 10.3.0 + pino-pretty: 11.2.1 '@types/pino-std-serializers@4.0.0': dependencies: - pino-std-serializers: 6.2.2 + pino-std-serializers: 7.0.0 '@types/pino@6.3.12': dependencies: - '@types/node': 20.10.5 + '@types/node': 20.14.9 '@types/pino-pretty': 5.0.0 '@types/pino-std-serializers': 4.0.0 sonic-boom: 2.8.0 '@types/prettier@2.7.3': {} - '@types/qs@6.9.10': {} + '@types/qs@6.9.15': {} '@types/range-parser@1.2.7': {} - '@types/readable-stream@2.3.15': - dependencies: - '@types/node': 20.11.30 - safe-buffer: 5.1.2 - '@types/resolve@0.0.8': dependencies: - '@types/node': 20.11.30 + '@types/node': 20.14.9 '@types/responselike@1.0.3': dependencies: - '@types/node': 20.11.30 + '@types/node': 20.14.9 optional: true '@types/secp256k1@4.0.6': dependencies: - '@types/node': 20.11.30 + '@types/node': 20.14.9 - '@types/semver@7.5.6': {} + '@types/semver@7.5.8': {} '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 20.11.30 + '@types/node': 20.14.9 - '@types/serve-static@1.15.5': + '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/mime': 3.0.4 - '@types/node': 20.11.30 + '@types/node': 20.14.9 + '@types/send': 0.17.4 '@types/sinon-chai@3.2.12': dependencies: - '@types/chai': 4.3.11 - '@types/sinon': 17.0.2 + '@types/chai': 4.3.16 + '@types/sinon': 17.0.3 - '@types/sinon@17.0.2': + '@types/sinon@17.0.3': dependencies: '@types/sinonjs__fake-timers': 8.1.5 @@ -8986,63 +8716,67 @@ snapshots: '@types/bn.js': 5.1.5 '@types/underscore': 1.11.15 - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.56.0)(typescript@4.9.5)': + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@4.9.5))(eslint@8.57.0)(typescript@4.9.5)': dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 5.62.0(eslint@8.56.0)(typescript@4.9.5) + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@4.9.5) '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.56.0)(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@4.9.5) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.56.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@4.9.5) + debug: 4.3.5 + eslint: 8.57.0 graphemer: 1.4.0 - ignore: 5.3.0 + ignore: 5.3.1 natural-compare-lite: 1.4.0 - semver: 7.5.4 + semver: 7.6.2 tsutils: 3.21.0(typescript@4.9.5) + optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3)': + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2))(eslint@8.57.0)(typescript@5.5.2)': dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3) + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.2) '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.5.2) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.5.2) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.56.0 + debug: 4.3.5 + eslint: 8.57.0 graphemer: 1.4.0 - ignore: 5.3.0 + ignore: 5.3.1 natural-compare: 1.4.0 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 + semver: 7.6.2 + ts-api-utils: 1.3.0(typescript@5.5.2) + optionalDependencies: + typescript: 5.5.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@5.62.0(eslint@8.56.0)(typescript@4.9.5)': + '@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@4.9.5)': dependencies: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.56.0 + debug: 4.3.5 + eslint: 8.57.0 + optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3)': + '@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2)': dependencies: '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.2) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.56.0 - typescript: 5.3.3 + debug: 4.3.5 + eslint: 8.57.0 + optionalDependencies: + typescript: 5.5.2 transitivePeerDependencies: - supports-color @@ -9056,25 +8790,27 @@ snapshots: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - '@typescript-eslint/type-utils@5.62.0(eslint@8.56.0)(typescript@4.9.5)': + '@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@4.9.5)': dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@4.9.5) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.56.0 + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@4.9.5) + debug: 4.3.5 + eslint: 8.57.0 tsutils: 3.21.0(typescript@4.9.5) + optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@6.21.0(eslint@8.56.0)(typescript@5.3.3)': + '@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.5.2)': dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.56.0)(typescript@5.3.3) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.56.0 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.2) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.5.2) + debug: 4.3.5 + eslint: 8.57.0 + ts-api-utils: 1.3.0(typescript@5.5.2) + optionalDependencies: + typescript: 5.5.2 transitivePeerDependencies: - supports-color @@ -9082,58 +8818,62 @@ snapshots: '@typescript-eslint/types@6.21.0': {} + '@typescript-eslint/types@7.14.1': {} + '@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5)': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.5.4 + semver: 7.6.2 tsutils: 3.21.0(typescript@4.9.5) + optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.3.3)': + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.5.2)': dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 + semver: 7.6.2 + ts-api-utils: 1.3.0(typescript@5.5.2) + optionalDependencies: + typescript: 5.5.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@5.62.0(eslint@8.56.0)(typescript@4.9.5)': + '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@4.9.5)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.15 - '@types/semver': 7.5.6 + '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - eslint: 8.56.0 + eslint: 8.57.0 eslint-scope: 5.1.1 - semver: 7.5.4 + semver: 7.6.2 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@6.21.0(eslint@8.56.0)(typescript@5.3.3)': + '@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.5.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@types/json-schema': 7.0.15 - '@types/semver': 7.5.6 + '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) - eslint: 8.56.0 - semver: 7.5.4 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.2) + eslint: 8.57.0 + semver: 7.6.2 transitivePeerDependencies: - supports-color - typescript @@ -9150,52 +8890,44 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vue/compiler-core@3.3.12': + '@vue/compiler-core@3.4.31': dependencies: - '@babel/parser': 7.23.6 - '@vue/shared': 3.3.12 + '@babel/parser': 7.24.7 + '@vue/shared': 3.4.31 + entities: 4.5.0 estree-walker: 2.0.2 - source-map-js: 1.0.2 + source-map-js: 1.2.0 - '@vue/compiler-dom@3.3.12': + '@vue/compiler-dom@3.4.31': dependencies: - '@vue/compiler-core': 3.3.12 - '@vue/shared': 3.3.12 + '@vue/compiler-core': 3.4.31 + '@vue/shared': 3.4.31 - '@vue/compiler-sfc@3.3.12': + '@vue/compiler-sfc@3.4.31': dependencies: - '@babel/parser': 7.23.6 - '@vue/compiler-core': 3.3.12 - '@vue/compiler-dom': 3.3.12 - '@vue/compiler-ssr': 3.3.12 - '@vue/reactivity-transform': 3.3.12 - '@vue/shared': 3.3.12 + '@babel/parser': 7.24.7 + '@vue/compiler-core': 3.4.31 + '@vue/compiler-dom': 3.4.31 + '@vue/compiler-ssr': 3.4.31 + '@vue/shared': 3.4.31 estree-walker: 2.0.2 - magic-string: 0.30.5 - postcss: 8.4.32 - source-map-js: 1.0.2 + magic-string: 0.30.10 + postcss: 8.4.39 + source-map-js: 1.2.0 - '@vue/compiler-ssr@3.3.12': + '@vue/compiler-ssr@3.4.31': dependencies: - '@vue/compiler-dom': 3.3.12 - '@vue/shared': 3.3.12 - - '@vue/reactivity-transform@3.3.12': - dependencies: - '@babel/parser': 7.23.6 - '@vue/compiler-core': 3.3.12 - '@vue/shared': 3.3.12 - estree-walker: 2.0.2 - magic-string: 0.30.5 + '@vue/compiler-dom': 3.4.31 + '@vue/shared': 3.4.31 - '@vue/shared@3.3.12': {} + '@vue/shared@3.4.31': {} '@yarnpkg/lockfile@1.1.0': {} '@yarnpkg/parsers@3.0.0-rc.46': dependencies: js-yaml: 3.14.1 - tslib: 2.6.2 + tslib: 2.6.3 '@zkochan/js-yaml@0.0.6': dependencies: @@ -9205,16 +8937,6 @@ snapshots: dependencies: event-target-shim: 5.0.1 - abstract-level@1.0.3: - dependencies: - buffer: 6.0.3 - catering: 2.1.1 - is-buffer: 2.0.5 - level-supports: 4.0.1 - level-transcoder: 1.0.1 - module-error: 1.0.2 - queue-microtask: 1.2.3 - abstract-leveldown@2.6.3: dependencies: xtend: 4.0.2 @@ -9236,13 +8958,15 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-jsx@5.3.2(acorn@8.11.2): + acorn-jsx@5.3.2(acorn@8.12.0): dependencies: - acorn: 8.11.2 + acorn: 8.12.0 - acorn-walk@8.3.1: {} + acorn-walk@8.3.3: + dependencies: + acorn: 8.12.0 - acorn@8.11.2: {} + acorn@8.12.0: {} adm-zip@0.4.16: {} @@ -9252,7 +8976,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 transitivePeerDependencies: - supports-color @@ -9268,7 +8992,7 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.12.0: + ajv@8.16.0: dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 @@ -9279,6 +9003,10 @@ snapshots: dependencies: emoji-regex: 10.1.0 + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + ansi-colors@4.1.1: {} ansi-colors@4.1.3: {} @@ -9289,9 +9017,7 @@ snapshots: dependencies: type-fest: 0.21.3 - ansi-escapes@6.2.0: - dependencies: - type-fest: 3.13.1 + ansi-escapes@6.2.1: {} ansi-regex@2.1.1: {} @@ -9358,74 +9084,95 @@ snapshots: array-back@4.0.2: {} - array-buffer-byte-length@1.0.0: + array-buffer-byte-length@1.0.1: dependencies: - call-bind: 1.0.5 - is-array-buffer: 3.0.2 + call-bind: 1.0.7 + is-array-buffer: 3.0.4 array-differ@3.0.0: {} array-flatten@1.1.1: {} - array-includes@3.1.7: + array-includes@3.1.8: dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 - get-intrinsic: 1.2.2 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 is-string: 1.0.7 array-union@2.1.0: {} array-unique@0.3.2: {} - array.prototype.findlastindex@1.2.3: + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + + array.prototype.findlastindex@1.2.5: dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 - get-intrinsic: 1.2.2 array.prototype.flat@1.3.2: dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 array.prototype.flatmap@1.3.2: dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 - array.prototype.reduce@1.0.6: + array.prototype.reduce@1.0.7: dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.23.3 es-array-method-boxes-properly: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 is-string: 1.0.7 - array.prototype.tosorted@1.1.2: + array.prototype.toreversed@1.1.2: dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.23.3 es-shim-unscopables: 1.0.2 - get-intrinsic: 1.2.2 - arraybuffer.prototype.slice@1.0.2: + array.prototype.tosorted@1.1.4: dependencies: - array-buffer-byte-length: 1.0.0 - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 - get-intrinsic: 1.2.2 - is-array-buffer: 3.0.2 - is-shared-array-buffer: 1.0.2 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-shim-unscopables: 1.0.2 + + arraybuffer.prototype.slice@1.0.3: + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 arrify@1.0.1: {} @@ -9433,12 +9180,11 @@ snapshots: asap@2.0.6: {} - asn1.js@5.4.1: + asn1.js@4.10.1: dependencies: bn.js: 4.12.0 inherits: 2.0.4 minimalistic-assert: 1.0.1 - safer-buffer: 2.1.2 optional: true asn1@0.2.6: @@ -9457,7 +9203,7 @@ snapshots: async-eventemitter@0.2.4: dependencies: - async: 2.6.4 + async: 2.6.2 async-limiter@1.0.1: {} @@ -9467,14 +9213,6 @@ snapshots: dependencies: lodash: 4.17.21 - async@2.6.4: - dependencies: - lodash: 4.17.21 - - asynciterator.prototype@1.0.0: - dependencies: - has-symbols: 1.0.3 - asynckit@0.4.0: {} at-least-node@1.0.0: {} @@ -9483,35 +9221,29 @@ snapshots: atomic-sleep@1.0.0: {} - available-typed-arrays@1.0.5: {} + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 aws-sign2@0.7.0: {} - aws4@1.12.0: {} + aws4@1.13.0: {} - axios@0.21.4(debug@4.3.4): + axios@0.21.4(debug@4.3.5): dependencies: - follow-redirects: 1.15.3(debug@4.3.4) + follow-redirects: 1.15.6(debug@4.3.5) transitivePeerDependencies: - debug - axios@1.1.3: + axios@1.7.2: dependencies: - follow-redirects: 1.15.3(debug@4.3.4) + follow-redirects: 1.15.6(debug@4.3.5) form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - axios@1.6.2: - dependencies: - follow-redirects: 1.15.3(debug@4.3.4) - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - - b4a@1.6.4: {} + b4a@1.6.6: {} babel-code-frame@6.26.0: dependencies: @@ -9952,7 +9684,7 @@ snapshots: bcfg@0.1.8: dependencies: - bsert: 0.0.12 + bsert: 0.0.13 bcrypt-pbkdf@1.0.2: dependencies: @@ -9964,12 +9696,10 @@ snapshots: dependencies: is-windows: 1.0.2 - bigint-crypto-utils@3.3.0: {} - bignumber.js@9.1.2: optional: true - binary-extensions@2.2.0: {} + binary-extensions@2.3.0: {} bintrees@1.0.2: {} @@ -9983,7 +9713,7 @@ snapshots: bip39@3.1.0: dependencies: - '@noble/hashes': 1.3.3 + '@noble/hashes': 1.4.0 bl@4.1.0: dependencies: @@ -9994,12 +9724,12 @@ snapshots: blake-hash@2.0.0: dependencies: node-addon-api: 3.2.1 - node-gyp-build: 4.7.1 + node-gyp-build: 4.8.1 readable-stream: 3.6.2 blake2b-wasm@2.4.0: dependencies: - b4a: 1.6.4 + b4a: 1.6.6 nanoassert: 2.0.0 blake2b@2.1.4: @@ -10017,23 +9747,6 @@ snapshots: bn.js@5.2.1: {} - body-parser@1.20.1: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.1 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - body-parser@1.20.2: dependencies: bytes: 3.1.2 @@ -10051,6 +9764,17 @@ snapshots: transitivePeerDependencies: - supports-color + boxen@5.1.2: + dependencies: + ansi-align: 3.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + cli-boxes: 2.2.1 + string-width: 4.2.3 + type-fest: 0.20.2 + widest-line: 3.1.0 + wrap-ansi: 7.0.0 + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -10075,23 +9799,12 @@ snapshots: transitivePeerDependencies: - supports-color - braces@3.0.2: + braces@3.0.3: dependencies: - fill-range: 7.0.1 - - breakword@1.0.6: - dependencies: - wcwidth: 1.0.1 + fill-range: 7.1.1 brorand@1.1.0: {} - browser-level@1.0.1: - dependencies: - abstract-level: 1.0.3 - catering: 2.1.1 - module-error: 1.0.2 - run-parallel-limit: 1.1.0 - browser-stdout@1.3.1: {} browserify-aes@1.2.0: @@ -10124,37 +9837,31 @@ snapshots: randombytes: 2.1.0 optional: true - browserify-sign@4.2.2: + browserify-sign@4.2.3: dependencies: bn.js: 5.2.1 browserify-rsa: 4.1.0 create-hash: 1.2.0 create-hmac: 1.1.7 - elliptic: 6.5.4 + elliptic: 6.5.5 + hash-base: 3.0.4 inherits: 2.0.4 - parse-asn1: 5.1.6 - readable-stream: 3.6.2 + parse-asn1: 5.1.7 + readable-stream: 2.3.8 safe-buffer: 5.2.1 optional: true browserslist@3.2.8: dependencies: - caniuse-lite: 1.0.30001570 - electron-to-chromium: 1.4.615 + caniuse-lite: 1.0.30001639 + electron-to-chromium: 1.4.815 - browserslist@4.22.2: + browserslist@4.23.1: dependencies: - caniuse-lite: 1.0.30001570 - electron-to-chromium: 1.4.615 + caniuse-lite: 1.0.30001639 + electron-to-chromium: 1.4.815 node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.22.2) - - browserslist@4.23.0: - dependencies: - caniuse-lite: 1.0.30001600 - electron-to-chromium: 1.4.715 - node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.23.0) + update-browserslist-db: 1.0.16(browserslist@4.23.1) bs58@4.0.1: dependencies: @@ -10166,7 +9873,7 @@ snapshots: create-hash: 1.2.0 safe-buffer: 5.2.1 - bsert@0.0.12: {} + bsert@0.0.13: {} buffer-from@1.1.2: {} @@ -10191,7 +9898,7 @@ snapshots: bufferutil@4.0.8: dependencies: - node-gyp-build: 4.7.1 + node-gyp-build: 4.8.1 bufio@1.2.1: {} @@ -10257,22 +9964,18 @@ snapshots: package-hash: 4.0.0 write-file-atomic: 3.0.3 - call-bind@1.0.5: + call-bind@1.0.7: dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.2.2 - set-function-length: 1.1.1 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 callsite@1.0.0: {} callsites@3.1.0: {} - camelcase-keys@6.2.2: - dependencies: - camelcase: 5.3.1 - map-obj: 4.3.0 - quick-lru: 4.0.1 - camelcase-keys@7.0.2: dependencies: camelcase: 6.3.0 @@ -10286,33 +9989,27 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001570: {} - - caniuse-lite@1.0.30001600: {} + caniuse-lite@1.0.30001639: {} cardinal@2.1.1: dependencies: ansicolors: 0.3.2 redeyed: 2.1.1 - case@1.6.3: {} - caseless@0.12.0: {} - catering@2.1.1: {} - ccount@1.1.0: {} - chai-as-promised@7.1.1(chai@4.3.10): + chai-as-promised@7.1.2(chai@4.4.1): dependencies: - chai: 4.3.10 + chai: 4.4.1 check-error: 1.0.3 - chai@4.3.10: + chai@4.4.1: dependencies: assertion-error: 1.1.0 check-error: 1.0.3 - deep-eql: 4.1.3 + deep-eql: 4.1.4 get-func-name: 2.0.2 loupe: 2.3.7 pathval: 1.1.1 @@ -10355,10 +10052,10 @@ snapshots: dependencies: functional-red-black-tree: 1.0.1 - chokidar@3.5.3: + chokidar@3.6.0: dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -10392,12 +10089,12 @@ snapshots: inherits: 2.0.4 safe-buffer: 5.2.1 - circomlibjs@0.1.7: + circomlibjs@0.1.7(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: blake-hash: 2.0.0 blake2b: 2.1.4 - ethers: 5.7.2 - ffjavascript: 0.2.62 + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ffjavascript: 0.2.63 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -10412,20 +10109,14 @@ snapshots: isobject: 3.0.1 static-extend: 0.1.2 - classic-level@1.3.0: - dependencies: - abstract-level: 1.0.3 - catering: 2.1.1 - module-error: 1.0.2 - napi-macros: 2.2.2 - node-gyp-build: 4.7.1 - clean-regexp@1.0.0: dependencies: escape-string-regexp: 1.0.5 clean-stack@2.2.0: {} + cli-boxes@2.2.1: {} + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 @@ -10443,7 +10134,7 @@ snapshots: cli-truncate@4.0.0: dependencies: slice-ansi: 5.0.0 - string-width: 7.0.0 + string-width: 7.2.0 cliui@3.2.0: dependencies: @@ -10573,7 +10264,7 @@ snapshots: cookie@0.4.2: {} - cookie@0.5.0: {} + cookie@0.6.0: {} cookiejar@2.1.4: {} @@ -10589,11 +10280,11 @@ snapshots: untildify: 4.0.0 yargs: 16.2.0 - core-js-compat@3.36.1: + core-js-compat@3.37.1: dependencies: - browserslist: 4.23.0 + browserslist: 4.23.1 - core-js-pure@3.34.0: {} + core-js-pure@3.37.1: {} core-js@2.6.12: {} @@ -10621,14 +10312,13 @@ snapshots: js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 + optionalDependencies: typescript: 4.9.5 - crc-32@1.2.2: {} - create-ecdh@4.0.4: dependencies: bn.js: 4.12.0 - elliptic: 6.5.4 + elliptic: 6.5.5 optional: true create-hash@1.2.0: @@ -10650,9 +10340,9 @@ snapshots: create-require@1.1.1: {} - cross-fetch@2.2.6: + cross-fetch@2.2.6(encoding@0.1.13): dependencies: - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) whatwg-fetch: 2.0.4 transitivePeerDependencies: - encoding @@ -10680,7 +10370,7 @@ snapshots: crypto-browserify@3.12.0: dependencies: browserify-cipher: 1.0.1 - browserify-sign: 4.2.2 + browserify-sign: 4.2.3 create-ecdh: 4.0.4 create-hash: 1.2.0 create-hmac: 1.1.7 @@ -10692,27 +10382,32 @@ snapshots: randomfill: 1.0.4 optional: true - csv-generate@3.4.3: {} - - csv-parse@4.16.3: {} + d@1.0.2: + dependencies: + es5-ext: 0.10.64 + type: 2.7.3 - csv-stringify@5.6.5: {} + dashdash@1.14.1: + dependencies: + assert-plus: 1.0.0 - csv@5.5.3: + data-view-buffer@1.0.1: dependencies: - csv-generate: 3.4.3 - csv-parse: 4.16.3 - csv-stringify: 5.6.5 - stream-transform: 2.1.3 + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 - d@1.0.1: + data-view-byte-length@1.0.1: dependencies: - es5-ext: 0.10.62 - type: 1.2.0 + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 - dashdash@1.14.1: + data-view-byte-offset@1.0.0: dependencies: - assert-plus: 1.0.0 + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 dataloader@1.4.0: {} @@ -10733,12 +10428,12 @@ snapshots: debug@4.3.4(supports-color@8.1.1): dependencies: ms: 2.1.2 + optionalDependencies: supports-color: 8.1.1 - decamelize-keys@1.1.1: + debug@4.3.5: dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 + ms: 2.1.2 decamelize@1.2.0: {} @@ -10756,7 +10451,7 @@ snapshots: mimic-response: 3.1.0 optional: true - deep-eql@4.1.3: + deep-eql@4.1.4: dependencies: type-detect: 4.0.8 @@ -10765,9 +10460,9 @@ snapshots: is-arguments: 1.1.1 is-date-object: 1.0.5 is-regex: 1.1.4 - object-is: 1.1.5 + object-is: 1.1.6 object-keys: 1.1.1 - regexp.prototype.flags: 1.5.1 + regexp.prototype.flags: 1.5.2 deep-extend@0.6.0: {} @@ -10796,18 +10491,18 @@ snapshots: abstract-leveldown: 5.0.0 inherits: 2.0.4 - define-data-property@1.1.1: + define-data-property@1.1.4: dependencies: - get-intrinsic: 1.2.2 + es-define-property: 1.0.0 + es-errors: 1.3.0 gopd: 1.0.1 - has-property-descriptors: 1.0.1 define-lazy-prop@2.0.0: {} define-properties@1.2.1: dependencies: - define-data-property: 1.1.1 - has-property-descriptors: 1.0.1 + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 object-keys: 1.1.1 define-property@0.2.5: @@ -10829,17 +10524,17 @@ snapshots: depcheck@1.4.7: dependencies: - '@babel/parser': 7.23.6 - '@babel/traverse': 7.23.6 - '@vue/compiler-sfc': 3.3.12 + '@babel/parser': 7.24.7 + '@babel/traverse': 7.24.7 + '@vue/compiler-sfc': 3.4.31 callsite: 1.0.0 camelcase: 6.3.0 cosmiconfig: 7.1.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 deps-regex: 0.2.0 findup-sync: 5.0.0 - ignore: 5.3.0 - is-core-module: 2.13.1 + ignore: 5.3.1 + is-core-module: 2.14.0 js-yaml: 3.14.1 json5: 2.2.3 lodash: 4.17.21 @@ -10850,7 +10545,7 @@ snapshots: require-package-name: 2.0.1 resolve: 1.22.8 resolve-from: 5.0.0 - semver: 7.5.4 + semver: 7.6.2 yargs: 16.2.0 transitivePeerDependencies: - supports-color @@ -10888,7 +10583,7 @@ snapshots: diff@5.0.0: {} - diff@5.1.0: {} + diff@5.2.0: {} diffie-hellman@5.0.3: dependencies: @@ -10944,7 +10639,9 @@ snapshots: dotenv@10.0.0: {} - dotenv@16.3.1: {} + dotenv@16.3.2: {} + + dotenv@16.4.5: {} dotenv@8.6.0: {} @@ -10959,12 +10656,12 @@ snapshots: duplexer@0.1.2: {} - duplexify@4.1.2: + duplexify@4.1.3: dependencies: end-of-stream: 1.4.4 inherits: 2.0.4 readable-stream: 3.6.2 - stream-shift: 1.0.1 + stream-shift: 1.0.3 eastasianwidth@0.2.0: {} @@ -10975,11 +10672,19 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.4.615: {} + electron-to-chromium@1.4.815: {} - electron-to-chromium@1.4.715: {} + elliptic@6.5.4: + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 - elliptic@6.5.4: + elliptic@6.5.5: dependencies: bn.js: 4.12.0 brorand: 1.1.0 @@ -11017,7 +10722,7 @@ snapshots: dependencies: once: 1.4.0 - enhanced-resolve@5.15.0: + enhanced-resolve@5.17.0: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 @@ -11035,6 +10740,8 @@ snapshots: entities@3.0.1: {} + entities@4.5.0: {} + env-paths@2.2.1: {} envalid@7.3.1: @@ -11049,76 +10756,95 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-abstract@1.22.3: - dependencies: - array-buffer-byte-length: 1.0.0 - arraybuffer.prototype.slice: 1.0.2 - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 - es-set-tostringtag: 2.0.2 + es-abstract@1.23.3: + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 es-to-primitive: 1.2.1 function.prototype.name: 1.1.6 - get-intrinsic: 1.2.2 - get-symbol-description: 1.0.0 - globalthis: 1.0.3 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.4 gopd: 1.0.1 - has-property-descriptors: 1.0.1 - has-proto: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.0 - internal-slot: 1.0.6 - is-array-buffer: 3.0.2 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 is-callable: 1.2.7 - is-negative-zero: 2.0.2 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 + is-shared-array-buffer: 1.0.3 is-string: 1.0.7 - is-typed-array: 1.1.12 + is-typed-array: 1.1.13 is-weakref: 1.0.2 - object-inspect: 1.13.1 + object-inspect: 1.13.2 object-keys: 1.1.1 object.assign: 4.1.5 - regexp.prototype.flags: 1.5.1 - safe-array-concat: 1.0.1 - safe-regex-test: 1.0.0 - string.prototype.trim: 1.2.8 - string.prototype.trimend: 1.0.7 - string.prototype.trimstart: 1.0.7 - typed-array-buffer: 1.0.0 - typed-array-byte-length: 1.0.0 - typed-array-byte-offset: 1.0.0 - typed-array-length: 1.0.4 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 unbox-primitive: 1.0.2 - which-typed-array: 1.1.13 + which-typed-array: 1.1.15 es-array-method-boxes-properly@1.0.0: {} - es-iterator-helpers@1.0.15: + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + es-iterator-helpers@1.0.19: dependencies: - asynciterator.prototype: 1.0.0 - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 - es-set-tostringtag: 2.0.2 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-set-tostringtag: 2.0.3 function-bind: 1.1.2 - get-intrinsic: 1.2.2 - globalthis: 1.0.3 - has-property-descriptors: 1.0.1 - has-proto: 1.0.1 + get-intrinsic: 1.2.4 + globalthis: 1.0.4 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 has-symbols: 1.0.3 - internal-slot: 1.0.6 + internal-slot: 1.0.7 iterator.prototype: 1.1.2 - safe-array-concat: 1.0.1 + safe-array-concat: 1.1.2 + + es-module-lexer@1.5.4: {} + + es-object-atoms@1.0.0: + dependencies: + es-errors: 1.3.0 - es-set-tostringtag@2.0.2: + es-set-tostringtag@2.0.3: dependencies: - get-intrinsic: 1.2.2 - has-tostringtag: 1.0.0 - hasown: 2.0.0 + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 es-shim-unscopables@1.0.2: dependencies: - hasown: 2.0.0 + hasown: 2.0.2 es-to-primitive@1.2.1: dependencies: @@ -11126,26 +10852,27 @@ snapshots: is-date-object: 1.0.5 is-symbol: 1.0.4 - es5-ext@0.10.62: + es5-ext@0.10.64: dependencies: es6-iterator: 2.0.3 - es6-symbol: 3.1.3 + es6-symbol: 3.1.4 + esniff: 2.0.1 next-tick: 1.1.0 es6-error@4.1.1: {} es6-iterator@2.0.3: dependencies: - d: 1.0.1 - es5-ext: 0.10.62 - es6-symbol: 3.1.3 + d: 1.0.2 + es5-ext: 0.10.64 + es6-symbol: 3.1.4 - es6-symbol@3.1.3: + es6-symbol@3.1.4: dependencies: - d: 1.0.1 + d: 1.0.2 ext: 1.7.0 - escalade@3.1.1: {} + escalade@3.1.2: {} escape-html@1.0.3: {} @@ -11153,35 +10880,35 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@9.1.0(eslint@8.56.0): + eslint-config-prettier@9.1.0(eslint@8.57.0): dependencies: - eslint: 8.56.0 + eslint: 8.57.0 - eslint-config-standard@16.0.3(eslint-plugin-import@2.29.1)(eslint-plugin-node@11.1.0)(eslint-plugin-promise@5.2.0)(eslint@8.56.0): + eslint-config-standard@16.0.3(eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0))(eslint-plugin-node@11.1.0(eslint@8.57.0))(eslint-plugin-promise@5.2.0(eslint@8.57.0))(eslint@8.57.0): dependencies: - eslint: 8.56.0 - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) - eslint-plugin-node: 11.1.0(eslint@8.56.0) - eslint-plugin-promise: 5.2.0(eslint@8.56.0) + eslint: 8.57.0 + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-node: 11.1.0(eslint@8.57.0) + eslint-plugin-promise: 5.2.0(eslint@8.57.0) eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 - is-core-module: 2.13.1 + is-core-module: 2.14.0 resolve: 1.22.8 transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.56.0): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2))(eslint-plugin-import@2.29.1)(eslint@8.57.0): dependencies: - debug: 4.3.4(supports-color@8.1.1) - enhanced-resolve: 5.15.0 - eslint: 8.56.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) + debug: 4.3.5 + enhanced-resolve: 5.17.0 + eslint: 8.57.0 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.2 - get-tsconfig: 4.7.2 - is-core-module: 2.13.1 + get-tsconfig: 4.7.5 + is-core-module: 2.14.0 is-glob: 4.0.3 transitivePeerDependencies: - '@typescript-eslint/parser' @@ -11189,117 +10916,123 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.8.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): + eslint-module-utils@2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3) debug: 3.2.7 - eslint: 8.56.0 + optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.2) + eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-plugin-import@2.29.1)(eslint@8.56.0) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2))(eslint-plugin-import@2.29.1)(eslint@8.57.0) transitivePeerDependencies: - supports-color - eslint-plugin-es@3.0.1(eslint@8.56.0): + eslint-plugin-es@3.0.1(eslint@8.57.0): dependencies: - eslint: 8.56.0 + eslint: 8.57.0 eslint-utils: 2.1.0 regexpp: 3.2.0 - eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3) - array-includes: 3.1.7 - array.prototype.findlastindex: 1.2.3 + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.56.0 + eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) - hasown: 2.0.0 - is-core-module: 2.13.1 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.2))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0) + hasown: 2.0.2 + is-core-module: 2.14.0 is-glob: 4.0.3 minimatch: 3.1.2 - object.fromentries: 2.0.7 - object.groupby: 1.0.1 - object.values: 1.1.7 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 semver: 6.3.1 tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsdoc@48.2.3(eslint@8.56.0): + eslint-plugin-jsdoc@48.5.0(eslint@8.57.0): dependencies: - '@es-joy/jsdoccomment': 0.42.0 + '@es-joy/jsdoccomment': 0.43.1 are-docs-informative: 0.0.2 comment-parser: 1.4.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 escape-string-regexp: 4.0.0 - eslint: 8.56.0 + eslint: 8.57.0 esquery: 1.5.0 - is-builtin-module: 3.2.1 - semver: 7.6.0 + parse-imports: 2.1.0 + semver: 7.6.2 spdx-expression-parse: 4.0.0 + synckit: 0.9.0 transitivePeerDependencies: - supports-color - eslint-plugin-node@11.1.0(eslint@8.56.0): + eslint-plugin-node@11.1.0(eslint@8.57.0): dependencies: - eslint: 8.56.0 - eslint-plugin-es: 3.0.1(eslint@8.56.0) + eslint: 8.57.0 + eslint-plugin-es: 3.0.1(eslint@8.57.0) eslint-utils: 2.1.0 - ignore: 5.3.0 + ignore: 5.3.1 minimatch: 3.1.2 resolve: 1.22.8 semver: 6.3.1 - eslint-plugin-prefer-arrow@1.2.3(eslint@8.56.0): + eslint-plugin-prefer-arrow@1.2.3(eslint@8.57.0): dependencies: - eslint: 8.56.0 + eslint: 8.57.0 - eslint-plugin-prettier@4.2.1(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@2.8.8): + eslint-plugin-prettier@4.2.1(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.8.8): dependencies: - eslint: 8.56.0 - eslint-config-prettier: 9.1.0(eslint@8.56.0) + eslint: 8.57.0 prettier: 2.8.8 prettier-linter-helpers: 1.0.0 + optionalDependencies: + eslint-config-prettier: 9.1.0(eslint@8.57.0) - eslint-plugin-promise@5.2.0(eslint@8.56.0): + eslint-plugin-promise@5.2.0(eslint@8.57.0): dependencies: - eslint: 8.56.0 + eslint: 8.57.0 - eslint-plugin-react@7.33.2(eslint@8.56.0): + eslint-plugin-react@7.34.3(eslint@8.57.0): dependencies: - array-includes: 3.1.7 + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.2 - array.prototype.tosorted: 1.1.2 + array.prototype.toreversed: 1.1.2 + array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 - es-iterator-helpers: 1.0.15 - eslint: 8.56.0 + es-iterator-helpers: 1.0.19 + eslint: 8.57.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.7 - object.hasown: 1.1.3 - object.values: 1.1.7 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.hasown: 1.1.4 + object.values: 1.2.0 prop-types: 15.8.1 resolve: 2.0.0-next.5 semver: 6.3.1 - string.prototype.matchall: 4.0.10 + string.prototype.matchall: 4.0.11 - eslint-plugin-unicorn@50.0.1(eslint@8.56.0): + eslint-plugin-unicorn@50.0.1(eslint@8.57.0): dependencies: - '@babel/helper-validator-identifier': 7.22.20 - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@babel/helper-validator-identifier': 7.24.7 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint/eslintrc': 2.1.4 ci-info: 4.0.0 clean-regexp: 1.0.0 - core-js-compat: 3.36.1 - eslint: 8.56.0 + core-js-compat: 3.37.1 + eslint: 8.57.0 esquery: 1.5.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 @@ -11308,7 +11041,7 @@ snapshots: read-pkg-up: 7.0.1 regexp-tree: 0.1.27 regjsparser: 0.10.0 - semver: 7.5.4 + semver: 7.6.2 strip-indent: 3.0.0 transitivePeerDependencies: - supports-color @@ -11333,20 +11066,20 @@ snapshots: eslint-visitor-keys@3.4.3: {} - eslint@8.56.0: + eslint@8.57.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) - '@eslint-community/regexpp': 4.10.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.11.0 '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.56.0 - '@humanwhocodes/config-array': 0.11.13 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -11360,7 +11093,7 @@ snapshots: glob-parent: 6.0.2 globals: 13.24.0 graphemer: 1.4.0 - ignore: 5.3.0 + ignore: 5.3.1 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -11370,16 +11103,23 @@ snapshots: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.3 + optionator: 0.9.4 strip-ansi: 6.0.1 text-table: 0.2.0 transitivePeerDependencies: - supports-color + esniff@2.0.1: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.3 + espree@9.6.1: dependencies: - acorn: 8.11.2 - acorn-jsx: 5.3.2(acorn@8.11.2) + acorn: 8.12.0 + acorn-jsx: 5.3.2(acorn@8.12.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -11419,9 +11159,9 @@ snapshots: idna-uts46-hx: 2.3.1 js-sha3: 0.5.7 - eth-json-rpc-infura@3.2.1: + eth-json-rpc-infura@3.2.1(encoding@0.1.13): dependencies: - cross-fetch: 2.2.6 + cross-fetch: 2.2.6(encoding@0.1.13) eth-json-rpc-middleware: 1.6.0 json-rpc-engine: 3.8.0 json-rpc-error: 2.0.0 @@ -11431,7 +11171,7 @@ snapshots: eth-json-rpc-middleware@1.6.0: dependencies: - async: 2.6.4 + async: 2.6.2 eth-query: 2.1.2 eth-tx-summary: 3.2.4 ethereumjs-block: 1.7.1 @@ -11441,19 +11181,19 @@ snapshots: fetch-ponyfill: 4.1.0 json-rpc-engine: 3.8.0 json-rpc-error: 2.0.0 - json-stable-stringify: 1.1.0 + json-stable-stringify: 1.1.1 promise-to-callback: 1.0.0 tape: 4.17.0 transitivePeerDependencies: - supports-color - eth-lib@0.1.29: + eth-lib@0.1.29(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: bn.js: 4.12.0 - elliptic: 6.5.4 + elliptic: 6.5.5 nano-json-stream-parser: 0.1.2 servify: 0.1.12 - ws: 3.3.3 + ws: 3.3.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) xhr-request-promise: 0.1.3 transitivePeerDependencies: - bufferutil @@ -11464,7 +11204,7 @@ snapshots: eth-lib@0.2.8: dependencies: bn.js: 4.12.0 - elliptic: 6.5.4 + elliptic: 6.5.5 xhr-request-promise: 0.1.3 optional: true @@ -11481,7 +11221,7 @@ snapshots: eth-sig-util@3.0.0: dependencies: buffer: 5.7.1 - elliptic: 6.5.4 + elliptic: 6.5.5 ethereumjs-abi: 0.6.5 ethereumjs-util: 5.2.1 tweetnacl: 1.0.3 @@ -11489,7 +11229,7 @@ snapshots: eth-tx-summary@3.2.4: dependencies: - async: 2.6.4 + async: 2.6.2 clone: 2.1.2 concat-stream: 1.6.2 end-of-stream: 1.4.4 @@ -11502,14 +11242,14 @@ snapshots: ethashjs@0.0.8: dependencies: - async: 2.6.4 + async: 2.6.2 buffer-xor: 2.0.2 ethereumjs-util: 7.1.5 miller-rabin: 4.0.1 - ethereum-bloom-filters@1.0.10: + ethereum-bloom-filters@1.1.0: dependencies: - js-sha3: 0.8.0 + '@noble/hashes': 1.4.0 ethereum-common@0.0.18: {} @@ -11540,20 +11280,20 @@ snapshots: '@scure/bip32': 1.1.5 '@scure/bip39': 1.1.1 - ethereum-cryptography@2.1.2: + ethereum-cryptography@2.2.0: dependencies: - '@noble/curves': 1.1.0 - '@noble/hashes': 1.3.1 - '@scure/bip32': 1.3.1 - '@scure/bip39': 1.2.1 + '@noble/curves': 1.4.0 + '@noble/hashes': 1.4.0 + '@scure/bip32': 1.4.0 + '@scure/bip39': 1.3.0 - ethereum-waffle@3.4.4(typescript@4.7.4): + ethereum-waffle@3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(typescript@4.9.5)(utf-8-validate@5.0.10): dependencies: - '@ethereum-waffle/chai': 3.4.4 - '@ethereum-waffle/compiler': 3.4.4(typescript@4.7.4) - '@ethereum-waffle/mock-contract': 3.4.4 - '@ethereum-waffle/provider': 3.4.4 - ethers: 5.7.2 + '@ethereum-waffle/chai': 3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@ethereum-waffle/compiler': 3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(typescript@4.9.5)(utf-8-validate@5.0.10) + '@ethereum-waffle/mock-contract': 3.4.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@ethereum-waffle/provider': 3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - encoding @@ -11561,13 +11301,13 @@ snapshots: - typescript - utf-8-validate - ethereum-waffle@3.4.4(typescript@4.9.5): + ethereum-waffle@3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.5.2)(utf-8-validate@5.0.10): dependencies: - '@ethereum-waffle/chai': 3.4.4 - '@ethereum-waffle/compiler': 3.4.4(typescript@4.9.5) - '@ethereum-waffle/mock-contract': 3.4.4 - '@ethereum-waffle/provider': 3.4.4 - ethers: 5.7.2 + '@ethereum-waffle/chai': 3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@ethereum-waffle/compiler': 3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.5.2)(utf-8-validate@5.0.10) + '@ethereum-waffle/mock-contract': 3.4.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@ethereum-waffle/provider': 3.4.4(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - encoding @@ -11604,7 +11344,7 @@ snapshots: ethereumjs-block@1.7.1: dependencies: - async: 2.6.4 + async: 2.6.2 ethereum-common: 0.2.0 ethereumjs-tx: 1.3.7 ethereumjs-util: 5.2.1 @@ -11612,7 +11352,7 @@ snapshots: ethereumjs-block@2.2.2: dependencies: - async: 2.6.4 + async: 2.6.2 ethereumjs-common: 1.5.0 ethereumjs-tx: 2.1.2 ethereumjs-util: 5.2.1 @@ -11620,7 +11360,7 @@ snapshots: ethereumjs-blockchain@4.0.4: dependencies: - async: 2.6.4 + async: 2.6.2 ethashjs: 0.0.8 ethereumjs-block: 2.2.2 ethereumjs-common: 1.5.0 @@ -11647,7 +11387,7 @@ snapshots: dependencies: bn.js: 4.12.0 create-hash: 1.2.0 - elliptic: 6.5.4 + elliptic: 6.5.5 ethereum-cryptography: 0.1.3 rlp: 2.2.7 @@ -11655,7 +11395,7 @@ snapshots: dependencies: bn.js: 4.12.0 create-hash: 1.2.0 - elliptic: 6.5.4 + elliptic: 6.5.5 ethereum-cryptography: 0.1.3 ethjs-util: 0.1.6 rlp: 2.2.7 @@ -11666,7 +11406,7 @@ snapshots: '@types/bn.js': 4.11.6 bn.js: 4.12.0 create-hash: 1.2.0 - elliptic: 6.5.4 + elliptic: 6.5.5 ethereum-cryptography: 0.1.3 ethjs-util: 0.1.6 rlp: 2.2.7 @@ -11681,7 +11421,7 @@ snapshots: ethereumjs-vm@2.6.0: dependencies: - async: 2.6.4 + async: 2.6.2 async-eventemitter: 0.2.4 ethereumjs-account: 2.0.5 ethereumjs-block: 2.2.2 @@ -11695,9 +11435,9 @@ snapshots: ethereumjs-vm@4.2.0: dependencies: - async: 2.6.4 + async: 2.6.2 async-eventemitter: 0.2.4 - core-js-pure: 3.34.0 + core-js-pure: 3.37.1 ethereumjs-account: 3.0.0 ethereumjs-block: 2.2.2 ethereumjs-blockchain: 4.0.4 @@ -11735,7 +11475,7 @@ snapshots: utf8: 3.0.0 uuid: 8.3.2 - ethers@5.7.2: + ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -11755,7 +11495,7 @@ snapshots: '@ethersproject/networks': 5.7.1 '@ethersproject/pbkdf2': 5.7.0 '@ethersproject/properties': 5.7.0 - '@ethersproject/providers': 5.7.2 + '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@ethersproject/random': 5.7.0 '@ethersproject/rlp': 5.7.0 '@ethersproject/sha2': 5.7.0 @@ -11781,6 +11521,11 @@ snapshots: is-hex-prefixed: 1.0.0 strip-hex-prefix: 1.0.0 + event-emitter@0.3.5: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-target-shim@5.0.1: {} eventemitter3@4.0.4: @@ -11812,7 +11557,7 @@ snapshots: human-signals: 5.0.0 is-stream: 3.0.0 merge-stream: 2.0.0 - npm-run-path: 5.1.0 + npm-run-path: 5.3.0 onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 @@ -11839,14 +11584,14 @@ snapshots: prom-client: 13.2.0 url-value-parser: 2.2.0 - express@4.18.2: + express@4.19.2: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.1 + body-parser: 1.20.2 content-disposition: 0.5.4 content-type: 1.0.5 - cookie: 0.5.0 + cookie: 0.6.0 cookie-signature: 1.0.6 debug: 2.6.9 depd: 2.0.0 @@ -11877,7 +11622,7 @@ snapshots: ext@1.7.0: dependencies: - type: 2.7.2 + type: 2.7.3 extend-shallow@2.0.1: dependencies: @@ -11917,7 +11662,7 @@ snapshots: dependencies: checkpoint-store: 1.1.0 - fast-copy@3.0.1: {} + fast-copy@3.0.2: {} fast-deep-equal@3.1.3: {} @@ -11929,17 +11674,17 @@ snapshots: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.7 fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} - fast-redact@3.3.0: {} + fast-redact@3.5.0: {} fast-safe-stringify@2.1.1: {} - fastq@1.16.0: + fastq@1.17.1: dependencies: reusify: 1.0.4 @@ -11951,7 +11696,7 @@ snapshots: dependencies: node-fetch: 1.7.3 - ffjavascript@0.2.62: + ffjavascript@0.2.63: dependencies: wasmbuilder: 0.0.16 wasmcurves: 0.2.2 @@ -11972,7 +11717,7 @@ snapshots: repeat-string: 1.6.1 to-regex-range: 2.1.1 - fill-range@7.0.1: + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -12024,7 +11769,7 @@ snapshots: find-yarn-workspace-root2@1.2.16: dependencies: - micromatch: 4.0.5 + micromatch: 4.0.7 pkg-dir: 4.2.0 find-yarn-workspace-root@1.2.1: @@ -12036,18 +11781,18 @@ snapshots: find-yarn-workspace-root@2.0.0: dependencies: - micromatch: 4.0.5 + micromatch: 4.0.7 findup-sync@5.0.0: dependencies: detect-file: 1.0.0 is-glob: 4.0.3 - micromatch: 4.0.5 + micromatch: 4.0.7 resolve-dir: 1.0.1 flat-cache@3.2.0: dependencies: - flatted: 3.2.9 + flatted: 3.3.1 keyv: 4.5.4 rimraf: 3.0.2 @@ -12055,7 +11800,7 @@ snapshots: flatstr@1.0.12: {} - flatted@3.2.9: {} + flatted@3.3.1: {} flow-stoplight@1.0.0: {} @@ -12063,9 +11808,9 @@ snapshots: dependencies: imul: 1.0.1 - follow-redirects@1.15.3(debug@4.3.4): - dependencies: - debug: 4.3.4(supports-color@8.1.1) + follow-redirects@1.15.6(debug@4.3.5): + optionalDependencies: + debug: 4.3.5 for-each@0.3.3: dependencies: @@ -12078,7 +11823,7 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 3.0.7 - foreground-child@3.1.1: + foreground-child@3.2.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 @@ -12106,7 +11851,7 @@ snapshots: dezalgo: 1.0.4 hexoid: 1.0.0 once: 1.4.0 - qs: 6.11.2 + qs: 6.12.1 forwarded@0.2.0: {} @@ -12185,16 +11930,16 @@ snapshots: function.prototype.name@1.1.6: dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.23.3 functions-have-names: 1.2.3 functional-red-black-tree@1.0.1: {} functions-have-names@1.2.3: {} - ganache-core@2.13.2: + ganache-core@2.13.2(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10): dependencies: abstract-leveldown: 3.0.0 async: 2.6.2 @@ -12221,11 +11966,11 @@ snapshots: seedrandom: 3.0.1 source-map-support: 0.5.12 tmp: 0.1.0 - web3-provider-engine: 14.2.1 + web3-provider-engine: 14.2.1(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) websocket: 1.0.32 optionalDependencies: ethereumjs-wallet: 0.6.5 - web3: 1.2.11 + web3: 1.2.11(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - bufferutil - encoding @@ -12242,12 +11987,13 @@ snapshots: get-func-name@2.0.2: {} - get-intrinsic@1.2.2: + get-intrinsic@1.2.4: dependencies: + es-errors: 1.3.0 function-bind: 1.1.2 - has-proto: 1.0.1 + has-proto: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.0 + hasown: 2.0.2 get-package-type@0.1.0: {} @@ -12262,12 +12008,13 @@ snapshots: get-stream@8.0.1: {} - get-symbol-description@1.0.0: + get-symbol-description@1.0.2: dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 - get-tsconfig@4.7.2: + get-tsconfig@4.7.5: dependencies: resolve-pkg-maps: 1.0.0 @@ -12285,13 +12032,14 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.3.10: + glob@10.4.2: dependencies: - foreground-child: 3.1.1 - jackspeak: 2.3.6 - minimatch: 9.0.3 - minipass: 5.0.0 - path-scurry: 1.10.1 + foreground-child: 3.2.1 + jackspeak: 3.4.0 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 glob@7.1.7: dependencies: @@ -12355,22 +12103,23 @@ snapshots: globals@9.18.0: {} - globalthis@1.0.3: + globalthis@1.0.4: dependencies: define-properties: 1.2.1 + gopd: 1.0.1 globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.2 - ignore: 5.3.0 + ignore: 5.3.1 merge2: 1.4.1 slash: 3.0.0 gopd@1.0.1: dependencies: - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 got@11.8.6: dependencies: @@ -12406,8 +12155,6 @@ snapshots: graceful-fs@4.2.11: {} - grapheme-splitter@1.0.4: {} - graphemer@1.4.0: {} har-schema@2.0.0: {} @@ -12417,9 +12164,7 @@ snapshots: ajv: 6.12.6 har-schema: 2.0.0 - hard-rejection@2.1.0: {} - - hardhat-deploy@0.11.45: + hardhat-deploy@0.11.45(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-signer': 5.7.0 @@ -12428,110 +12173,48 @@ snapshots: '@ethersproject/bytes': 5.7.0 '@ethersproject/constants': 5.7.0 '@ethersproject/contracts': 5.7.0 - '@ethersproject/providers': 5.7.2 + '@ethersproject/providers': 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@ethersproject/solidity': 5.7.0 '@ethersproject/transactions': 5.7.0 '@ethersproject/wallet': 5.7.0 - '@types/qs': 6.9.10 - axios: 0.21.4(debug@4.3.4) + '@types/qs': 6.9.15 + axios: 0.21.4(debug@4.3.5) chalk: 4.1.2 - chokidar: 3.5.3 - debug: 4.3.4(supports-color@8.1.1) + chokidar: 3.6.0 + debug: 4.3.5 enquirer: 2.4.1 - ethers: 5.7.2 + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) form-data: 4.0.0 fs-extra: 10.1.0 match-all: 1.2.6 murmur-128: 0.2.1 - qs: 6.11.2 - zksync-web3: 0.14.4(ethers@5.7.2) - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - hardhat@2.19.2(ts-node@10.9.2)(typescript@4.9.5): - dependencies: - '@ethersproject/abi': 5.7.0 - '@metamask/eth-sig-util': 4.0.1 - '@nomicfoundation/ethereumjs-block': 5.0.2 - '@nomicfoundation/ethereumjs-blockchain': 7.0.2 - '@nomicfoundation/ethereumjs-common': 4.0.2 - '@nomicfoundation/ethereumjs-evm': 2.0.2 - '@nomicfoundation/ethereumjs-rlp': 5.0.2 - '@nomicfoundation/ethereumjs-statemanager': 2.0.2 - '@nomicfoundation/ethereumjs-trie': 6.0.2 - '@nomicfoundation/ethereumjs-tx': 5.0.2 - '@nomicfoundation/ethereumjs-util': 9.0.2 - '@nomicfoundation/ethereumjs-vm': 7.0.2 - '@nomicfoundation/solidity-analyzer': 0.1.1 - '@sentry/node': 5.30.0 - '@types/bn.js': 5.1.5 - '@types/lru-cache': 5.1.1 - adm-zip: 0.4.16 - aggregate-error: 3.1.0 - ansi-escapes: 4.3.2 - chalk: 2.4.2 - chokidar: 3.5.3 - ci-info: 2.0.0 - debug: 4.3.4(supports-color@8.1.1) - enquirer: 2.4.1 - env-paths: 2.2.1 - ethereum-cryptography: 1.2.0 - ethereumjs-abi: 0.6.8 - find-up: 2.1.0 - fp-ts: 1.19.3 - fs-extra: 7.0.1 - glob: 7.2.0 - immutable: 4.3.4 - io-ts: 1.10.4 - keccak: 3.0.4 - lodash: 4.17.21 - mnemonist: 0.38.5 - mocha: 10.2.0 - p-map: 4.0.0 - raw-body: 2.5.2 - resolve: 1.17.0 - semver: 6.3.1 - solc: 0.7.3(debug@4.3.4) - source-map-support: 0.5.21 - stacktrace-parser: 0.1.10 - ts-node: 10.9.2(@types/node@20.11.30)(typescript@4.9.5) - tsort: 0.0.1 - typescript: 4.9.5 - undici: 5.28.2 - uuid: 8.3.2 - ws: 7.5.9 + qs: 6.12.1 + zksync-web3: 0.14.4(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)) transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - hardhat@2.19.2(ts-node@10.9.2)(typescript@5.3.3): + hardhat@2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@4.9.5))(typescript@4.9.5)(utf-8-validate@5.0.10): dependencies: '@ethersproject/abi': 5.7.0 '@metamask/eth-sig-util': 4.0.1 - '@nomicfoundation/ethereumjs-block': 5.0.2 - '@nomicfoundation/ethereumjs-blockchain': 7.0.2 - '@nomicfoundation/ethereumjs-common': 4.0.2 - '@nomicfoundation/ethereumjs-evm': 2.0.2 - '@nomicfoundation/ethereumjs-rlp': 5.0.2 - '@nomicfoundation/ethereumjs-statemanager': 2.0.2 - '@nomicfoundation/ethereumjs-trie': 6.0.2 - '@nomicfoundation/ethereumjs-tx': 5.0.2 - '@nomicfoundation/ethereumjs-util': 9.0.2 - '@nomicfoundation/ethereumjs-vm': 7.0.2 - '@nomicfoundation/solidity-analyzer': 0.1.1 + '@nomicfoundation/edr': 0.4.0 + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-tx': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + '@nomicfoundation/solidity-analyzer': 0.1.2 '@sentry/node': 5.30.0 '@types/bn.js': 5.1.5 '@types/lru-cache': 5.1.1 adm-zip: 0.4.16 aggregate-error: 3.1.0 ansi-escapes: 4.3.2 + boxen: 5.1.2 chalk: 2.4.2 - chokidar: 3.5.3 + chokidar: 3.6.0 ci-info: 2.0.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -12540,55 +12223,52 @@ snapshots: fp-ts: 1.19.3 fs-extra: 7.0.1 glob: 7.2.0 - immutable: 4.3.4 + immutable: 4.3.6 io-ts: 1.10.4 keccak: 3.0.4 lodash: 4.17.21 mnemonist: 0.38.5 - mocha: 10.2.0 + mocha: 10.5.2 p-map: 4.0.0 raw-body: 2.5.2 resolve: 1.17.0 semver: 6.3.1 - solc: 0.7.3(debug@4.3.4) + solc: 0.7.3(debug@4.3.5) source-map-support: 0.5.21 stacktrace-parser: 0.1.10 - ts-node: 10.9.2(@types/node@20.11.30)(typescript@5.3.3) tsort: 0.0.1 - typescript: 5.3.3 - undici: 5.28.2 + undici: 5.28.4 uuid: 8.3.2 - ws: 7.5.9 + ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) + optionalDependencies: + ts-node: 10.9.2(@types/node@20.14.9)(typescript@4.9.5) + typescript: 4.9.5 transitivePeerDependencies: - bufferutil + - c-kzg - supports-color - utf-8-validate - hardhat@2.19.2(typescript@4.7.4): + hardhat@2.22.5(bufferutil@4.0.8)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.2))(typescript@5.5.2)(utf-8-validate@5.0.10): dependencies: '@ethersproject/abi': 5.7.0 '@metamask/eth-sig-util': 4.0.1 - '@nomicfoundation/ethereumjs-block': 5.0.2 - '@nomicfoundation/ethereumjs-blockchain': 7.0.2 - '@nomicfoundation/ethereumjs-common': 4.0.2 - '@nomicfoundation/ethereumjs-evm': 2.0.2 - '@nomicfoundation/ethereumjs-rlp': 5.0.2 - '@nomicfoundation/ethereumjs-statemanager': 2.0.2 - '@nomicfoundation/ethereumjs-trie': 6.0.2 - '@nomicfoundation/ethereumjs-tx': 5.0.2 - '@nomicfoundation/ethereumjs-util': 9.0.2 - '@nomicfoundation/ethereumjs-vm': 7.0.2 - '@nomicfoundation/solidity-analyzer': 0.1.1 + '@nomicfoundation/edr': 0.4.0 + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-tx': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + '@nomicfoundation/solidity-analyzer': 0.1.2 '@sentry/node': 5.30.0 '@types/bn.js': 5.1.5 '@types/lru-cache': 5.1.1 adm-zip: 0.4.16 aggregate-error: 3.1.0 ansi-escapes: 4.3.2 + boxen: 5.1.2 chalk: 2.4.2 - chokidar: 3.5.3 + chokidar: 3.6.0 ci-info: 2.0.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -12597,26 +12277,29 @@ snapshots: fp-ts: 1.19.3 fs-extra: 7.0.1 glob: 7.2.0 - immutable: 4.3.4 + immutable: 4.3.6 io-ts: 1.10.4 keccak: 3.0.4 lodash: 4.17.21 mnemonist: 0.38.5 - mocha: 10.2.0 + mocha: 10.5.2 p-map: 4.0.0 raw-body: 2.5.2 resolve: 1.17.0 semver: 6.3.1 - solc: 0.7.3(debug@4.3.4) + solc: 0.7.3(debug@4.3.5) source-map-support: 0.5.21 stacktrace-parser: 0.1.10 tsort: 0.0.1 - typescript: 4.7.4 - undici: 5.28.2 + undici: 5.28.4 uuid: 8.3.2 - ws: 7.5.9 + ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) + optionalDependencies: + ts-node: 10.9.2(@types/node@20.14.9)(typescript@5.5.2) + typescript: 5.5.2 transitivePeerDependencies: - bufferutil + - c-kzg - supports-color - utf-8-validate @@ -12632,15 +12315,15 @@ snapshots: has-flag@4.0.0: {} - has-property-descriptors@1.0.1: + has-property-descriptors@1.0.2: dependencies: - get-intrinsic: 1.2.2 + es-define-property: 1.0.0 - has-proto@1.0.1: {} + has-proto@1.0.3: {} has-symbols@1.0.3: {} - has-tostringtag@1.0.0: + has-tostringtag@1.0.2: dependencies: has-symbols: 1.0.3 @@ -12665,6 +12348,12 @@ snapshots: has@1.0.4: {} + hash-base@3.0.4: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + optional: true + hash-base@3.1.0: dependencies: inherits: 2.0.4 @@ -12681,7 +12370,7 @@ snapshots: is-stream: 2.0.1 type-fest: 0.8.1 - hasown@2.0.0: + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -12748,7 +12437,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 transitivePeerDependencies: - supports-color @@ -12772,13 +12461,13 @@ snapshots: ieee754@1.2.1: {} - ignore@5.3.0: {} + ignore@5.3.1: {} immediate@3.2.3: {} immediate@3.3.0: {} - immutable@4.3.4: {} + immutable@4.3.6: {} import-fresh@3.3.0: dependencies: @@ -12800,11 +12489,11 @@ snapshots: ini@1.3.8: {} - internal-slot@1.0.6: + internal-slot@1.0.7: dependencies: - get-intrinsic: 1.2.2 - hasown: 2.0.0 - side-channel: 1.0.4 + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 invariant@2.2.4: dependencies: @@ -12820,7 +12509,7 @@ snapshots: is-accessor-descriptor@1.0.1: dependencies: - hasown: 2.0.0 + hasown: 2.0.2 is-alphabetical@1.0.4: {} @@ -12831,20 +12520,19 @@ snapshots: is-arguments@1.1.1: dependencies: - call-bind: 1.0.5 - has-tostringtag: 1.0.0 + call-bind: 1.0.7 + has-tostringtag: 1.0.2 - is-array-buffer@3.0.2: + is-array-buffer@3.0.4: dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - is-typed-array: 1.1.12 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 is-arrayish@0.2.1: {} is-async-function@2.0.0: dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 is-bigint@1.0.4: dependencies: @@ -12852,12 +12540,12 @@ snapshots: is-binary-path@2.1.0: dependencies: - binary-extensions: 2.2.0 + binary-extensions: 2.3.0 is-boolean-object@1.1.2: dependencies: - call-bind: 1.0.5 - has-tostringtag: 1.0.0 + call-bind: 1.0.7 + has-tostringtag: 1.0.2 is-buffer@1.1.6: {} @@ -12873,17 +12561,21 @@ snapshots: dependencies: ci-info: 2.0.0 - is-core-module@2.13.1: + is-core-module@2.14.0: dependencies: - hasown: 2.0.0 + hasown: 2.0.2 is-data-descriptor@1.0.1: dependencies: - hasown: 2.0.0 + hasown: 2.0.2 + + is-data-view@1.0.1: + dependencies: + is-typed-array: 1.1.13 is-date-object@1.0.5: dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 is-decimal@1.0.4: {} @@ -12909,7 +12601,7 @@ snapshots: is-finalizationregistry@1.0.2: dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 is-finite@1.1.0: {} @@ -12931,7 +12623,7 @@ snapshots: is-generator-function@1.0.10: dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 is-glob@4.0.3: dependencies: @@ -12943,13 +12635,13 @@ snapshots: is-interactive@1.0.0: {} - is-map@2.0.2: {} + is-map@2.0.3: {} - is-negative-zero@2.0.2: {} + is-negative-zero@2.0.3: {} is-number-object@1.0.7: dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 is-number@3.0.0: dependencies: @@ -12959,8 +12651,6 @@ snapshots: is-path-inside@3.0.3: {} - is-plain-obj@1.1.0: {} - is-plain-obj@2.1.0: {} is-plain-object@2.0.4: @@ -12969,14 +12659,14 @@ snapshots: is-regex@1.1.4: dependencies: - call-bind: 1.0.5 - has-tostringtag: 1.0.0 + call-bind: 1.0.7 + has-tostringtag: 1.0.2 - is-set@2.0.2: {} + is-set@2.0.3: {} - is-shared-array-buffer@1.0.2: + is-shared-array-buffer@1.0.3: dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 is-stream@1.1.0: {} @@ -12986,7 +12676,7 @@ snapshots: is-string@1.0.7: dependencies: - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 is-subdir@1.2.0: dependencies: @@ -12996,9 +12686,9 @@ snapshots: dependencies: has-symbols: 1.0.3 - is-typed-array@1.1.12: + is-typed-array@1.1.13: dependencies: - which-typed-array: 1.1.13 + which-typed-array: 1.1.15 is-typedarray@1.0.0: {} @@ -13008,16 +12698,16 @@ snapshots: is-utf8@0.2.1: {} - is-weakmap@2.0.1: {} + is-weakmap@2.0.2: {} is-weakref@1.0.2: dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 - is-weakset@2.0.2: + is-weakset@2.0.3: dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 is-windows@1.0.2: {} @@ -13049,7 +12739,7 @@ snapshots: istanbul-lib-instrument@4.0.3: dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.24.7 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -13073,13 +12763,13 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: - supports-color - istanbul-reports@3.1.6: + istanbul-reports@3.1.7: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 @@ -13087,12 +12777,12 @@ snapshots: iterator.prototype@1.1.2: dependencies: define-properties: 1.2.1 - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.4 has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.4 - set-function-name: 2.0.1 + reflect.getprototypeof: 1.0.6 + set-function-name: 2.0.2 - jackspeak@2.3.6: + jackspeak@3.4.0: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: @@ -13109,8 +12799,6 @@ snapshots: joycon@3.1.1: {} - js-sdsl@4.4.2: {} - js-sha3@0.5.7: {} js-sha3@0.8.0: {} @@ -13149,7 +12837,7 @@ snapshots: json-rpc-engine@3.8.0: dependencies: - async: 2.6.4 + async: 2.6.2 babel-preset-env: 1.7.0 babelify: 7.3.0 json-rpc-error: 2.0.0 @@ -13172,9 +12860,9 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} - json-stable-stringify@1.1.0: + json-stable-stringify@1.1.1: dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 isarray: 2.0.5 jsonify: 0.0.1 object-keys: 1.1.1 @@ -13191,6 +12879,8 @@ snapshots: jsonc-parser@3.2.0: {} + jsonc-parser@3.3.1: {} + jsonfile@2.4.0: optionalDependencies: graceful-fs: 4.2.11 @@ -13216,15 +12906,15 @@ snapshots: jsx-ast-utils@3.3.5: dependencies: - array-includes: 3.1.7 + array-includes: 3.1.8 array.prototype.flat: 1.3.2 object.assign: 4.1.5 - object.values: 1.1.7 + object.values: 1.2.0 keccak@3.0.4: dependencies: node-addon-api: 2.0.2 - node-gyp-build: 4.7.1 + node-gyp-build: 4.8.1 readable-stream: 3.6.2 keyv@3.1.0: @@ -13254,8 +12944,6 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - kleur@4.1.5: {} - lcid@1.0.0: dependencies: invert-kv: 1.0.0 @@ -13320,13 +13008,6 @@ snapshots: typewiselite: 1.0.0 xtend: 4.0.2 - level-supports@4.0.1: {} - - level-transcoder@1.0.1: - dependencies: - buffer: 6.0.3 - module-error: 1.0.2 - level-ws@0.0.0: dependencies: readable-stream: 1.0.34 @@ -13338,11 +13019,6 @@ snapshots: readable-stream: 2.3.8 xtend: 4.0.2 - level@8.0.0: - dependencies: - browser-level: 1.0.1 - classic-level: 1.3.0 - levelup@1.3.9: dependencies: deferred-leveldown: 1.2.2 @@ -13392,7 +13068,7 @@ snapshots: colorette: 2.0.20 eventemitter3: 5.0.1 log-update: 6.0.0 - rfdc: 1.3.0 + rfdc: 1.4.1 wrap-ansi: 9.0.0 load-json-file@1.1.0: @@ -13450,7 +13126,7 @@ snapshots: log-update@6.0.0: dependencies: - ansi-escapes: 6.2.0 + ansi-escapes: 6.2.1 cli-cursor: 4.0.0 slice-ansi: 7.1.0 strip-ansi: 7.1.0 @@ -13476,7 +13152,7 @@ snapshots: lowercase-keys@2.0.0: optional: true - lru-cache@10.1.0: {} + lru-cache@10.3.0: {} lru-cache@3.2.0: dependencies: @@ -13491,10 +13167,6 @@ snapshots: dependencies: yallist: 3.1.1 - lru-cache@6.0.0: - dependencies: - yallist: 4.0.0 - lru_map@0.3.3: {} ltgt@2.1.3: {} @@ -13503,7 +13175,7 @@ snapshots: lunr@2.3.9: {} - magic-string@0.30.5: + magic-string@0.30.10: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 @@ -13513,14 +13185,12 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.5.4 + semver: 7.6.2 make-error@1.3.6: {} map-cache@0.2.2: {} - map-obj@1.0.1: {} - map-obj@4.3.0: {} map-visit@1.0.0: @@ -13547,8 +13217,6 @@ snapshots: match-all@1.2.6: {} - mcl-wasm@0.7.9: {} - md5.js@1.3.5: dependencies: hash-base: 3.1.0 @@ -13644,28 +13312,8 @@ snapshots: ltgt: 2.2.1 safe-buffer: 5.1.2 - memory-level@1.0.0: - dependencies: - abstract-level: 1.0.3 - functional-red-black-tree: 1.0.1 - module-error: 1.0.2 - memorystream@0.3.1: {} - meow@6.1.1: - dependencies: - '@types/minimist': 1.2.5 - camelcase-keys: 6.2.2 - decamelize-keys: 1.1.1 - hard-rejection: 2.1.0 - minimist-options: 4.1.0 - normalize-package-data: 2.5.0 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.13.1 - yargs-parser: 18.1.3 - merge-descriptors@1.0.1: {} merge-stream@2.0.0: {} @@ -13685,7 +13333,7 @@ snapshots: merkle-patricia-tree@3.0.0: dependencies: - async: 2.6.4 + async: 2.6.2 ethereumjs-util: 5.2.1 level-mem: 3.0.1 level-ws: 1.0.0 @@ -13746,7 +13394,7 @@ snapshots: micromark@2.11.4: dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 parse-entities: 2.0.0 transitivePeerDependencies: - supports-color @@ -13771,7 +13419,12 @@ snapshots: micromatch@4.0.5: dependencies: - braces: 3.0.2 + braces: 3.0.3 + picomatch: 2.3.1 + + micromatch@4.0.7: + dependencies: + braces: 3.0.3 picomatch: 2.3.1 miller-rabin@4.0.1: @@ -13829,11 +13482,9 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minimist-options@4.1.0: + minimatch@9.0.5: dependencies: - arrify: 1.0.1 - is-plain-obj: 1.1.0 - kind-of: 6.0.3 + brace-expansion: 2.0.1 minimist@1.2.8: {} @@ -13849,6 +13500,8 @@ snapshots: minipass@5.0.0: {} + minipass@7.1.2: {} + minizlib@1.3.3: dependencies: minipass: 2.9.0 @@ -13864,11 +13517,9 @@ snapshots: for-in: 1.0.2 is-extendable: 1.0.1 - mixme@0.5.10: {} - mkdirp-promise@5.0.1: dependencies: - mkdirp: 1.0.4 + mkdirp: 3.0.1 optional: true mkdirp@0.5.6: @@ -13877,26 +13528,28 @@ snapshots: mkdirp@1.0.4: {} + mkdirp@3.0.1: + optional: true + mnemonist@0.38.5: dependencies: obliterator: 2.0.4 - mocha@10.2.0: + mocha@10.5.2: dependencies: ansi-colors: 4.1.1 browser-stdout: 1.3.1 - chokidar: 3.5.3 + chokidar: 3.6.0 debug: 4.3.4(supports-color@8.1.1) diff: 5.0.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 - glob: 7.2.0 + glob: 8.1.0 he: 1.2.0 js-yaml: 4.1.0 log-symbols: 4.1.0 minimatch: 5.0.1 ms: 2.1.3 - nanoid: 3.3.3 serialize-javascript: 6.0.0 strip-json-comments: 3.1.1 supports-color: 8.1.1 @@ -13910,15 +13563,13 @@ snapshots: mock-property@1.0.3: dependencies: - define-data-property: 1.1.1 + define-data-property: 1.1.4 functions-have-names: 1.2.3 gopd: 1.0.1 - has-property-descriptors: 1.0.1 - hasown: 2.0.0 + has-property-descriptors: 1.0.2 + hasown: 2.0.2 isarray: 2.0.5 - module-error@1.0.2: {} - morgan@1.10.0: dependencies: basic-auth: 2.0.1 @@ -13929,6 +13580,8 @@ snapshots: transitivePeerDependencies: - supports-color + mri@1.2.0: {} + ms@2.0.0: {} ms@2.1.2: {} @@ -13984,8 +13637,6 @@ snapshots: nanoassert@2.0.0: {} - nanoid@3.3.3: {} - nanoid@3.3.7: {} nanomatch@1.2.13: @@ -14004,8 +13655,6 @@ snapshots: transitivePeerDependencies: - supports-color - napi-macros@2.2.2: {} - natural-compare-lite@1.4.0: {} natural-compare@1.4.0: {} @@ -14029,11 +13678,13 @@ snapshots: encoding: 0.1.13 is-stream: 1.1.0 - node-fetch@2.7.0: + node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 - node-gyp-build@4.7.1: {} + node-gyp-build@4.8.1: {} node-machine-id@1.1.12: {} @@ -14071,7 +13722,7 @@ snapshots: dependencies: path-key: 3.1.1 - npm-run-path@5.1.0: + npm-run-path@5.3.0: dependencies: path-key: 4.0.0 @@ -14082,17 +13733,17 @@ snapshots: bn.js: 4.11.6 strip-hex-prefix: 1.0.0 - nx-cloud@16.5.2: + nx-cloud@19.0.0: dependencies: - '@nrwl/nx-cloud': 16.5.2 - axios: 1.1.3 + '@nrwl/nx-cloud': 19.0.0 + axios: 1.7.2 chalk: 4.1.2 dotenv: 10.0.0 fs-extra: 11.2.0 node-machine-id: 1.1.12 open: 8.4.2 strip-json-comments: 3.1.1 - tar: 6.1.11 + tar: 6.2.1 yargs-parser: 21.1.1 transitivePeerDependencies: - debug @@ -14103,18 +13754,18 @@ snapshots: '@yarnpkg/lockfile': 1.1.0 '@yarnpkg/parsers': 3.0.0-rc.46 '@zkochan/js-yaml': 0.0.6 - axios: 1.6.2 + axios: 1.7.2 chalk: 4.1.2 cli-cursor: 3.1.0 cli-spinners: 2.6.1 cliui: 8.0.1 - dotenv: 16.3.1 + dotenv: 16.3.2 dotenv-expand: 10.0.0 enquirer: 2.3.6 figures: 3.2.0 flat: 5.0.2 fs-extra: 11.2.0 - ignore: 5.3.0 + ignore: 5.3.1 jest-diff: 29.7.0 js-yaml: 4.1.0 jsonc-parser: 3.2.0 @@ -14124,13 +13775,13 @@ snapshots: npm-run-path: 4.0.1 open: 8.4.2 ora: 5.3.0 - semver: 7.5.4 + semver: 7.6.2 string-width: 4.2.3 strong-log-transformer: 2.1.0 tar-stream: 2.2.0 - tmp: 0.2.1 + tmp: 0.2.3 tsconfig-paths: 4.2.0 - tslib: 2.6.2 + tslib: 2.6.3 yargs: 17.7.2 yargs-parser: 21.1.1 optionalDependencies: @@ -14165,7 +13816,7 @@ snapshots: istanbul-lib-processinfo: 2.0.3 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.6 + istanbul-reports: 3.1.7 make-dir: 3.1.0 node-preload: 0.2.1 p-map: 3.0.0 @@ -14191,11 +13842,11 @@ snapshots: object-inspect@1.12.3: {} - object-inspect@1.13.1: {} + object-inspect@1.13.2: {} - object-is@1.1.5: + object-is@1.1.6: dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 object-keys@0.4.0: {} @@ -14208,52 +13859,55 @@ snapshots: object.assign@4.1.5: dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 - object.entries@1.1.7: + object.entries@1.1.8: dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-object-atoms: 1.0.0 - object.fromentries@2.0.7: + object.fromentries@2.0.8: dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 - object.getownpropertydescriptors@2.1.7: + object.getownpropertydescriptors@2.1.8: dependencies: - array.prototype.reduce: 1.0.6 - call-bind: 1.0.5 + array.prototype.reduce: 1.0.7 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 - safe-array-concat: 1.0.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + gopd: 1.0.1 + safe-array-concat: 1.1.2 - object.groupby@1.0.1: + object.groupby@1.0.3: dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 - get-intrinsic: 1.2.2 + es-abstract: 1.23.3 - object.hasown@1.1.3: + object.hasown@1.1.4: dependencies: define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 object.pick@1.3.0: dependencies: isobject: 3.0.1 - object.values@1.1.7: + object.values@1.2.0: dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-object-atoms: 1.0.0 obliterator@2.0.4: {} @@ -14297,14 +13951,14 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 - optionator@0.9.3: + optionator@0.9.4: dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 + word-wrap: 1.2.5 ora@5.3.0: dependencies: @@ -14384,15 +14038,18 @@ snapshots: lodash.flattendeep: 4.4.0 release-zalgo: 1.0.0 + package-json-from-dist@1.0.0: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 - parse-asn1@5.1.6: + parse-asn1@5.1.7: dependencies: - asn1.js: 5.4.1 + asn1.js: 4.10.1 browserify-aes: 1.2.0 evp_bytestokey: 1.0.3 + hash-base: 3.0.4 pbkdf2: 3.1.2 safe-buffer: 5.2.1 optional: true @@ -14408,13 +14065,18 @@ snapshots: parse-headers@2.0.5: {} + parse-imports@2.1.0: + dependencies: + es-module-lexer: 1.5.4 + slashes: 3.0.12 + parse-json@2.2.0: dependencies: error-ex: 1.3.2 parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.24.7 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -14479,10 +14141,10 @@ snapshots: path-parse@1.0.7: {} - path-scurry@1.10.1: + path-scurry@1.11.1: dependencies: - lru-cache: 10.1.0 - minipass: 5.0.0 + lru-cache: 10.3.0 + minipass: 7.1.2 path-to-regexp@0.1.7: {} @@ -14506,7 +14168,7 @@ snapshots: performance-now@2.1.0: {} - picocolors@1.0.0: {} + picocolors@1.0.1: {} picomatch@2.3.1: {} @@ -14522,30 +14184,30 @@ snapshots: pinkie@2.0.4: {} - pino-abstract-transport@1.1.0: + pino-abstract-transport@1.2.0: dependencies: - readable-stream: 4.5.1 + readable-stream: 4.5.2 split2: 4.2.0 pino-multi-stream@5.3.0: dependencies: pino: 6.14.0 - pino-pretty@10.3.0: + pino-pretty@11.2.1: dependencies: colorette: 2.0.20 dateformat: 4.6.3 - fast-copy: 3.0.1 + fast-copy: 3.0.2 fast-safe-stringify: 2.1.1 help-me: 5.0.0 joycon: 3.1.1 minimist: 1.2.8 on-exit-leak-free: 2.1.2 - pino-abstract-transport: 1.1.0 + pino-abstract-transport: 1.2.0 pump: 3.0.0 - readable-stream: 4.5.1 + readable-stream: 4.5.2 secure-json-parse: 2.7.0 - sonic-boom: 3.7.0 + sonic-boom: 4.0.1 strip-json-comments: 3.1.1 pino-sentry@0.7.0: @@ -14560,11 +14222,11 @@ snapshots: pino-std-serializers@3.2.0: {} - pino-std-serializers@6.2.2: {} + pino-std-serializers@7.0.0: {} pino@6.14.0: dependencies: - fast-redact: 3.3.0 + fast-redact: 3.5.0 fast-safe-stringify: 2.1.1 flatstr: 1.0.12 pino-std-serializers: 3.2.0 @@ -14584,17 +14246,19 @@ snapshots: posix-character-classes@0.1.1: {} - postcss@8.4.32: + possible-typed-array-names@1.0.0: {} + + postcss@8.4.39: dependencies: nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.0.2 + picocolors: 1.0.1 + source-map-js: 1.2.0 postinstall-postinstall@2.1.0: {} precond@0.2.3: {} - preferred-pm@3.1.2: + preferred-pm@3.1.3: dependencies: find-up: 5.0.0 find-yarn-workspace-root2: 1.2.16 @@ -14610,12 +14274,12 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier-plugin-solidity@1.2.0(prettier@2.8.8): + prettier-plugin-solidity@1.3.1(prettier@2.8.8): dependencies: - '@solidity-parser/parser': 0.16.2 + '@solidity-parser/parser': 0.17.0 prettier: 2.8.8 - semver: 7.5.4 - solidity-comments-extractor: 0.0.7 + semver: 7.6.2 + solidity-comments-extractor: 0.0.8 prettier@2.8.8: {} @@ -14623,7 +14287,7 @@ snapshots: dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 - react-is: 18.2.0 + react-is: 18.3.1 private@0.1.8: {} @@ -14674,7 +14338,7 @@ snapshots: bn.js: 4.12.0 browserify-rsa: 4.1.0 create-hash: 1.2.0 - parse-asn1: 5.1.6 + parse-asn1: 5.1.7 randombytes: 2.1.0 safe-buffer: 5.2.1 optional: true @@ -14713,7 +14377,7 @@ snapshots: pumpify@2.0.1: dependencies: - duplexify: 4.1.2 + duplexify: 4.1.3 inherits: 2.0.4 pump: 3.0.0 @@ -14725,11 +14389,11 @@ snapshots: qs@6.11.0: dependencies: - side-channel: 1.0.4 + side-channel: 1.0.6 - qs@6.11.2: + qs@6.12.1: dependencies: - side-channel: 1.0.4 + side-channel: 1.0.6 qs@6.5.3: {} @@ -14744,8 +14408,6 @@ snapshots: quick-format-unescaped@4.0.4: {} - quick-lru@4.0.1: {} - quick-lru@5.1.1: {} randombytes@2.1.0: @@ -14760,13 +14422,6 @@ snapshots: range-parser@1.2.1: {} - raw-body@2.5.1: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - raw-body@2.5.2: dependencies: bytes: 3.1.2 @@ -14776,7 +14431,7 @@ snapshots: react-is@16.13.1: {} - react-is@18.2.0: {} + react-is@18.3.1: {} read-pkg-up@1.0.1: dependencies: @@ -14839,7 +14494,7 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 - readable-stream@4.5.1: + readable-stream@4.5.2: dependencies: abort-controller: 3.0.0 buffer: 6.0.3 @@ -14851,24 +14506,20 @@ snapshots: dependencies: picomatch: 2.3.1 - redent@3.0.0: - dependencies: - indent-string: 4.0.0 - strip-indent: 3.0.0 - redeyed@2.1.1: dependencies: esprima: 4.0.1 reduce-flatten@2.0.0: {} - reflect.getprototypeof@1.0.4: + reflect.getprototypeof@1.0.6: dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 - get-intrinsic: 1.2.2 - globalthis: 1.0.3 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + globalthis: 1.0.4 which-builtin-type: 1.1.3 regenerate@1.4.2: {} @@ -14890,11 +14541,12 @@ snapshots: regexp-tree@0.1.27: {} - regexp.prototype.flags@1.5.1: + regexp.prototype.flags@1.5.2: dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - set-function-name: 2.0.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 regexpp@3.2.0: {} @@ -14967,7 +14619,7 @@ snapshots: request@2.88.2: dependencies: aws-sign2: 0.7.0 - aws4: 1.12.0 + aws4: 1.13.0 caseless: 0.12.0 combined-stream: 1.0.8 extend: 3.0.2 @@ -15021,13 +14673,13 @@ snapshots: resolve@1.22.8: dependencies: - is-core-module: 2.13.1 + is-core-module: 2.14.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 resolve@2.0.0-next.5: dependencies: - is-core-module: 2.13.1 + is-core-module: 2.14.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -15055,7 +14707,7 @@ snapshots: reusify@1.0.4: {} - rfdc@1.3.0: {} + rfdc@1.4.1: {} rimraf@2.7.1: dependencies: @@ -15065,9 +14717,9 @@ snapshots: dependencies: glob: 7.2.3 - rimraf@5.0.5: + rimraf@5.0.7: dependencies: - glob: 10.3.10 + glob: 10.4.2 ripemd160@2.0.2: dependencies: @@ -15078,10 +14730,6 @@ snapshots: dependencies: bn.js: 5.2.1 - run-parallel-limit@1.1.0: - dependencies: - queue-microtask: 1.2.3 - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -15090,12 +14738,12 @@ snapshots: rxjs@7.8.1: dependencies: - tslib: 2.6.2 + tslib: 2.6.3 - safe-array-concat@1.0.1: + safe-array-concat@1.1.2: dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 has-symbols: 1.0.3 isarray: 2.0.5 @@ -15107,10 +14755,10 @@ snapshots: dependencies: events: 3.3.0 - safe-regex-test@1.0.0: + safe-regex-test@1.0.3: dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.7 + es-errors: 1.3.0 is-regex: 1.1.4 safe-regex@1.1.0: @@ -15128,9 +14776,9 @@ snapshots: secp256k1@4.0.3: dependencies: - elliptic: 6.5.4 + elliptic: 6.5.5 node-addon-api: 2.0.2 - node-gyp-build: 4.7.1 + node-gyp-build: 4.8.1 secure-json-parse@2.7.0: {} @@ -15146,13 +14794,7 @@ snapshots: semver@6.3.1: {} - semver@7.5.4: - dependencies: - lru-cache: 6.0.0 - - semver@7.6.0: - dependencies: - lru-cache: 6.0.0 + semver@7.6.2: {} send@0.18.0: dependencies: @@ -15189,7 +14831,7 @@ snapshots: dependencies: body-parser: 1.20.2 cors: 2.8.5 - express: 4.18.2 + express: 4.19.2 request: 2.88.2 xhr: 2.6.0 transitivePeerDependencies: @@ -15198,18 +14840,21 @@ snapshots: set-blocking@2.0.0: {} - set-function-length@1.1.1: + set-function-length@1.2.2: dependencies: - define-data-property: 1.1.1 - get-intrinsic: 1.2.2 + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 gopd: 1.0.1 - has-property-descriptors: 1.0.1 + has-property-descriptors: 1.0.2 - set-function-name@2.0.1: + set-function-name@2.0.2: dependencies: - define-data-property: 1.1.1 + define-data-property: 1.1.4 + es-errors: 1.3.0 functions-have-names: 1.2.3 - has-property-descriptors: 1.0.1 + has-property-descriptors: 1.0.2 set-immediate-shim@1.0.1: {} @@ -15243,15 +14888,16 @@ snapshots: shiki@0.10.1: dependencies: - jsonc-parser: 3.2.0 + jsonc-parser: 3.3.1 vscode-oniguruma: 1.7.0 vscode-textmate: 5.2.0 - side-channel@1.0.4: + side-channel@1.0.6: dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - object-inspect: 1.13.1 + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.2 signal-exit@3.0.7: {} @@ -15273,6 +14919,8 @@ snapshots: slash@3.0.0: {} + slashes@3.0.12: {} + slice-ansi@4.0.0: dependencies: ansi-styles: 4.3.0 @@ -15289,15 +14937,6 @@ snapshots: ansi-styles: 6.2.1 is-fullwidth-code-point: 5.0.0 - smartwrap@2.0.2: - dependencies: - array.prototype.flat: 1.3.2 - breakword: 1.0.6 - grapheme-splitter: 1.0.4 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - yargs: 15.4.1 - snapdragon-node@2.1.1: dependencies: define-property: 1.0.0 @@ -15340,11 +14979,11 @@ snapshots: semver: 5.7.2 tmp: 0.0.33 - solc@0.7.3(debug@4.3.4): + solc@0.7.3(debug@4.3.5): dependencies: command-exists: 1.2.9 commander: 3.0.2 - follow-redirects: 1.15.3(debug@4.3.4) + follow-redirects: 1.15.6(debug@4.3.5) fs-extra: 0.30.0 js-sha3: 0.8.0 memorystream: 0.3.1 @@ -15354,11 +14993,11 @@ snapshots: transitivePeerDependencies: - debug - solhint-plugin-prettier@0.0.5(prettier-plugin-solidity@1.2.0)(prettier@2.8.8): + solhint-plugin-prettier@0.0.5(prettier-plugin-solidity@1.3.1(prettier@2.8.8))(prettier@2.8.8): dependencies: prettier: 2.8.8 prettier-linter-helpers: 1.0.0 - prettier-plugin-solidity: 1.2.0(prettier@2.8.8) + prettier-plugin-solidity: 1.3.1(prettier@2.8.8) solhint@3.6.2(typescript@4.9.5): dependencies: @@ -15371,20 +15010,20 @@ snapshots: cosmiconfig: 8.3.6(typescript@4.9.5) fast-diff: 1.3.0 glob: 8.1.0 - ignore: 5.3.0 + ignore: 5.3.1 js-yaml: 4.1.0 lodash: 4.17.21 pluralize: 8.0.0 - semver: 7.5.4 + semver: 7.6.2 strip-ansi: 6.0.1 - table: 6.8.1 + table: 6.8.2 text-table: 0.2.0 optionalDependencies: prettier: 2.8.8 transitivePeerDependencies: - typescript - solidity-comments-extractor@0.0.7: {} + solidity-comments-extractor@0.0.8: {} sonic-boom@1.4.1: dependencies: @@ -15395,11 +15034,11 @@ snapshots: dependencies: atomic-sleep: 1.0.0 - sonic-boom@3.7.0: + sonic-boom@4.0.1: dependencies: atomic-sleep: 1.0.0 - source-map-js@1.0.2: {} + source-map-js@1.2.0: {} source-map-resolve@0.5.3: dependencies: @@ -15446,21 +15085,21 @@ snapshots: spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.16 + spdx-license-ids: 3.0.18 - spdx-exceptions@2.3.0: {} + spdx-exceptions@2.5.0: {} spdx-expression-parse@3.0.1: dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.16 + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.18 spdx-expression-parse@4.0.0: dependencies: - spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.16 + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.18 - spdx-license-ids@3.0.16: {} + spdx-license-ids@3.0.18: {} split-string@3.1.0: dependencies: @@ -15499,17 +15138,13 @@ snapshots: stealthy-require@1.1.1: {} - stream-shift@1.0.1: {} + stream-shift@1.0.3: {} stream-to-pull-stream@1.7.3: dependencies: looper: 3.0.0 pull-stream: 3.7.0 - stream-transform@2.1.3: - dependencies: - mixme: 0.5.10 - strict-uri-encode@1.1.0: optional: true @@ -15535,41 +15170,45 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - string-width@7.0.0: + string-width@7.2.0: dependencies: emoji-regex: 10.3.0 get-east-asian-width: 1.2.0 strip-ansi: 7.1.0 - string.prototype.matchall@4.0.10: + string.prototype.matchall@4.0.11: dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 - get-intrinsic: 1.2.2 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + gopd: 1.0.1 has-symbols: 1.0.3 - internal-slot: 1.0.6 - regexp.prototype.flags: 1.5.1 - set-function-name: 2.0.1 - side-channel: 1.0.4 + internal-slot: 1.0.7 + regexp.prototype.flags: 1.5.2 + set-function-name: 2.0.2 + side-channel: 1.0.6 - string.prototype.trim@1.2.8: + string.prototype.trim@1.2.9: dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 - string.prototype.trimend@1.0.7: + string.prototype.trimend@1.0.8: dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-object-atoms: 1.0.0 - string.prototype.trimstart@1.0.7: + string.prototype.trimstart@1.0.8: dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.22.3 + es-object-atoms: 1.0.0 string_decoder@0.10.31: {} @@ -15625,18 +15264,18 @@ snapshots: dependencies: component-emitter: 1.3.1 cookiejar: 2.1.4 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 fast-safe-stringify: 2.1.1 form-data: 4.0.0 formidable: 2.1.2 methods: 1.1.2 mime: 2.6.0 - qs: 6.11.2 - semver: 7.5.4 + qs: 6.12.1 + semver: 7.6.2 transitivePeerDependencies: - supports-color - supertest@6.3.3: + supertest@6.3.4: dependencies: methods: 1.1.2 superagent: 8.1.2 @@ -15664,11 +15303,11 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - swarm-js@0.1.42: + swarm-js@0.1.42(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: bluebird: 3.7.2 buffer: 5.7.1 - eth-lib: 0.1.29 + eth-lib: 0.1.29(bufferutil@4.0.8)(utf-8-validate@5.0.10) fs-extra: 4.0.3 got: 11.8.6 mime-types: 2.1.35 @@ -15683,6 +15322,11 @@ snapshots: - utf-8-validate optional: true + synckit@0.9.0: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.6.3 + table-layout@1.0.2: dependencies: array-back: 4.0.2 @@ -15690,9 +15334,9 @@ snapshots: typical: 5.2.0 wordwrapjs: 4.0.1 - table@6.8.1: + table@6.8.2: dependencies: - ajv: 8.12.0 + ajv: 8.16.0 lodash.truncate: 4.4.2 slice-ansi: 4.0.0 string-width: 4.2.3 @@ -15703,8 +15347,8 @@ snapshots: tape@4.17.0: dependencies: '@ljharb/resumer': 0.0.1 - '@ljharb/through': 2.3.11 - call-bind: 1.0.5 + '@ljharb/through': 2.3.13 + call-bind: 1.0.7 deep-equal: 1.1.2 defined: 1.0.1 dotignore: 0.1.2 @@ -15717,7 +15361,7 @@ snapshots: mock-property: 1.0.3 object-inspect: 1.12.3 resolve: 1.22.8 - string.prototype.trim: 1.2.8 + string.prototype.trim: 1.2.9 tar-stream@2.2.0: dependencies: @@ -15738,11 +15382,11 @@ snapshots: yallist: 3.1.1 optional: true - tar@6.1.11: + tar@6.2.1: dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 - minipass: 3.3.6 + minipass: 5.0.0 minizlib: 2.1.2 mkdirp: 1.0.4 yallist: 4.0.0 @@ -15791,9 +15435,7 @@ snapshots: dependencies: rimraf: 2.7.1 - tmp@0.2.1: - dependencies: - rimraf: 3.0.2 + tmp@0.2.3: {} to-fast-properties@1.0.3: {} @@ -15831,9 +15473,11 @@ snapshots: tr46@0.0.3: {} - traverse@0.6.7: {} - - trim-newlines@3.0.1: {} + traverse@0.6.9: + dependencies: + gopd: 1.0.1 + typedarray.prototype.slice: 1.0.3 + which-typed-array: 1.1.15 trim-right@1.0.1: {} @@ -15841,9 +15485,9 @@ snapshots: true-case-path@2.2.1: {} - ts-api-utils@1.0.3(typescript@5.3.3): + ts-api-utils@1.3.0(typescript@5.5.2): dependencies: - typescript: 5.3.3 + typescript: 5.5.2 ts-command-line-args@2.5.1: dependencies: @@ -15854,14 +15498,14 @@ snapshots: ts-essentials@1.0.4: {} - ts-essentials@6.0.7(typescript@4.7.4): - dependencies: - typescript: 4.7.4 - ts-essentials@6.0.7(typescript@4.9.5): dependencies: typescript: 4.9.5 + ts-essentials@6.0.7(typescript@5.5.2): + dependencies: + typescript: 5.5.2 + ts-essentials@7.0.3(typescript@4.9.5): dependencies: typescript: 4.9.5 @@ -15880,23 +15524,23 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-mocha@10.0.0(mocha@10.2.0): + ts-mocha@10.0.0(mocha@10.5.2): dependencies: - mocha: 10.2.0 + mocha: 10.5.2 ts-node: 7.0.1 optionalDependencies: tsconfig-paths: 3.15.0 - ts-node@10.9.2(@types/node@20.11.30)(typescript@4.9.5): + ts-node@10.9.2(@types/node@20.14.9)(typescript@4.9.5): dependencies: '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 + '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.11.30 - acorn: 8.11.2 - acorn-walk: 8.3.1 + '@types/node': 20.14.9 + acorn: 8.12.0 + acorn-walk: 8.3.3 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 @@ -15905,21 +15549,21 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - ts-node@10.9.2(@types/node@20.11.30)(typescript@5.3.3): + ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.2): dependencies: '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 + '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.11.30 - acorn: 8.11.2 - acorn-walk: 8.3.1 + '@types/node': 20.14.9 + acorn: 8.12.0 + acorn-walk: 8.3.3 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.3.3 + typescript: 5.5.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 @@ -15934,13 +15578,13 @@ snapshots: source-map-support: 0.5.21 yn: 2.0.0 - ts-node@8.10.2(typescript@5.3.3): + ts-node@8.10.2(typescript@5.5.2): dependencies: arg: 4.1.3 diff: 4.0.2 make-error: 1.3.6 source-map-support: 0.5.21 - typescript: 5.3.3 + typescript: 5.5.2 yn: 3.1.1 tsconfig-paths@3.15.0: @@ -15960,7 +15604,7 @@ snapshots: tslib@2.3.1: {} - tslib@2.6.2: {} + tslib@2.6.3: {} tsort@0.0.1: {} @@ -15969,16 +15613,6 @@ snapshots: tslib: 1.14.1 typescript: 4.9.5 - tty-table@4.2.3: - dependencies: - chalk: 4.1.2 - csv: 5.5.3 - kleur: 4.1.5 - smartwrap: 2.0.2 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - yargs: 17.7.2 - tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 @@ -15995,8 +15629,6 @@ snapshots: type-detect@4.0.8: {} - type-fest@0.13.1: {} - type-fest@0.20.2: {} type-fest@0.21.3: {} @@ -16009,38 +15641,34 @@ snapshots: type-fest@1.4.0: {} - type-fest@3.13.1: {} - type-is@1.6.18: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 - type@1.2.0: {} + type@2.7.3: {} - type@2.7.2: {} - - typechain@3.0.0(typescript@4.7.4): + typechain@3.0.0(typescript@4.9.5): dependencies: command-line-args: 4.0.7 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 fs-extra: 7.0.1 js-sha3: 0.8.0 lodash: 4.17.21 - ts-essentials: 6.0.7(typescript@4.7.4) + ts-essentials: 6.0.7(typescript@4.9.5) ts-generator: 0.1.1 transitivePeerDependencies: - supports-color - typescript - typechain@3.0.0(typescript@4.9.5): + typechain@3.0.0(typescript@5.5.2): dependencies: command-line-args: 4.0.7 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 fs-extra: 7.0.1 js-sha3: 0.8.0 lodash: 4.17.21 - ts-essentials: 6.0.7(typescript@4.9.5) + ts-essentials: 6.0.7(typescript@5.5.2) ts-generator: 0.1.1 transitivePeerDependencies: - supports-color @@ -16049,7 +15677,7 @@ snapshots: typechain@8.3.2(typescript@4.9.5): dependencies: '@types/prettier': 2.7.3 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.5 fs-extra: 7.0.1 glob: 7.1.7 js-sha3: 0.8.0 @@ -16062,53 +15690,65 @@ snapshots: transitivePeerDependencies: - supports-color - typed-array-buffer@1.0.0: + typed-array-buffer@1.0.2: dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - is-typed-array: 1.1.12 + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 - typed-array-byte-length@1.0.0: + typed-array-byte-length@1.0.1: dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 - typed-array-byte-offset@1.0.0: + typed-array-byte-offset@1.0.2: dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 - typed-array-length@1.0.4: + typed-array-length@1.0.6: dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 for-each: 0.3.3 - is-typed-array: 1.1.12 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 typedarray-to-buffer@3.1.5: dependencies: is-typedarray: 1.0.0 + typedarray.prototype.slice@1.0.3: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + typed-array-buffer: 1.0.2 + typed-array-byte-offset: 1.0.2 + typedarray@0.0.6: {} - typedoc@0.22.18(typescript@4.7.4): + typedoc@0.22.18(typescript@5.5.2): dependencies: glob: 8.1.0 lunr: 2.3.9 marked: 4.3.0 minimatch: 5.1.6 shiki: 0.10.1 - typescript: 4.7.4 - - typescript@4.7.4: {} + typescript: 5.5.2 typescript@4.9.5: {} - typescript@5.3.3: {} + typescript@5.5.2: {} typewise-core@1.2.0: {} @@ -16129,7 +15769,7 @@ snapshots: unbox-primitive@1.0.2: dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 @@ -16141,9 +15781,9 @@ snapshots: undici-types@5.26.5: {} - undici@5.28.2: + undici@5.28.4: dependencies: - '@fastify/busboy': 2.1.0 + '@fastify/busboy': 2.1.1 unified@9.2.2: dependencies: @@ -16188,17 +15828,11 @@ snapshots: untildify@4.0.0: {} - update-browserslist-db@1.0.13(browserslist@4.22.2): - dependencies: - browserslist: 4.22.2 - escalade: 3.1.1 - picocolors: 1.0.0 - - update-browserslist-db@1.0.13(browserslist@4.23.0): + update-browserslist-db@1.0.16(browserslist@4.23.1): dependencies: - browserslist: 4.23.0 - escalade: 3.1.1 - picocolors: 1.0.0 + browserslist: 4.23.1 + escalade: 3.1.2 + picocolors: 1.0.1 update-section@0.3.3: {} @@ -16223,13 +15857,13 @@ snapshots: url@0.11.3: dependencies: punycode: 1.4.1 - qs: 6.11.2 + qs: 6.12.1 use@3.1.1: {} utf-8-validate@5.0.10: dependencies: - node-gyp-build: 4.7.1 + node-gyp-build: 4.8.1 utf8@3.0.0: {} @@ -16237,13 +15871,13 @@ snapshots: util.promisify@1.1.2: dependencies: - call-bind: 1.0.5 + call-bind: 1.0.7 define-properties: 1.2.1 for-each: 0.3.3 - has-proto: 1.0.1 + has-proto: 1.0.3 has-symbols: 1.0.3 - object.getownpropertydescriptors: 2.1.7 - safe-array-concat: 1.0.1 + object.getownpropertydescriptors: 2.1.8 + safe-array-concat: 1.1.2 utils-merge@1.0.1: {} @@ -16300,11 +15934,11 @@ snapshots: web-worker@1.2.0: {} - web3-bzz@1.2.11: + web3-bzz@1.2.11(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: '@types/node': 12.20.55 got: 9.6.0 - swarm-js: 0.1.42 + swarm-js: 0.1.42(bufferutil@4.0.8)(utf-8-validate@5.0.10) underscore: 1.9.1 transitivePeerDependencies: - bufferutil @@ -16465,26 +16099,26 @@ snapshots: - supports-color optional: true - web3-provider-engine@14.2.1: + web3-provider-engine@14.2.1(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10): dependencies: - async: 2.6.4 + async: 2.6.2 backoff: 2.5.0 clone: 2.1.2 - cross-fetch: 2.2.6 + cross-fetch: 2.2.6(encoding@0.1.13) eth-block-tracker: 3.0.1 - eth-json-rpc-infura: 3.2.1 + eth-json-rpc-infura: 3.2.1(encoding@0.1.13) eth-sig-util: 1.4.2 ethereumjs-block: 1.7.1 ethereumjs-tx: 1.3.7 ethereumjs-util: 5.2.1 ethereumjs-vm: 2.6.0 json-rpc-error: 2.0.0 - json-stable-stringify: 1.1.0 + json-stable-stringify: 1.1.1 promise-to-callback: 1.0.0 readable-stream: 2.3.8 request: 2.88.2 semaphore: 1.1.0 - ws: 5.2.3 + ws: 5.2.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) xhr: 2.6.0 xtend: 4.0.2 transitivePeerDependencies: @@ -16526,12 +16160,12 @@ snapshots: - supports-color optional: true - web3-utils@1.10.3: + web3-utils@1.10.4: dependencies: '@ethereumjs/util': 8.1.0 bn.js: 5.2.1 - ethereum-bloom-filters: 1.0.10 - ethereum-cryptography: 2.1.2 + ethereum-bloom-filters: 1.1.0 + ethereum-cryptography: 2.2.0 ethjs-unit: 0.1.6 number-to-bn: 1.7.0 randombytes: 2.1.0 @@ -16541,7 +16175,7 @@ snapshots: dependencies: bn.js: 4.12.0 eth-lib: 0.2.8 - ethereum-bloom-filters: 1.0.10 + ethereum-bloom-filters: 1.1.0 ethjs-unit: 0.1.6 number-to-bn: 1.7.0 randombytes: 2.1.0 @@ -16549,9 +16183,9 @@ snapshots: utf8: 3.0.0 optional: true - web3@1.2.11: + web3@1.2.11(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: - web3-bzz: 1.2.11 + web3-bzz: 1.2.11(bufferutil@4.0.8)(utf-8-validate@5.0.10) web3-core: 1.2.11 web3-eth: 1.2.11 web3-eth-personal: 1.2.11 @@ -16570,7 +16204,7 @@ snapshots: dependencies: bufferutil: 4.0.8 debug: 2.6.9 - es5-ext: 0.10.62 + es5-ext: 0.10.64 typedarray-to-buffer: 3.1.5 utf-8-validate: 5.0.10 yaeti: 0.0.6 @@ -16595,7 +16229,7 @@ snapshots: which-builtin-type@1.1.3: dependencies: function.prototype.name: 1.1.6 - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 is-async-function: 2.0.0 is-date-object: 1.0.5 is-finalizationregistry: 1.0.2 @@ -16604,15 +16238,15 @@ snapshots: is-weakref: 1.0.2 isarray: 2.0.5 which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.13 + which-collection: 1.0.2 + which-typed-array: 1.1.15 - which-collection@1.0.1: + which-collection@1.0.2: dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.2 + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.3 which-module@1.0.0: {} @@ -16623,13 +16257,13 @@ snapshots: load-yaml-file: 0.2.0 path-exists: 4.0.0 - which-typed-array@1.1.13: + which-typed-array@1.1.15: dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 - has-tostringtag: 1.0.0 + has-tostringtag: 1.0.2 which@1.3.1: dependencies: @@ -16639,8 +16273,14 @@ snapshots: dependencies: isexe: 2.0.0 + widest-line@3.1.0: + dependencies: + string-width: 4.2.3 + window-size@0.2.0: {} + word-wrap@1.2.5: {} + wordwrapjs@4.0.1: dependencies: reduce-flatten: 2.0.0 @@ -16674,7 +16314,7 @@ snapshots: wrap-ansi@9.0.0: dependencies: ansi-styles: 6.2.1 - string-width: 7.0.0 + string-width: 7.2.0 strip-ansi: 7.1.0 wrappy@1.0.2: {} @@ -16686,20 +16326,32 @@ snapshots: signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 - ws@3.3.3: + ws@3.3.3(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: async-limiter: 1.0.1 safe-buffer: 5.1.2 ultron: 1.1.1 + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 optional: true - ws@5.2.3: + ws@5.2.4(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: async-limiter: 1.0.1 + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 - ws@7.4.6: {} + ws@7.4.6(bufferutil@4.0.8)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 - ws@7.5.9: {} + ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 xhr-request-promise@0.1.3: dependencies: @@ -16765,8 +16417,6 @@ snapshots: yargs-parser@20.2.4: {} - yargs-parser@20.2.9: {} - yargs-parser@21.1.1: {} yargs-unparser@2.0.0: @@ -16793,17 +16443,17 @@ snapshots: yargs@16.2.0: dependencies: cliui: 7.0.4 - escalade: 3.1.1 + escalade: 3.1.2 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 y18n: 5.0.8 - yargs-parser: 20.2.9 + yargs-parser: 20.2.4 yargs@17.7.2: dependencies: cliui: 8.0.1 - escalade: 3.1.1 + escalade: 3.1.2 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 @@ -16833,8 +16483,8 @@ snapshots: yocto-queue@0.1.0: {} - zksync-web3@0.14.4(ethers@5.7.2): + zksync-web3@0.14.4(ethers@5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)): dependencies: - ethers: 5.7.2 + ethers: 5.7.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) zwitch@1.0.5: {}